Java 如何配置';MQCNO#u HANDLE_SHARE_NO#u BLOCK';在IBM MQ连接工厂中?
我在两个线程同时尝试关闭为IBMMQ代理创建的JMS会话时遇到竞争条件。似乎有一个选项可以防止不同线程同时使用同一个连接处理程序。该配置称为“MQCNO\u句柄\u共享\u无\u块”(检查)。 我正在寻找在IBM MQ Java客户端(v.9.1.1.0)中使用MQConnectionFactory配置此属性的方法 我已经尝试使用connectionFactory.setMQConnectionOptions,或将'com.ibm.mq.constants.CMQC#MQCNO_HANDLE_SHARE_NO_BLOCK'常量设置为实际值,但客户端无法启动,告诉我连接选项无效Java 如何配置';MQCNO#u HANDLE_SHARE_NO#u BLOCK';在IBM MQ连接工厂中?,java,ibm-mq,Java,Ibm Mq,我在两个线程同时尝试关闭为IBMMQ代理创建的JMS会话时遇到竞争条件。似乎有一个选项可以防止不同线程同时使用同一个连接处理程序。该配置称为“MQCNO\u句柄\u共享\u无\u块”(检查)。 我正在寻找在IBM MQ Java客户端(v.9.1.1.0)中使用MQConnectionFactory配置此属性的方法 我已经尝试使用connectionFactory.setMQConnectionOptions,或将'com.ibm.mq.constants.CMQC#MQCNO_HANDLE_S
connectionFactory.setMQConnectionOptions(connectionFactory.getMQConnectionOptions());
connectionFactory.setMQConnectionOptions(connectionFactory.getMQConnectionOptions() | MQCNO_HANDLE_SHARE_NO_BLOCK);
我在IBM MQ客户机对GoLang的一些修改中发现,标志设置在这里:
if gocno == nil {
// Because Go programs are always threaded, and we cannot
// tell on which thread we might get dispatched, allow handles always to
// be shareable.
gocno = NewMQCNO()
gocno.Options = MQCNO_HANDLE_SHARE_NO_BLOCK
} else {
if (gocno.Options & (MQCNO_HANDLE_SHARE_NO_BLOCK |
MQCNO_HANDLE_SHARE_BLOCK)) == 0 {
gocno.Options |= MQCNO_HANDLE_SHARE_NO_BLOCK
}
}
copyCNOtoC(&mqcno, gocno)
C.MQCONNX((*C.MQCHAR)(mqQMgrName), &mqcno, &qMgr.hConn, &mqcc, &mqrc)
是否有人处理此问题,或使用此标志
编辑-添加来自两个锁定线程的线程转储。
我已锁定以下线程:
1) JMSCCThreadPoolWoker,又名IBM worker,处理IBM TCP接收器线程引发的异常:
"JMSCCThreadPoolWorker-493": inconsistent?, holding [0x00000006d605a0b8, 0x00000006d5f6b9e8, 0x00000005c631e140]
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:502)
at com.ibm.mq.jmqi.remote.util.ReentrantMutex.acquire(ReentrantMutex.java:167)
at com.ibm.mq.jmqi.remote.util.ReentrantMutex.acquire(ReentrantMutex.java:73)
at com.ibm.mq.jmqi.remote.api.RemoteHconn.requestDispatchLock(RemoteHconn.java:1219)
at com.ibm.mq.jmqi.remote.api.RemoteFAP.MQCTL(RemoteFAP.java:2576)
at com.ibm.mq.jmqi.monitoring.JmqiInterceptAdapter.MQCTL(JmqiInterceptAdapter.java:333)
at com.ibm.msg.client.wmq.internal.WMQConsumerOwnerShadow.controlAsyncService(WMQConsumerOwnerShadow.java:169)
at com.ibm.msg.client.wmq.internal.WMQConsumerOwnerShadow.stop(WMQConsumerOwnerShadow.java:471)
at com.ibm.msg.client.wmq.internal.WMQSession.stop(WMQSession.java:1894)
at com.ibm.msg.client.jms.internal.JmsSessionImpl.stop(JmsSessionImpl.java:2515)
at com.ibm.msg.client.jms.internal.JmsSessionImpl.stop(JmsSessionImpl.java:2498)
at com.ibm.msg.client.jms.internal.JmsConnectionImpl.stop(JmsConnectionImpl.java:1263)
at com.ibm.mq.jms.MQConnection.stop(MQConnection.java:473)
at org.springframework.jms.connection.SingleConnectionFactory.closeConnection(SingleConnectionFactory.java:491)
at org.springframework.jms.connection.SingleConnectionFactory.resetConnection(SingleConnectionFactory.java:383)
at org.springframework.jms.connection.CachingConnectionFactory.resetConnection(CachingConnectionFactory.java:199)
at org.springframework.jms.connection.SingleConnectionFactory.onException(SingleConnectionFactory.java:361)
at org.springframework.jms.connection.SingleConnectionFactory$AggregatedExceptionListener.onException(SingleConnectionFactory.java:715)
at com.ibm.msg.client.jms.internal.JmsProviderExceptionListener.run(JmsProviderExceptionListener.java:413)
at com.ibm.msg.client.commonservices.workqueue.WorkQueueItem.runTask(WorkQueueItem.java:319)
at com.ibm.msg.client.commonservices.workqueue.SimpleWorkQueueItem.runItem(SimpleWorkQueueItem.java:99)
at com.ibm.msg.client.commonservices.workqueue.WorkQueueItem.run(WorkQueueItem.java:343)
at com.ibm.msg.client.commonservices.workqueue.WorkQueueManager.runWorkQueueItem(WorkQueueManager.java:312)
at com.ibm.msg.client.commonservices.j2se.workqueue.WorkQueueManagerImplementation$ThreadPoolWorker.run(WorkQueueManagerImplementation.java:1227)
2) 消息处理线程(碰巧正在处理消息)在Catch子句中尝试关闭会话/生产者/消费者(处理情景有一个JMS应答)
你有什么错误?在最近的MQ版本中有许多死锁。只是在上面添加了锁定的线程转储。没有具体的错误。错误是死锁。请尝试9.1.2,它已修复。如果是这样的话,我会给你写一个快速的答案。有更新吗?这个建议解决问题了吗?嘿,乔希,对不起,我没有回答。昨天,我能够始终如一地再现这个问题。我认为死锁是由代码中的某个内容引起的,但如果不是,我会尝试更新。谢谢你有什么错误?在最近的MQ版本中有许多死锁。只是在上面添加了锁定的线程转储。没有具体的错误。错误是死锁。请尝试9.1.2,它已修复。如果是这样的话,我会给你写一个快速的答案。有更新吗?这个建议解决问题了吗?嘿,乔希,对不起,我没有回答。昨天,我能够始终如一地再现这个问题。我认为死锁是由代码中的某个内容引起的,但如果不是,我会尝试更新。谢谢
"[MuleRuntime].cpuLight.07: CPU_LITE @76c382e9": awaiting notification on [0x00000006d5f6b9c8], holding [0x0000000718d73900]
at sun.misc.Unsafe.park(Native Method)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:870)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1199)
at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:209)
at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:285)
at com.ibm.msg.client.jms.internal.JmsSessionImpl.close(JmsSessionImpl.java:383)
at com.ibm.msg.client.jms.internal.JmsSessionImpl.close(JmsSessionImpl.java:349)
at com.ibm.mq.jms.MQSession.close(MQSession.java:275)
at org.springframework.jms.connection.CachingConnectionFactory$CachedSessionInvocationHandler.physicalClose(CachingConnectionFactory.java:481)
at org.springframework.jms.connection.CachingConnectionFactory$CachedSessionInvocationHandler.invoke(CachingConnectionFactory.java:311)
at com.sun.proxy.$Proxy197.close(Unknown Source)
at org.mule.jms.commons.internal.connection.session.DefaultJmsSession.close(DefaultJmsSession.java:65)
at org.mule.jms.commons.internal.common.JmsCommons.closeQuietly(JmsCommons.java:165)
at org.mule.jms.commons.internal.source.JmsListener.doReply(JmsListener.java:326)
at MORE STUFF BELOW