2015-01-05 1 views
3

MQTopicConnectionFactoryMQQueueConnectionFactory을 각각 캐시 크기가 10으로 설정 한 CachingConnectionFactory을 구성했습니다.WebSphere MQ를 사용하여 JMS 연결이 고갈되었습니다.

내 응용 프로그램에있는 다양한 스프링 통합 워크 플로의 일부로 여러 jms:outbound-channel-adapter or jms:message-driven-channel-adapter에 사용 된 것보다 많습니다.

프로세스가 작동을 멈 추면 MQ 채널의 연결 수가 최대 허용치 (약 1000)에 도달하는 것을 알 수 있습니다. 이는 프로덕션 응용 프로그램에 심각한 문제입니다.

응용 프로그램을 중지해도 연결 수가 줄어들지 않으므로 MQ 측의 연결이 끊어져 보입니까? 이 문제를 해결할 수있는 스프링 jms/SI 구성에서 누락 된 부분이 있는지 확실하지 않습니다. 도움을 주시면 감사하겠습니다.

또한 응용 프로그램과의 연결을 열고 닫고 싶지만 그렇게 할 수있는 방법은 없습니다.

<bean id="mqQcf" class="com.ibm.mq.jms.MQQueueConnectionFactory"> 
 
//all that it needs host/port/ queue manager /channel 
 
</bean> 
 
    
 
<bean id="qcf" class="org.springframework.jms.connection.CachingConnectionFactory"> 
 
\t \t \t <property name="targetConnectionFactory" ref=" mqQcf "/> 
 
\t \t \t <property name="sessionCacheSize" value="10"/> \t \t \t 
 
</bean> 
 

 

 
<bean id="mqTcf" class="com.ibm.mq.jms.MQTopicConnectionFactory"> 
 
//all that it needs host/port/ queue manager /channel 
 
</bean> 
 

 
<bean id="tcf" class="org.springframework.jms.connection.CachingConnectionFactory"> 
 
\t \t \t <property name="targetConnectionFactory" ref=" mqTcf "/> 
 
\t \t \t <property name="sessionCacheSize" value="10"/> \t \t \t 
 
</bean> 
 

 
//Qcf and tcf are than used in spring integration configuration as required

감사

+0

어떤 해결 방법이 있습니까? – haju

답변

1
당신은 정말 당신의 구성하지만, 봄 CachingConnectionFactory을 보여줄 필요가

는 모든 세션 공유되는 단일 연결을 만듭니다. 새 연결을 만들 때 CCF 범주에 대한 INFO 로깅 켜기 ...이 로그를 방출

if (logger.isInfoEnabled()) { 
    logger.info("Established shared JMS Connection: " + this.target); 
} 

편집 : 눈에 띄는 당신의 설정에 거기에 아무것도

. 내가 말했듯이 각 CCF는 한 번에 최대 1 개의 연결 만 열어 둡니다.

유휴 상태 일 경우 클라이언트 나 서버에 알리지 않고 네트워크 (스위치 또는 방화벽)가 자동으로 연결을 끊을 수 있습니다. 다음에 클라이언트가 연결을 사용하려고하면 실패하고 새 연결을 만들지 만 서버는 이전 연결이 끊어 졌음을 결코 알지 못할 수 있습니다.

일반적으로 이러한 상황에서는 하트 비트 또는 킵 얼라이브를 활성화하면 연결이 활성화 된 상태로 유지됩니다 (또는 적어도 서버가 죽은 상태임을 알 수 있음).

+0

질문에 약간의 코드 샘플을 추가했는데, 이것은 특별한 것이 아니며, 연결 팩토리에 필요한 기본적인 구성 일뿐입니다. 다른 코드를보고 싶다면 알려주세요. 감사합니다! 또한 위의 로깅을 사용하고 인쇄 된 공유 연결을 볼 수 있지만 동시 소비자가 더 높은 숫자로 설정되어있을 때 다양한 게시자와 구독자에게 제공하기 위해 더 많은 연결을 만들어야합니다? – Mark1234

+0

네트워크 문제 일 수 있음 - 답변을 업데이트했습니다. –

+0

감사합니다. Gary, 잠시 사용하지 않으면 CachingConnectionFactory에 연결을 종료하도록 지시하는 방법이 있습니까? – Mark1234

0

내 응용 프로그램에서 연결 팩토리에 의해 Connection이 하나만 열려있을 때 MQ의 열린 출력 수에 대한 디버깅을했습니다.

MQ 탐색기의 출력 개수는 IBM MQ 클래스에서 생성 한 연결 핸들 수입니다. IBM 문서에서 Session 객체는 IBM MQ 연결 핸들을 캡슐화하므로 세션의 초 국가적 범위를 정의합니다.

내 응용 프로그램에서 세션 캐시 크기가 10 이었기 때문에 며칠 동안 열린 채로 남아있는 10 개의 IBM MQ 연결 핸들 (각 세션 당 하나씩)이 있었고 핸들 상태는 비활성이었습니다.

더 많은 정보는

https://www.ibm.com/support/knowledgecenter/en/SSFKSJ_9.0.0/com.ibm.mq.dev.doc/q031960_.htm

게리 러셀이 언급 한 바와 같이

, 봄이 유휴 연결 시간 초과를 구성하는 방법을 제공하지 않습니다에서 찾을 수 있습니다.IBM은 MQConnectionFactory에 inbuilt 특성을 가지고 있는데, 이는 재 연결 시간 초과를 설정하도록 구성 할 수 있습니다.

더 많은 INFOR 예외에

https://www.ibm.com/developerworks/community/blogs/messaging/entry/simplify_your_wmq_jms_client_with_automatic_client_reconnection19?lang=en

재 연결은 CCF에 대한 기본적 사실에서 찾을 수 있습니다. 따라서 IBM이 제한 시간이 지난 후에 예외가 발생할 경우주의를 기울여야합니다. CCF에 예외를 던지기 전에 재 연결 시도가 최대 횟수인지 확실하지 않습니다.

+0

CCF는 각 세션 내에 생산자를위한 캐시도 유지합니다. 응용 프로그램에서 연결 문제를 더 디버깅 할 때 생성 된 총 유휴 연결 핸들은 세션 캐시 크기 * 고유 대상 수입니다. 다음 번에 캐시에서 동일한 세션을 다시 얻고 캐시의 제작자를 사용하게 될 것이라는 보장은 없습니다. 따라서 이것은 응용 프로그램에 대한 오버 헤드이며 연결은 재사용하지 않고 며칠 동안 유휴 상태를 유지합니다. 따라서 세션 캐시 크기와 생산자 캐시 사용 여부를 결정할 때주의를 기울여야합니다. – Selvakumar