Python pymqi命令都被阻止

Python pymqi命令都被阻止,python,ibm-mq,pymqi,Python,Ibm Mq,Pymqi,我有以下环境: 红帽 Python 2.7 我有一个模块,它从IBM MQ读取消息,然后处理它们。 情况如下: 启动应用程序 通过发出ifdown eth0命令,与IBM MQ所在的VM的模拟连接丢失 正如所料,连接已断开 预期行为: 正在引发pymqi.MQMIError 观察到的行为: 所有pymqi调用都被阻止了。除非使用ifup再次启用连接,否则正在运行的线程不会执行任何操作 这是代码的一部分: def connect_and_subscribe(self): """

我有以下环境:

  • 红帽
  • Python 2.7
我有一个模块,它从IBM MQ读取消息,然后处理它们。 情况如下:

  • 启动应用程序
  • 通过发出ifdown eth0命令,与IBM MQ所在的VM的模拟连接丢失
  • 正如所料,连接已断开
  • 预期行为:

    • 正在引发pymqi.MQMIError
    观察到的行为:

    • 所有pymqi调用都被阻止了。除非使用ifup再次启用连接,否则正在运行的线程不会执行任何操作
    这是代码的一部分:

    def connect_and_subscribe(self):
        """Connect to IBM MQ and subscribe"""
        self.qmgr         = pymqi.connect(self.qmgr_name, self.qmgr_channel, self.qmgr_connect)
        self.queue        = pymqi.Queue(self.qmgr, self.queue_name)
        self.queue_i      = pymqi.Queue(self.qmgr, self.queue_name)
        self.queue_i_type = self.queue_i.inquire(pymqi.CMQC.MQIA_Q_TYPE)
        self.connected    = True
        logging.info('CONNECTED TO MQ USING PYMQI VERSION <%s>' % (pymqi.__version__))
        return
    
    #--------------------------------------------------------------------
    
        m = None
        # Message Options
        gmo = pymqi.GMO()
        gmo.Options = pymqi.CMQC.MQGMO_WAIT | pymqi.CMQC.MQGMO_FAIL_IF_QUIESCING | pymqi.CMQC.MQPMO_SYNCPOINT
        gmo.WaitInterval = self.max_cycle_wait_secs * 1000
    
        while True:
            try:
                m = None
                md = pymqi.MD()
                m = self.queue.get(None, md, gmo)
                self.queue.commit()
    
            except pymqi.MQMIError as e:
                if e.reason == pymqi.CMQC.MQRC_NO_MSG_AVAILABLE:
    
              .....
    
    def connect_和_subscribe(self):
    “”“连接到IBM MQ并订阅”“”
    self.qmgr=pymqi.connect(self.qmgr\u名称、self.qmgr\u通道、self.qmgr\u connect)
    self.queue=pymqi.queue(self.qmgr,self.queue\u名称)
    self.queue_i=pymqi.queue(self.qmgr,self.queue_名称)
    self.queue_i_type=self.queue_i.inquire(pymqi.CMQC.MQIA_Q_type)
    self.connected=True
    logging.info('使用PYMQI版本“%”(PYMQI.\uuuu版本)连接到MQ))
    返回
    #--------------------------------------------------------------------
    m=无
    #消息选项
    gmo=pymqi.gmo()
    gmo.Options=pymqi.CMQC.MQGMO_WAIT | pymqi.CMQC.MQGMO_FAIL_IF_QUIESCING | pymqi.CMQC.MQPMO_SYNCPOINT
    gmo.WaitInterval=self.max_cycle_wait_secs*1000
    尽管如此:
    尝试:
    m=无
    md=pymqi.md()
    m=self.queue.get(无、md、gmo)
    self.queue.commit()
    除了pymqi.MQMIError作为e:
    如果e.reason==pymqi.CMQC.MQRC\u无可用信息:
    .....
    

    有什么想法吗?

    安装了什么版本的MQ客户端?当它阻塞时,您要等待多长时间才能启动接口?您是否曾经等待超过6分钟?如果不试试,我有pymqi 1.3。我没有尝试等待超过30秒。如果我等待超过6分钟,我将尝试看看会发生什么。谢谢。实际上我想知道IBM MQ客户端的版本。Pymqi需要来自IBM的MQ客户机。为了更快地从您描述的情况中恢复,您需要在客户端和SVRCONN通道上设置较低的HBINT。如果您在客户端和服务器上都使用v7.0.1.0或更高版本的MQ,并且SHRCONV至少为1,则15秒将获得30秒的超时。感谢您的提示。您可以提供MQ客户端版本吗。如果已将其安装在服务器上,则可以在MQ安装位置下的windows bin目录下运行dspmqver(Linux/opt/mqm/bin/dspmqver)。如果您使用的是一个较新的Redist客户端,它将位于您解压缩文件的bin目录中(Linux tar或Windows zip)。现在我在电脑前,我要写一个答案。