Для следующего сценария я ищу Ваши советы и подсказки относительно лучших практик:
В распределенной (главным образом основанной на Java) системе с:
Как одно лучшее применило бы поддержку JMS, оказанную Платформой интеграции Spring для отделения клиентов от узлов рабочего? При прочтении справочной документации и некоторых самых первых экспериментов похоже, что конфигурация входящего адаптера JMS по сути требует для использования подписчика, который в отделенном сценарии не существует.
Маленькое примечание стороны: коммуникация должна произойти с помощью текстовых сообщений JMS (использующий структуру данных JSON для будущей расширяемости).
Это не совсем отвечает на ваш вопрос, но убедитесь, что вы изучили Apache Camel для соединения различных компонентов. Я нашел его чрезвычайно полезным для подключения очереди JMS к существующему веб-сервису и планирую использовать его и для других компонентов.
Пример, который отслеживает очередь ActiveMQ на наличие сообщений, преобразует их и отправляет в веб-сервис:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:camel="http://camel.apache.org/schema/spring"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring-2.3.0.xsd">
<bean id="callbackProcessor" class="com.package.CallbackProcessor"/>
<bean id="activemq" class="org.apache.camel.component.jms.JmsComponent">
<property name="connectionFactory" ref="jmsFactory" />
</bean>
<camel:camelContext id="camel">
<!-- Must put this in camel:endpoint because camel:from doesn't support property substitution -->
<camel:endpoint id="callbackQueue" uri="activemq:queue:${jms.callback-queue-name}"/>
<camel:route>
<camel:from ref="callbackQueue"/>
<camel:process ref="callbackProcessor"/>
<camel:to uri="http://dummy"/><!-- This will be replaced by the callbackProcessor with the callback URL in the message -->
</camel:route>
</camel:camelContext>
</beans>
Это все, что необходимо в нашем приложении Spring, чтобы запустить Camel и начать обработку сообщений.
Вы спрашиваете, можно ли использовать Spring Integration для реализации протокола моста ? Тогда ответ будет положительным, и это будет довольно просто.
Вот интеграция Spring, которую я придумал сегодня. Если вы найдете вещи, которые можно улучшить, пожалуйста, следите за ними.
На стороне клиента сообщения могут быть отправлены и получены через SimpleMessagingGateway:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:integration="http://www.springframework.org/schema/integration"
xmlns:jms="http://www.springframework.org/schema/integration/jms"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/integration/jms
http://www.springframework.org/schema/integration/jms/spring-integration-jms.xsd
http://www.springframework.org/schema/integration
http://www.springframework.org/schema/integration/spring-integration.xsd">
<import resource="integration-common.xml"/>
<!-- Communication Gateway for the Client (send/receive) -->
<bean id="gateway" class="org.springframework.integration.gateway.SimpleMessagingGateway">
<property name="requestChannel" ref="SenderChannel"/>
<property name="replyChannel" ref="InboundChannel"/>
<property name="replyTimeout" value="1000"/>
</bean><!-- TODO: could use integration:gateway -->
<!-- Sending out message to JMS request queue -->
<integration:channel id="SenderChannel"/>
<jms:outbound-channel-adapter
channel="SenderChannel"
destination="requestQueue" />
<!-- Listen to incoming messages on JMS reply queue -->
<integration:channel id="InboundChannel">
<integration:queue/>
</integration:channel>
<jms:message-driven-channel-adapter
destination="replyQueue"
channel="InboundChannel" />
</beans>
И конфигурация на стороне узла обработки выглядит следующим образом (см. Встроенные комментарии для более подробного объяснения элементов интеграции Spring):
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:integration="http://www.springframework.org/schema/integration"
xmlns:jms="http://www.springframework.org/schema/integration/jms"
xmlns:stream="http://www.springframework.org/schema/integration/stream"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/integration/jms
http://www.springframework.org/schema/integration/jms/spring-integration-jms.xsd
http://www.springframework.org/schema/integration
http://www.springframework.org/schema/integration/spring-integration.xsd">
<import resource="integration-common.xml"/>
<!-- Read in Message Endpoint Service Activator classes -->
<context:component-scan base-package="sample.integration.jmsbasic"/>
<!-- Listen to incoming messages on the JMS request queue -->
<integration:channel id="jmsinToProcChannel"/>
<jms:message-driven-channel-adapter
destination="requestQueue"
channel="jmsinToProcChannel"/>
<!-- Delegate message to service implementation and take care of answer -->
<integration:service-activator
input-channel="jmsinToProcChannel"
ref="procService"
output-channel="jmsBackChannel" />
<!-- Send answer back to JMS reply queue -->
<integration:channel id="jmsBackChannel"/>
<jms:outbound-channel-adapter
channel="jmsBackChannel"
destination="replyQueue" />
</beans>