2012-05-29 16 views
8

Trong blueprint.xml, tôi tuyên bố một sự phụ thuộc tùy chọn theo cách này:Kế hoạch chi tiết: làm cách nào để kiểm tra xem liệu phụ thuộc tùy chọn có được thỏa mãn không?

<reference id="RepositoryListener" 
    interface="ru.focusmedia.odp.server.datastore.api.RepositoryListener" 
    availability="optional" /> 

<bean id="Repository" 
    class="ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl"> 
    <jpa:context property="entityManager" unitname="ODP_Server" /> 
    <tx:transaction method="*" value="Required" /> 
    <property name="repositoryListener" ref="RepositoryListener" /> 
</bean> 

và trong RepositoryImpl, tôi có

public void setRepositoryListener(RepositoryListener repositoryListener) { 
    logger.info("Repository listener set"); 
    this.repositoryListener = repositoryListener; 
} 

Phương pháp này được gọi bằng Blueprint ngay cả khi không có dịch vụ RepositoryListener sẵn, như mong đợi . Vấn đề là, làm thế nào tôi có thể kiểm tra sau liệu có một dịch vụ không?

if (repositoryListener != null) { 
     repositoryListener.notifyDelete(node); 
    } else { 
     logger.warn("No repository listener set!"); 
    } 

không làm việc, kể từ repositoryListener không phải là null, nhưng một proxy Blueprint.

+1

Kiến thức hạn chế về phía tôi, nhưng có cái gì đó gọi là có thể được chỉ định cho và có thể được liên kết với bean 'Repository' của bạn. –

Trả lời

14

Có ba tùy chọn.

  • Thông thường, nếu cố gắng và sử dụng (thiếu) dịch vụ tùy chọn, bạn sẽ nhận được một sự chậm trễ năm phút trong khi kế hoạch chi tiết đợi cho một dịch vụ hậu thuẫn xuất hiện, tiếp theo là một ServiceUnavailableException. Vì vậy, một tùy chọn là đặt thời gian chờ bản thiết kế rất ngắn và bắt được ServiceUnavailableException.
  • Tùy chọn rõ ràng hơn là sử dụng trình nghe tham chiếu để giám sát vòng đời của dịch vụ. Điều này có bất lợi khi cần thêm mã.
  • Tùy chọn đơn giản - và vì thế lười nhất - tất cả là sử dụng danh sách tham chiếu tùy chọn thay vì tham chiếu tùy chọn. Nếu không có dịch vụ thỏa mãn, danh sách sẽ trống. Tất nhiên, bạn sẽ phải suy nghĩ về những gì bạn muốn xảy ra nếu nhiều dịch vụ thỏa mãn có mặt.

Để thiết lập một thời gian chờ ngắn hơn, chỉ cần thêm một thuộc tính để tham khảo dịch vụ tùy chọn của bạn:

<reference 
    id="someReference" 
    interface="org.some.service.ServiceInterface" 
    availability="optional" 
    timeout="100" /> 

Để sử dụng một người biết lắng nghe tham khảo, bạn muốn thêm một cái gì đó như sau để xml kế hoạch chi tiết của bạn (có một Ví dụ chi tiết và thảo luận trong chương 6 của Enterprise OSGi in Action):

<reference 
     id="someReference" 
     interface="org.some.service.ServiceInterface"> 
     <reference-listener 
      ref="someBean" 
      bind-method="bind" 
      unbind-method="unbind" /> 
    </reference> 

các bindunbind phương pháp được gọi là dịch vụ của bạn sẽ xuất hiện và biến mất (hoặc khi các dịch vụ được thêm và xóa vào danh sách tham chiếu của bạn, nếu bạn đang sử dụng danh sách tham chiếu).

Sử dụng danh sách tham chiếu không thực sự cần ví dụ về mã - chỉ cần sử dụng phần tử <reference-list và đảm bảo phương thức setter của bạn có Danh sách.

+0

Vâng, tôi cũng đã nghĩ về phiên bản thứ ba. Có lẽ là lựa chọn tốt nhất cho tôi. –

Các vấn đề liên quan