Как усилить Интеграцию Spring в реальной распределенной архитектуре JMS?

Для следующего сценария я ищу Ваши советы и подсказки относительно лучших практик:

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

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

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

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

5
задан ngeek 10 June 2010 в 08:30
поделиться

3 ответа

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

4
ответ дан 14 December 2019 в 04:30
поделиться

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

1
ответ дан 14 December 2019 в 04:30
поделиться

Вот интеграция 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>
3
ответ дан 14 December 2019 в 04:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: