Ale*_*nov 9 osgi blueprint-osgi
在blueprint.xml
,我用这种方式声明一个可选的依赖:
<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>
Run Code Online (Sandbox Code Playgroud)
在RepositoryImpl
,我有
public void setRepositoryListener(RepositoryListener repositoryListener) {
logger.info("Repository listener set");
this.repositoryListener = repositoryListener;
}
Run Code Online (Sandbox Code Playgroud)
即使没有RepositoryListener
可用的服务,Blueprint也会调用此方法,如预期的那样.问题是,我怎么能后检查是否存在是一个服务?
if (repositoryListener != null) {
repositoryListener.notifyDelete(node);
} else {
logger.warn("No repository listener set!");
}
Run Code Online (Sandbox Code Playgroud)
不起作用,因为repositoryListener
不是null
,但是蓝图代理.
Hol*_*ins 16
有三种选择.
ServiceUnavailableException
.因此,一种选择是设置非常短的蓝图超时,并捕获ServiceUnavailableException. 要设置较短的超时,只需在可选服务引用中添加一个属性:
<reference
id="someReference"
interface="org.some.service.ServiceInterface"
availability="optional"
timeout="100" />
Run Code Online (Sandbox Code Playgroud)
要使用引用侦听器,您需要在蓝图xml中添加以下内容(在Enterprise OSGi in Action的第6章中有更详细的示例和讨论):
<reference
id="someReference"
interface="org.some.service.ServiceInterface">
<reference-listener
ref="someBean"
bind-method="bind"
unbind-method="unbind" />
</reference>
Run Code Online (Sandbox Code Playgroud)
该bind
和unbind
方法被称为服务出现和消失(或服务得到添加和删除您参考列表,如果你使用的参考列表).
使用引用列表并不需要代码示例 - 只需使用一个<reference-list
元素并确保您的setter方法采用List.
归档时间: |
|
查看次数: |
3645 次 |
最近记录: |