Как добавить ссылки на сервис 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>