2015-01-12 2 views
0

JMS 통합을위한 Spring 통합 JMS의 예제 프로젝트를 사용하려고합니다. 내가 어떻게 약간 다른 요구 사항 집합을 가지고 있습니다. Publish Subscribe 패턴을 사용하여 1 JMS 브로커에서 수신해야하는 곳에서 동일한 수신 대기 JMS 메시지를 다른 Kafak 대기열 또는 다른 대기열로 보내야합니다. 지금은 요청 및 응답 대기열에 대해서만 구성한 것처럼 구성에 어려움을 겪고 있습니다. 다음은 구성입니다. 도와주세요.스프링 통합 JMS 게시 인바운드 및 아웃 바운드 모두 게시

은 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

패를 보인다 이론적으로 충분한 지식이 없으므로 Spring Integration에 관한 Docs and Books로 가야합니다. 당신은 아직 MessageChannel이 무엇인지 잘 느끼지 못합니다.

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

수단 다음 requestQueue 목적지에 듣고 jmsInChannel에 봄 통합 메시지를 보낼 수 있습니다.

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

을 그리고 그것은 DirectChannel이기 때문에, 그 jmsInChannel에 더 이상 가입자가 없음을 확인하십시오 : 당신이 다른 JMS 대상에 해당 메시지를 보낼 단지려고하는 경우에

은 다음과 같이해야합니다 .

현재 구성에 따라 추가 가입자는 <bridge>입니다. 이 경우 Round-Robin 밸런서가 jmsInChannel에서 작동하며 첫 번째 메시지는 첫 번째 가입자에게 전송되고 두 번째 메시지는 두 번째 구독자에게 전송됩니다.

두 가입자가 메시지를 수락하려면 jmsInChannel<publish-subscribe-channel>으로 변경해야합니다.

더 많은 정보는 docs에서 찾을 수 있습니다.

+0

감사합니다. Artem. 그러나 두 ActiveMQ 중개인을 어떻게 구별 할 수 있습니까? 여기서 나는 1을 위해 설정했다. 어떻게 차별화 할 것인가? –

+0

단지 그 브로커에 대해 새로운'CachingConnectionFactory' 빈을 설정해야한다. 모든 JMS 어댑터는 특정'javax.jms.ConnectionFactory'를 호출하는'connection-factory' 속성을 가지고 있습니다 –

+0

안녕 Artem, 여기서는 두 채널 모두 구독자가되고 싶지 않습니다. 하나의 메시지 브로커에서 JMS 메시지를받는 것과 같은 흐름을 원합니다. 항목을 봄 통합으로 정의하면 인바운드 어댑터가 정의되고 아웃 바운드 어댑터가 별도의 메시지 브로커 주제를 선택하여 입력하는 채널에 동일한 스프링 통합 메시지가 배치됩니다. 요약하면 SPring 통합을 통해 전달 된 모든 JMS를 전달하고자합니다. democonfig.xm의 권장 사항에 따라 질문의 구성을 업데이트했습니다. –

관련 문제