2013-09-11 3 views
0

Я использую Spring remoting и OSGI.Как добавить ссылки службы OSGI в свойстве контекстов httpserver (Spring remoting)?

<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. Как установить этот список сервисов в свойство контекстов?

Update 1:

com.xyz.IRemoteService имеет два метода, который возвращает один ключ, т.е. URL-адрес и другие возвращает SimpleHttpInvokerServiceExporter object.So я изменил Teh конфигурации как

<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 инициализирован. Как настроить эту динамику в зависимости от размера в списке?

ответ

0

Спасибо за ответ Шиэна. Получается, что SimpleHttpServerFactoryBean хранит копию Карты, а не ссылку. Таким образом, свойство contexts будет установлено, когда bean инициализируется. Я не мог найти другого способа его обновления.

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

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

0

Вы можете вместо использования утилиты: map, определить фабрику или компонент, который прокладывает в IRemoteServiceProvider и выводит карту.

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>