如何在IBM MQ Connection Factory中配置“ MQCNO_HANDLE_SHARE_NO_BLOCK”?

时间:2019-04-08 21:02:14

标签: java ibm-mq

我在两个线程之间处于竞争状态,同时试图关闭为IBM MQ代理创建的JMS会话。似乎有一个选项可以防止不同的线程同时使用同一连接处理程序。该配置称为“ MQCNO_HANDLE_SHARE_NO_BLOCK”(选中https://www.ibm.com/support/knowledgecenter/en/SSFKSJ_7.5.0/com.ibm.mq.ref.dev.doc/q095480_.htm)。 我正在寻找在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工作者,处理由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 REPLY_TO处理场景)。

"[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

0 个答案:

没有答案