Как добавить ссылки на сервис OSGI в свойство contexts httpserver (Spring remoting)?

Я использую Spring Remoting и 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. Как я могу установить этот список служб на свойство contextxts?

Обновление 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>

Это замечательно, но работает, только если в serviceReferenceList есть хотя бы 2 элемента при инициализации bean-сервера httpserver. Как мне настроить это динамически в зависимости от размера в списке?

2 ответа

Решение

Спасибо за ответ, Шина. Оказывается, что SimpleHttpServerFactoryBean содержит копию карты, а не ссылку. Таким образом, свойство contextx будет установлено во время инициализации компонента. Я не смог найти какой-либо другой способ обновить его.

В качестве обходного пути мне пришлось обновить пакет, в котором инициализируется компонент SimpleHttpServerFactoryBean.

Пожалуйста, дайте мне знать, если есть лучшее решение.

Вместо использования 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>
Другие вопросы по тегам