2014-11-13 1 views
0

대기열에서 메시지를 읽고 그 동안 처리 된 메시지를 다른 대기열로 보내는 구성 요소가 있습니다. 따라서이 구성 요소는 메시지 소비자 및 제작자입니다. 이들을 구성하기 위해 소비를위한 연결 팩토리와 생산을위한 다른 연결 팩토리가 필요합니다. 여기는 스프링 구성의 일부입니다.Spring Jms의 프로듀서와 소비자는 동일한 연결 팩토리를 사용합니까?

<!-- Configuration for listener --> 
<bean id="mdc.TargetConnectionFactory4Listener" class="com.tibco.tibjms.TibjmsConnectionFactory"> 
    <property name="serverUrl" value="tcp://localhost:7222"/> 
</bean> 

<bean id="mdc.ConnectionFactory4Listener" class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter"> 
    <property name="targetConnectionFactory" ref="mdc.TargetConnectionFactory"/> 
    <property name="username" value="admin" /> 
    <property name="password" value="test" /> 
</bean> 

<bean id="mdc.InputQueue" class="com.tibco.tibjms.TibjmsQueue"> 
    <constructor-arg> 
     <value>INPUT_QUEUE</value> 
    </constructor-arg> 
</bean> 

<bean id="mdc.JmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
    <property name="connectionFactory" ref="mdc.ConnectionFactory4Listener" /> 
    <property name="destination" ref="mdc.InputQueue" /> 
    <property name="messageListener" ref="mdc.MessageReceiver" /> 
    ...... 
</bean> 

<!-- Configuration for sender --> 
<bean id="mdc.TargetConnectionFactory4Sender" class="com.tibco.tibjms.TibjmsQueue"> 
    <property name="serverUrl" value="tcp://localhost:7222"/> 
</bean> 

<bean id="mdc.CachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory"> 
    <property name="targetConnectionFactory" ref="mdc.TargetConnectionFactory4Sender" /> 
    <property name="sessionCacheSize" value="50" /> 
</bean> 

<bean id="mdc.OutputQueue" class="com.tibco.tibjms.TibjmsQueue"> 
    <constructor-arg> 
     <value>DISCOVERY_QUEUE</value> 
    </constructor-arg> 
</bean> 

<bean id="mdc.JmsTemplate" class="org.springframework.jms.core.JmsTemplate"> 
    <property name="connectionFactory" ref="mdc.CachingConnectionFactory" /> 
</bean> 

<bean id="mdc.MessageReceiver" class="net.siemens.discovery.queue.QueueMessageListener"> 
    <property name="jmsTemplate" ref="mdc.JmsTemplate" /> 
    <property name="destination" ref="mdc.OutputQueue" /> 
    ...... 
</bean> 

2 개의 대기열이 동일한 EMS 서버에서 실행 중입니다. 일부는이 구성에 대한 의견을 갖고 있습니다. 하나의 ConnectionFactory 만 사용하여 구성 할 수 있으며 두 개의 인스턴스가 필요하지 않습니다. 그러나 하나의 ConnectionFactory 인스턴스를 사용하는 경우 인스턴스는 DefaultMessageListenerContainer와 CachingConnectionFactory (JmsTemplate에서 사용됨)에서 모두 사용됩니다. 나는 그들이 서로에게 영향을 미치는지 여부를 모른다.

답변

1

단일 연결 팩토리를 사용하는 것이 정상입니다. 이 경우 2 개의 공장을 사용하는 것은 매우 드문 경우입니다. 당신이 컨테이너 스레드에서 JmsTemplate 작업을 수행 할 수 원하는 경우

는 사실, 당신은 다음 동일한 연결 팩토리를 사용하며, 상호 작용이 (컨테이너 sessionTransacted = true) 트랜잭션에서 실행합니다. 이렇게하면 예외가 있으면 모든 항목을 롤백 할 수 있습니다.

리스너 컨테이너에서 캐싱 연결 팩토리를 사용하는 경우 연결 팩토리 cacheConsumers을 false로 설정해야합니다. (this answer for more information을 참조하십시오.

+0

답변 해 주셔서 감사합니다. Gary. – Tulip