MQException: MQJE001: код завершения '2', причина '2033' при попытке получить сообщение из очереди - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь поймать сообщение из очереди. Обратите внимание, что сообщение имеет xml содержимое.

Тем не менее, исключение выдается в блоке catch (MQException e), когда сообщение правильно получено в очереди.

MQException: MQJE001: код завершения '2', причина '2033 '

Пожалуйста, найдите ниже используемый код:

import com.ibm.mq.MQMessage
import com.ibm.mq.MQGetMessageOptions
import com.ibm.mq.MQQueueManager
import com.ibm.mq.constants.CMQC
import com.ibm.mq.headers.MQRFH2
import com.ibm.MQException

def mqProps = new Hashtable<String, Object>()
mqProps.put(MQConstants.CHANNEL_PROPERTY, 'mychannel')
mqProps.put(MQConstants.PORT_PROPERTY, myport)
mqProps.put(MQConstants.HOST_NAME_PROPERTY, 'myhost')

def qMgr = new MQQueueManager('myqueuemanager', mqProps)
def openOptions = MQConstants.MQOO_OUTPUT | MQConstants.MQOO_INPUT_AS_Q_DEF

def gmo = new MQGetMessageOptions()
gmo.options = CMQC.MQGMO_WAIT + CMQC.MQGMO_FAIL_IF_QUIESCING

def queue = qMgr.accessQueue('myqueue', openOptions)
MQMessage receiveMsg = null
boolean getMore = true
while(getMore) {
    receiveMsg = new MQMessage()

    try {
        // get the message on the queue
        queue.get(receiveMsg, gmo)
        def rfh2 = new MQRFH2(receiveMsg)
        def strucLen = rfh2.getStrucLength()
        def encoding = rfh2.getEncoding()
        def CCSID = rfh2.getCodedCharSetId()
        def format = rfh2.getFormat()
        def flags = rfh2.getFlags()
        def nameValueCCSID = rfh2.getNameValueCCSID()

        def b = new byte[receiveMsg.getDataLength()]
        receiveMsg.readFully(b)
        System.out.println("Data: " + new String(b))
        queue.close()
   } catch (MQException e) {
      if (e.completionCode == CMQC.MQCC_FAILED && e.reasonCode == CMQC.MQRC_NO_MSG_AVAILABLE) {
         // No message - loop again
      }
      else {
         log.info("MQException: " + e.getLocalizedMessage())
         log.info("CC=" + e.completionCode + " : RC=" + e.reasonCode)
         getMore = false
      }
   } catch (IOException e) {
      log.info("IOException:" + e.getLocalizedMessage())
   }

}

Не могли бы вы помочь мне исправить это? Спасибо.

1 Ответ

3 голосов
/ 22 апреля 2020

def openOptions = MQConstants.MQOO_OUTPUT | MQConstants.MQOO_INPUT_AS_Q_DEF

Нет причин открывать очередь для ввода и вывода. Кроме того, вы должны включить MQOO_FAIL_IF_QUIESCING.

def qMgr = новый MQQueueManager ('myqueuemanager', mqProps) def queue = qMgr.accessQueue ('myqueue', openOptions)

* 1010 Я настоятельно рекомендую вам использовать UPPERCASE, администратор очередей и имена очередей. Кроме того, это IBM Best Practice.

queue.close ()

Метод close следует вызывать в предложении finally, иначе вы можете получить утечку памяти.

Я опубликовал MQTEST12L. java (полностью работающий) много раз в StackOverflow. Вы можете получить его от здесь .

Используйте MQTest12L в качестве примера того, как правильно кодировать приложение Java для получения сообщений из очереди.

...