[SPRING] Spring의 CachingConnectionFactory를 사용할 때 세션 닫기
SPRINGSpring의 CachingConnectionFactory를 사용할 때 세션 닫기
Spring CachingConnectionFactory와 관련된 자바 문서는 다음과 같은 주석을 가지고있다.
내 응용 프로그램에서 아래 주어진 구성으로 이것을 처리하는 방법을 명확하지 않습니다.
<bean id="springApp" class="com.codereq.springcore.jms.SpringJMSListenerApp" />
<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="jmsConnectionFactory"/>
<property name="destination" ref="destination"/>
<property name="messageListener" ref="messageListener"/>
<property name="sessionTransacted" value="true"/>
<property name="concurrentConsumers" value="5" />
<property name="maxConcurrentConsumers" value="15" />
</bean>
<bean id="messageListener" class="com.codereq.springcore.jms.MessageListenerApp" />
<bean id="jmsConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory"
p:targetConnectionFactory-ref="emsConnectionFactory"
p:sessionCacheSize="100"
p:cacheConsumers="true" />
<bean id="emsConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="GenericConnectionFactory"/>
<property name="jndiTemplate" ref="jndiTemplate"/>
</bean>
<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
<property name="environment">
<props>
<prop key="java.naming.factory.initial">com.tibco.tibjms.naming.TibjmsInitialContextFactory</prop>
<prop key="java.naming.provider.url">tibjmsnaming://localhost:7222</prop>
<prop key="java.naming.security.principal">admin</prop>
<prop key="java.naming.security.credentials">admin</prop>
</props>
</property>
</bean>
<bean id="destination" class="com.tibco.tibjms.TibjmsQueue">
<constructor-arg value="com.sample.queue" />
</bean>
리스너 클래스는 다음과 같습니다.
public class MessageListenerApp implements MessageListener {
private static int c = 0;
@Override
public void onMessage(Message arg0) {
try {
System.out.println("Received Message..."+arg0.getStringProperty("MessageNum")+". Waiting to finish..");
Thread.sleep(2000);
System.out.println("Finished processing.."+arg0.getStringProperty("MessageNum")+".."+(c++));
} catch (Exception e) {
e.printStackTrace();
}
}
}
공유 연결에서 얻은 세션을 명시 적으로 닫아야한다는 권장 사항을 어떻게 준수합니까?
Session에 대한 핸들을 제공하는 onMessage 메소드를 제공하는 SessionAwareMessageListener 인터페이스에 걸쳐있다. 따라서 세션 닫기를 제대로 구현하려면이 인터페이스를 구현해야합니까?
해결법
-
==============================
1.일반적으로 maxConcurrentConsumers> concurrentConsumers를 사용할 때 캐싱 연결 팩토리를 리스너 컨테이너와 함께 사용하는 것은 일반적으로 좋지 않습니다. 캐시에있는 캐시 된 소비자로 끝날 수 있으며 리스너가없는 곳의 메시지를 가져올 수 있습니다. "붙어있어."
일반적으로 maxConcurrentConsumers> concurrentConsumers를 사용할 때 캐싱 연결 팩토리를 리스너 컨테이너와 함께 사용하는 것은 일반적으로 좋지 않습니다. 캐시에있는 캐시 된 소비자로 끝날 수 있으며 리스너가없는 곳의 메시지를 가져올 수 있습니다. "붙어있어."
이 경우 CCF를 사용하지 마십시오. 실제로 제작자 측에서 사용하기위한 것입니다.
컨테이너가 동시성을 관리하기 때문에 세션 / 소비자는 오래 사용되고 캐시 할 필요가 없습니다.
-
==============================
2.응용 프로그램은 DefaultMessageListenerContainer를 사용할 때 세션을 닫는 데 필요하지 않습니다. 필요한 세션을 만들고 종료하는 동안 닫습니다.
응용 프로그램은 DefaultMessageListenerContainer를 사용할 때 세션을 닫는 데 필요하지 않습니다. 필요한 세션을 만들고 종료하는 동안 닫습니다.
Spring이 아무런 단서도 없을 것이라는 CachingConnectionFactory 참조를 사용하여 응용 프로그램에서 Session을 만들면 언급 한 내용이 적용됩니다.
from https://stackoverflow.com/questions/18863057/closing-session-when-using-springs-cachingconnectionfactory by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring에서 주어진 타입의 모든 의존성을 autowire하는 방법이 있습니까? (0) | 2019.03.29 |
---|---|
[SPRING] 스프링 빈을 다시 초기화하는 방법은? (0) | 2019.03.29 |
[SPRING] Spring 보안 3.0.2로 OpenId 인증 및 자동 등록 (0) | 2019.03.29 |
[SPRING] 스프링 보안에서 커스텀 UserDetail 객체를 생성하는 방법 (0) | 2019.03.29 |
[SPRING] DataSourceUtils.getConnection 대 DataSource.getConnection (0) | 2019.03.29 |