Как использовать Spring Integration в реальной распределенной архитектуре JMS? - PullRequest
5 голосов
/ 10 июня 2010

Для следующего сценария я ищу ваши советы и рекомендации по передовым методам:

В распределенной (в основном на основе Java) системе с:

  • многими (разными)клиентские приложения (веб-приложение, инструменты командной строки, REST API)
  • центральный JMS-брокер сообщений (в настоящее время выступает за использование ActiveMQ)
  • несколько автономных узлов обработки (работающих на несколькихудаленные машины, вычисляющие дорогостоящие операции различных типов, как указано в полезной нагрузке сообщения JMS)

Как лучше всего применять поддержку JMS, предоставляемую платформой Spring Integration , для разделения клиентовс рабочих узлов?При чтении справочной документации и некоторых самых первых экспериментов создается впечатление, что конфигурация входящего адаптера JMS по своей сути требует использования подписчика, которого в отсоединенном сценарии не существует.

Небольшое примечание: должно произойти соединениечерез текстовые сообщения JMS (используя структуру данных JSON для расширения в будущем).

Ответы [ 3 ]

4 голосов
/ 10 июня 2010

Это на самом деле не отвечает на ваш вопрос, но обязательно посмотрите 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 и начала обработки сообщений.

3 голосов
/ 11 июня 2010

Вот Spring Integration, о которой я говорил сегодня, если вы найдете что-то, что может быть улучшено, пожалуйста, следуйте.

На стороне клиента сообщения можно отправлять и получать через 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 Integration см. В комментариях):

<?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>
1 голос
/ 10 июня 2010

Вы спрашиваете, можно ли использовать Spring Integration для реализации протокола bridge ? Тогда ответ - да, и делает это довольно просто.

...