【问题标题】:Service reference in OSGi/blueprint not working properlyOSGi/蓝图中的服务参考不能正常工作
【发布时间】:2011-03-17 18:16:54
【问题描述】:

我目前有两个 OSGi 包(bundle1bundle2)都通过 EBA 中的蓝图公开服务。在bundle2blueprint.xml 中,我想从bundle1 引用一个服务并将其注入 到BuildService(下面的代码)中,因为BuildService 将用于调用TicketService。然而,这会导致超时异常(也在下面)。似乎 BuildService 永远不会在 OSGi 中注册。我该如何做这样的事情?

blueprint.xmlbundle1

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:bptx="http://aries.apache.org/xmlns/transactions/v1.0.0">

    <bean id="TicketServiceBean" class="com.example.b2.impl.TicketServiceImpl">
        <bptx:transaction value="Required" method="*" />
    </bean>

        <service ranking="0" id="TicketService" interface="com.example.b2.service.TicketService" ref="TicketServiceBean">
        <service-properties>
            <entry key="service.exported.interfaces" value="*" />
        </service-properties>
    </service>  

</blueprint>

blueprint.xmlbundle2

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">

    <bean 
        id="BuildServiceImplBean"
        class="com.example.b1.impl.BuildServiceImpl" 
        activation="eager" >
        <property name="ticketService" ref="TicketServiceRef" />
    </bean>  


    <service    
        id="BuildService" 
        ref="BuildServiceImplBean"
        interface="com.example.b1.service.BuildService"
        activation="eager"> 

        <service-properties>
            <entry key="service.exported.interfaces" value="*" />
        </service-properties>

    </service>



    <reference 
        id="TicketServiceRef" 
        interface="com.example.b2.service.TicketService" 
        availability="mandatory"
        activation="eager" />


</blueprint>

BuildService 的实现:

public class BuildServiceImpl implements BuildService {

    private TicketService ticketService;

    @Override
    public TicketBuildResponse ticketBuild(TicketBuildRequest ticketBuildRequest) throws BuildServiceException {

        //do stuff here
    }



    public TicketService getTicketService() {
        return ticketService;
    }

    public void setTicketService(TicketService ticketService) {
        this.ticketService = ticketService;
    }


}

启动应用程序服务器(Websphere)时出现以下异常:

  BlueprintCont E org.apache.aries.blueprint.container.BlueprintContainerImpl$1 run Unable to start blueprint container for bundle com.example.b1.module due to unresolved dependencies [(objectClass=com.example.b2.service.TicketService)]
                                     java.util.concurrent.TimeoutException
        at org.apache.aries.blueprint.container.BlueprintContainerImpl$1.run(BlueprintContainerImpl.java:273)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:453)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:315)
        at java.util.concurrent.FutureTask.run(FutureTask.java:150)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:98)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:207)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
        at java.lang.Thread.run(Thread.java:736)

【问题讨论】:

  • Websphere 是否允许您访问 OSGi 控制台,以便您可以列出部署的捆绑包?另外,您如何部署捆绑包?在 WAB 中?
  • 应用程序部署在 EBA 中。 Websphere 确实有一个控制台,您可以在其中查看已部署的工件,但它只允许您查看 eba,而不是深入了解它包含的内容。 RAD 中还有一个 Servers 选项卡,您可以在该选项卡下查看该服务器实例上部署的内容。一切看起来都很好,而且似乎应用程序及其所有捆绑包都已正确部署。
  • 同样,如果您能够访问 OSGi 控制台,您可以运行“services”命令来查看服务是否已注册。如果它已注册但 bundle2 仍然无法获取它,那么您可能遇到接口兼容性问题...确保只有一个 TicketService 接口副本,并且 bundle1 和 bundle2 从同一个地方导入它。跨度>

标签: java osgi blueprint


【解决方案1】:

这里是解决方案:OSGi 应用程序运行时处理远程服务与本地服务不同,因为不同的默认调用语义(本地传递引用与远程传递值)。为了防止应用程序意外调用仅为按值传递调用设计的导出服务,它对本地查找隐藏。

解决方案是导出同一个 bean 两次,一次用于远程调用,第二次用于本地调用。换句话说,您将添加另一个具有相同配置但没有service.exported.interfaces 属性的&lt;service /&gt; 元素。

<service ranking="0" id="TicketServiceExport" interface="com.example.b2.service.TicketService" ref="TicketServiceBean">
    <service-properties>
        <entry key="service.exported.interfaces" value="*" />
    </service-properties>
</service>  

<service ranking="0" id="TicketService" interface="com.example.b2.service.TicketService" ref="TicketServiceBean"/>

websphere 中其实也有一个 osgi 控制台,可以在[local websphere installation]/profiles/[profileName]/bin/osgiApplicationConsole.bat 下找到。启动后,help() 会为您提供命令列表。要查看从 SCA 导入的服务,您首先连接到您的应用程序(例如 connect(2),其中应用程序的编号在 list() 命令的结果中给出)。然后,您可以通过 services("(service.imported=true)") 查看 SCA 添加的服务代理。命令services() 将列出应用程序中的所有服务。

【讨论】:

    猜你喜欢
    • 2014-12-22
    • 2018-12-25
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 2010-12-31
    • 1970-01-01
    相关资源
    最近更新 更多