Потоки JMS застряли в proxyMQGET в Websphere com.ibm.mq.jmqi.remote.impl.RemoteProxyQueue.proxyMQGET

#multithreading #performance #websphere #ibm-mq #spring-jms

Вопрос:

Мое приложение работает на Websphere 9 и взаимодействует с IBM MQ и Oracle. Я столкнулся с проблемой большой глубины очереди в определенной очереди. Я проверил наличие узких мест в своем процессе и нашел в отчете AWR один запрос на вставку, который занял около минуты. Это объясняет низкую пропускную способность и высокую глубину очереди. Однако я также мог видеть некоторые зависшие потоки JMS в журналах сервера. Эти темы, похоже, застревают на 15-16 минут в ожидании получения сообщения. Ниже приведены трассировки стека для двух из этих потоков, другие также имеют то же самое. Мне трудно понять первопричину, так как в журналах приложений не так много информации, связанной с этим. Нет никаких ошибок «MQCC».

 [11/30/21 11:45:05:670 GMT] 00000096 ThreadMonitor W WSVR0605W: Thread "WorkManager.JMSWorkManager : 56" (0000068c) has been active for 961315 milliseconds and may be hung. There is/are 3 thread(s) in total in the server that may be hung.  at java.lang.Object.wait(Native Method)  at java.lang.Object.wait(Object.java:218)  at com.ibm.mq.jmqi.remote.impl.RemoteProxyQueue.proxyMQGET(RemoteProxyQueue.java:2460)  at com.ibm.mq.jmqi.remote.api.RemoteFAP.jmqiGetInternalWithRecon(RemoteFAP.java:6334)  at com.ibm.mq.jmqi.remote.api.RemoteFAP.jmqiGetInternal(RemoteFAP.java:6233)  at com.ibm.mq.jmqi.internal.JmqiTools.getMessage(JmqiTools.java:1192)  at com.ibm.mq.jmqi.remote.api.RemoteFAP.jmqiGet(RemoteFAP.java:6194)  at com.ibm.msg.client.wmq.internal.WMQConsumerShadow.getMsg(WMQConsumerShadow.java:1440)  at com.ibm.msg.client.wmq.internal.WMQSyncConsumerShadow.receiveInternal(WMQSyncConsumerShadow.java:235)  at com.ibm.msg.client.wmq.internal.WMQConsumerShadow.receive(WMQConsumerShadow.java:1194)  at com.ibm.msg.client.wmq.internal.WMQMessageConsumer.receive(WMQMessageConsumer.java:460)  at com.ibm.msg.client.jms.internal.JmsMessageConsumerImpl.receiveInboundMessage(JmsMessageConsumerImpl.java:817)  at com.ibm.msg.client.jms.internal.JmsMessageConsumerImpl.receive(JmsMessageConsumerImpl.java:501)  at com.ibm.mq.jms.MQMessageConsumer.receive(MQMessageConsumer.java:212)  at com.ibm.ejs.jms.JMSMessageConsumerHandle.receive(JMSMessageConsumerHandle.java:553)  at com.ibm.ejs.jms.JMSMessageConsumerHandle.receive(JMSMessageConsumerHandle.java:501)  at org.springframework.jms.support.destination.JmsDestinationAccessor.receiveFromConsumer(JmsDestinationAccessor.java:132)  at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveMessage(AbstractPollingMessageListenerContainer.java:418)  at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:303)  at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:245)  at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1189)  at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1081)  at org.springframework.scheduling.commonj.DelegatingWork.run(DelegatingWork.java:63)  at com.ibm.ws.asynchbeans.J2EEContext$RunProxy.run(J2EEContext.java:267)  at java.security.AccessController.doPrivileged(AccessController.java:704)  at javax.security.auth.Subject.doAs(Subject.java:490)  at com.ibm.websphere.security.auth.WSSubject.doAs(WSSubject.java:133)  at com.ibm.websphere.security.auth.WSSubject.doAs(WSSubject.java:91)  at com.ibm.ws.asynchbeans.J2EEContext$DoAsProxy.run(J2EEContext.java:338)  at java.security.AccessController.doPrivileged(AccessController.java:734)  at com.ibm.ws.asynchbeans.J2EEContext.run(J2EEContext.java:1174)  at com.ibm.ws.asynchbeans.WorkWithExecutionContextImpl.go(WorkWithExecutionContextImpl.java:199)  at com.ibm.ws.asynchbeans.CJWorkItemImpl.run(CJWorkItemImpl.java:237)  at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1892) [11/30/21 11:45:05:671 GMT] 00000096 ThreadMonitor W WSVR0605W: Thread "WorkManager.JMSWorkManager : 50" (000005f1) has been active for 901025 milliseconds and may be hung. There is/are 4 thread(s) in total in the server that may be hung.  at java.lang.Object.wait(Native Method)  at java.lang.Object.wait(Object.java:218)  at com.ibm.ejs.j2c.FreePool.queueRequest(FreePool.java:441)  at com.ibm.ejs.j2c.FreePool.createOrWaitForConnection(FreePool.java:1342)  at com.ibm.ejs.j2c.PoolManager.reserve(PoolManager.java:3907)  at com.ibm.ejs.j2c.PoolManager.reserve(PoolManager.java:3085)  at com.ibm.ejs.j2c.ConnectionManager.allocateMCWrapper(ConnectionManager.java:1554)  at com.ibm.ejs.j2c.ConnectionManager.allocateConnection(ConnectionManager.java:1033)  at com.ibm.ejs.jms.JMSConnectionFactoryHandle.createConnection(JMSConnectionFactoryHandle.java:256)  at org.springframework.jms.support.JmsAccessor.createConnection(JmsAccessor.java:196)  at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.access$100(AbstractPollingMessageListenerContainer.java:77)  at org.springframework.jms.listener.AbstractPollingMessageListenerContainer$MessageListenerContainerResourceFactory.createConnection(AbstractPollingMessageListenerContainer.java:490)  at org.springframework.jms.connection.ConnectionFactoryUtils.doGetTransactionalSession(ConnectionFactoryUtils.java:325)  at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:281)  at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:245)  at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1189)  at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1081)  at org.springframework.scheduling.commonj.DelegatingWork.run(DelegatingWork.java:63)  at com.ibm.ws.asynchbeans.J2EEContext$RunProxy.run(J2EEContext.java:267)  at java.security.AccessController.doPrivileged(AccessController.java:704)  at javax.security.auth.Subject.doAs(Subject.java:490)  at com.ibm.websphere.security.auth.WSSubject.doAs(WSSubject.java:133)  at com.ibm.websphere.security.auth.WSSubject.doAs(WSSubject.java:91)  at com.ibm.ws.asynchbeans.J2EEContext$DoAsProxy.run(J2EEContext.java:338)  at java.security.AccessController.doPrivileged(AccessController.java:734)  at com.ibm.ws.asynchbeans.J2EEContext.run(J2EEContext.java:1174)  at com.ibm.ws.asynchbeans.WorkWithExecutionContextImpl.go(WorkWithExecutionContextImpl.java:199)  at com.ibm.ws.asynchbeans.CJWorkItemImpl.run(CJWorkItemImpl.java:237)  at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1892)  

Комментарии:

1. Есть ли сообщения, которые поток должен был получить, но не получил за этот 15-минутный период времени? Как долго вы получаете интервалы ожидания в своих приложениях. Если они должны ждать 15 минут или больше, прежде чем отказаться от поступающих сообщений, то это, похоже, не проблема.

2. @Moraghugson, время ожидания настроено как 60 секунд. lt;имя свойства=»receiveTimeout» значение=»60000″/gt;

3. И есть ли в очередях сообщения, которые эти получающие потоки должны были обработать и не обработали?