Spring集成JMS在入站和出站都发布订阅

时间:2015-01-12 08:34:02

标签: java spring spring-integration

我正在尝试使用Spring-Integration JMS的示例项目进行JMS集成,我已经成功完成了这项工作。我怎么会有一个稍微不同的要求。我需要使用Publish Subscribe模式从1个JMS代理监听,我需要将相同的侦听JMS消息发送到另一个Kafak Queue /或其他队列。我正在努力配置,截至目前我只配置了请求和响应队列。这是配置。请帮忙。

Common.xml

<?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:integration="http://www.springframework.org/schema/integration"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/integration
            http://www.springframework.org/schema/integration/spring-integration.xsd">

    <bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
        <property name="targetConnectionFactory">
            <bean class="org.apache.activemq.ActiveMQConnectionFactory">
                <property name="brokerURL" value="vm://localhost"/>
            </bean>
        </property>
        <property name="sessionCacheSize" value="10"/>
        <property name="cacheProducers" value="false"/>
    </bean>

     <!-- <bean id="requestQueue" class="org.apache.activemq.command.ActiveMQQueue">
        <constructor-arg value="queue.demo"/>
    </bean> -->

    <bean id="replyQueue" class="org.apache.activemq.command.ActiveMQQueue">
        <constructor-arg value="queue.reply"/>
    </bean>
 <bean id="requestQueue" class="org.apache.activemq.command.ActiveMQQueue">
        <constructor-arg value="queue.request"/>
    </bean>

    <integration:poller id="poller" default="true" fixed-delay="100"/>

</beans>

InboudChanelAdapter

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/integration"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:beans="http://www.springframework.org/schema/beans"
    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/integration
            http://www.springframework.org/schema/integration/spring-integration.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/stream
            http://www.springframework.org/schema/integration/stream/spring-integration-stream.xsd">

    <jms:message-driven-channel-adapter id="jmsIn"
            destination="requestQueue"
            channel="jmsInChannel" />

    <channel id="jmsInChannel" />



    <beans:beans profile="testCase">

        <bridge input-channel="jmsInChannel" output-channel="queueChannel"/>

        <channel id="queueChannel">
            <queue />
        </channel>

     </beans:beans> 

</beans:beans>

OutboundChannelAdapter.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans:beans xmlns="http://www.springframework.org/schema/integration"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:beans="http://www.springframework.org/schema/beans"
        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/integration
                http://www.springframework.org/schema/integration/spring-integration.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/stream
                http://www.springframework.org/schema/integration/stream/spring-integration-stream.xsd">

        <stream:stdin-channel-adapter id="stdin" channel="stdinToJmsoutChannel"/>

        <channel id="stdinToJmsoutChannel"/>
        <channel id="jmsInChannel" />

        <jms:outbound-channel-adapter id="jmsout" channel="jmsInChannel" destination="requestQueue"/>

    </beans:beans>
 **DemoConfig.xml**

    <?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:integration="http://www.springframework.org/schema/integration"
    xmlns:jms="http://www.springframework.org/schema/integration/jms"
    xmlns:beans="http://www.springframework.org/schema/beans"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/integration
            http://www.springframework.org/schema/integration/spring-integration.xsd
            http://www.springframework.org/schema/integration/jms
            http://www.springframework.org/schema/integration/jms/spring-integration-jms.xsd">

    <bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
        <property name="targetConnectionFactory">
            <bean class="org.apache.activemq.ActiveMQConnectionFactory">
                <property name="brokerURL" value="vm://localhost"/>
            </bean>
        </property>
        <property name="sessionCacheSize" value="10"/>
        <property name="cacheProducers" value="false"/>
    </bean>


     <bean id="connectionFactory2nd" class="org.springframework.jms.connection.CachingConnectionFactory">
        <property name="targetConnectionFactory">
            <bean class="org.apache.activemq.ActiveMQConnectionFactory">
                <property name="brokerURL" value="vm://localhost"/>
            </bean>
        </property>
        <property name="sessionCacheSize" value="10"/>
        <property name="cacheProducers" value="false"/>
    </bean>



    <bean id="replyQueue" class="org.apache.activemq.command.ActiveMQQueue" >
        <constructor-arg value="queue.reply"/>
    </bean>
 <bean id="requestQueue" class="org.apache.activemq.command.ActiveMQQueue">
        <constructor-arg value="queue.request"/>
    </bean>

  <jms:message-driven-channel-adapter id="jmsIn"
        destination="requestQueue"
        channel="jmsInChannel" 
       connection-factory="connectionFactory"/>

   <jms:publish-subscribe-channel id= "jmsInChannel"/>
   <jms:topic id="Topic"></jms:topic>
   </<jms:channel>     

   <jms:outbound-channel-adapter id="jmsout" channel="jmsInChannel" destination="replyQueue" connection-factory="connectionFactory2nd"/>

    <integration:poller id="poller" default="true" fixed-delay="100"/>

</beans>

1 个答案:

答案 0 :(得分:1)

看起来你没有足够的理论知识,所以你应该去关于Spring Integration的文档和书籍。你还没有感觉到MessageChannel还有什么。

<jms:message-driven-channel-adapter id="jmsIn"
        destination="requestQueue"
        channel="jmsInChannel" />

表示:侦听requestQueue目标并将Spring Integration消息发送到jmsInChannel

如果您只想将该消息发送到另一个JMS目的地,您应该执行以下操作:

<jms:outbound-channel-adapter id="jmsout" channel="jmsInChannel" destination="replyQueue"/>

请确保jmsInChannel没有其他订阅者,因为它是DirectChannel

根据您当前的配置,您有其他订阅者<bridge>。在这种情况下,Round-Robin平衡器适用于jmsInChannel,第一个消息将发送给第一个订阅者,而第二个消息将发送到第二个订阅者,依此类推。

如果您希望两个订阅者都接受该消息,则应将jmsInChannel更改为<publish-subscribe-channel>

您可以从文档中找到更多信息。