0

我使用 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 对象。所以我将配置更改为

<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 个元素时才有效。如何根据列表中的大小动态配置它?

4

2 回答 2

0

您可以不使用 util:map,而是定义一个工厂或一个 bean,在 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>
于 2013-09-13T21:20:00.020 回答
0

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

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

请让我知道是否有更好的解决方案。

于 2013-09-16T14:10:21.443 回答