복붙노트

[SPRING] Spring의 CachingConnectionFactory를 사용할 때 세션 닫기

SPRING

Spring의 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. ==============================

    1.일반적으로 maxConcurrentConsumers> concurrentConsumers를 사용할 때 캐싱 연결 팩토리를 리스너 컨테이너와 함께 사용하는 것은 일반적으로 좋지 않습니다. 캐시에있는 캐시 된 소비자로 끝날 수 있으며 리스너가없는 곳의 메시지를 가져올 수 있습니다. "붙어있어."

    일반적으로 maxConcurrentConsumers> concurrentConsumers를 사용할 때 캐싱 연결 팩토리를 리스너 컨테이너와 함께 사용하는 것은 일반적으로 좋지 않습니다. 캐시에있는 캐시 된 소비자로 끝날 수 있으며 리스너가없는 곳의 메시지를 가져올 수 있습니다. "붙어있어."

    이 경우 CCF를 사용하지 마십시오. 실제로 제작자 측에서 사용하기위한 것입니다.

    컨테이너가 동시성을 관리하기 때문에 세션 / 소비자는 오래 사용되고 캐시 할 필요가 없습니다.

  2. ==============================

    2.응용 프로그램은 DefaultMessageListenerContainer를 사용할 때 세션을 닫는 데 필요하지 않습니다. 필요한 세션을 만들고 종료하는 동안 닫습니다.

    응용 프로그램은 DefaultMessageListenerContainer를 사용할 때 세션을 닫는 데 필요하지 않습니다. 필요한 세션을 만들고 종료하는 동안 닫습니다.

    Spring이 아무런 단서도 없을 것이라는 CachingConnectionFactory 참조를 사용하여 응용 프로그램에서 Session을 만들면 언급 한 내용이 적용됩니다.

  3. from https://stackoverflow.com/questions/18863057/closing-session-when-using-springs-cachingconnectionfactory by cc-by-sa and MIT license