#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. И есть ли в очередях сообщения, которые эти получающие потоки должны были обработать и не обработали?