Java 如何配置';MQCNO#u HANDLE_SHARE_NO#u BLOCK';在IBM MQ连接工厂中?

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

我在两个线程同时尝试关闭为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'常量设置为实际值,但客户端无法启动,告诉我连接选项无效

  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