【问题标题】:How to add OSGI service references in contexts property of httpserver (Spring remoting)?如何在 httpserver(Spring 远程处理)的上下文属性中添加 OSGI 服务引用?
【发布时间】:2013-09-11 17:41:39
【问题描述】:

我使用 Spring 远程处理和 OSGI。

   <bean id="httpServer" class="org.springframework.remoting.support.SimpleHttpServerFactoryBean">
        <property name="contexts">
        <util:map>
            <entry key="/remoting/Service1" value-ref="serviceBean1"/>
        </util:map>
        </property>
        <property name="port" value="8080" />
   </bean>   

我声明一个动态列表如下:

<osgi:list id="serviceList" interface="com.xyz.IRemoteService" member-type="service-object">

现在可以动态注册这些服务。在某一时刻,serviceList 将保存所有实现 com.xyz.IRemoteService 的服务引用。 如何将此服务列表设置为 contexts 属性?

更新 1:

com.xyz.IRemoteService 有两种方法,一种返回键,即 url,另一种返回 SimpleHttpInvokerServiceExporter 对象。所以我将配置更改为 as

<bean id="httpServer" class="org.springframework.remoting.support.SimpleHttpServerFactoryBean">
    <property name="contexts">
        <util:map>
        <entry key="/remoting/ArchiveEDSImpl" value-ref="archiveEDS" />
        <entry key="#{serviceList[0].url}" value="#{serviceList[0].httpHandler}" />
        <entry key="#{serviceList[1].url}" value="#{serviceList[1].httpHandler}" />
        </util:map>
    </property>
    <property name="port" value="8081" />
</bean>

<osgi:list id="serviceList" interface="com.xyz.IRemoteServiceProvider" member-type="service-object">
</osgi:list>

这很好,但只有在初始化 bean httpserver 时 serviceReferenceList 中至少有 2 个元素时才有效。如何根据列表中的大小动态配置它?

【问题讨论】:

    标签: java spring osgi spring-remoting springsource-dm-server


    【解决方案1】:

    您可以定义工厂或 bean,而不是使用 util:map,在 IRemoteServiceProvider 中连接并输出 Map。

    class MyMapFactory {
      List<IRemoteServiceProvider> providers;
      public Map buildMap() {
        //build Map of urls to http handlers here.
        // if the map wraps the list directory it can possibly even be dynamic! Depending on
        // whether SimpleHttpServerFactoryBean clones the map or uses it directly.
      }
    }
    
    <bean class="MyMapFactory" id="myMapFactory"/>
    
    <bean id="httpServer" class="org.springframework.remoting.support.SimpleHttpServerFactoryBean">
      <property name="contexts">
        <bean factory-bean="myMapFactory" factory-method="buildMap" class="java.util.Map"/> 
      </property>
      <property name="port" value="8081" />
    </bean>
    
    <osgi:list id="serviceList" interface="com.xyz.IRemoteServiceProvider" member-type="service-   object">
    </osgi:list>
    

    【讨论】:

      【解决方案2】:

      感谢希娜的回复。 事实证明,SimpleHttpServerFactoryBean 拥有 Map 的副本,而不是引用。所以 contexts 属性将在 bean 初始化时设置。我找不到任何其他方法来更新它。

      作为一种解决方法,我必须刷新初始化 SimpleHttpServerFactoryBean bean 的包。

      如果有更好的解决方案,请告诉我。

      【讨论】:

        猜你喜欢
        • 2016-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-08
        • 1970-01-01
        • 2017-03-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多