Как настроить 'MQCNO_HANDLE_SHARE_NO_BLOCK' в IBM MQ Connection Factory? - PullRequest
1 голос
/ 09 апреля 2019

Я испытываю состояние гонки между двумя потоками одновременно, пытаясь закрыть сеанс JMS, который был создан для брокера IBM MQ.Похоже, есть возможность предотвратить одновременное использование одним и тем же обработчиком соединения разными потоками.Конфигурация называется 'MQCNO_HANDLE_SHARE_NO_BLOCK' (отметьте https://www.ibm.com/support/knowledgecenter/en/SSFKSJ_7.5.0/com.ibm.mq.ref.dev.doc/q095480_.htm). Я ищу какой-либо способ настройки этого свойства с помощью MQConnectionFactory в клиенте IBM MQ Java (v.9.1.1.0).

Я уже пытался использовать 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)

Кто-нибудь имел дело с этой проблемой,или использовал этот флаг?

EDIT - добавлены дампы потоков из двух заблокированных потоков. У меня заблокированы следующие потоки: 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 пытаются закрыть сеансs / производитель / потребитель (есть ситуация обработки 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
...