0

已经被这个问题困扰了几个小时了,有人有什么想法吗?

java.lang.NoSuchMethodError: com.ibm.mq.MQException.(Ljava/lang/String;Ljava/lang/String;II)V at com.ibm.msg.client.wmq.common.internal.Reason.createException(Reason .java:223) 在 com.ibm.msg.client.wmq.internal.WMQMessageConsumer.checkJmqiCallSuccess(WMQMessageConsumer.java:123) 在 com.ibm.msg.client.wmq.internal.WMQConsumerShadow.getMsg(WMQConsumerShadow.java:1198 ) 在 com.ibm.msg.client.wmq.internal.WMQConsumerShadow.receive(WMQConsumerShadow.java:922) 在 com.ibm.msg.client.wmq.internal.WMQSyncConsumerShadow.receiveInternal(WMQSyncConsumerShadow.java:233)。 ibm.msg.client.wmq.internal.WMQMessageConsumer.receive(WMQMessageConsumer.java:450) 在 com.ibm.msg.client.jms.internal.JmsMessageConsumerImpl.receiveInboundMessage(JmsMessageConsumerImpl.java:742) 在 com.ibm.msg。 client.jms.internal.JmsMessageConsumerImpl。在 com.ibm.mq.jms.MQMessageConsumer.receive 接收(JmsMessageConsumerImpl.java:423)(MQMessageConsumer.java:258)

当我使用 MQ 本机库放置消息并使用 JMS API 读取它们时出现此错误。jms 读取失败,抛出上述异常。我也在使用 jms 选择器,这似乎是导致问题的原因。没有选择器一切正常。TIA。

4

2 回答 2

2

最后我能够解决这个问题,这一切都与选择器的创建方式有关。不同之处在于 MQ API 将相关 id 作为字节数组,而 JMS 将其作为字符串。因此,选择器无法选择消息并抛出已发布的错误。该错误根本不是调试友好的,因此必须进行大量试验和错误。无论如何,现在这有效,所以我很高兴。以下是我必须为此做的代码更改:

//字符串选择器 = "JMSCorrelationID = '" + corleationID + "'"; 改变前

        StringBuffer fBuf = new StringBuffer("JMSCorrelationID = 'ID:");
        byte[] correlBytes = corleationID.getBytes();
        for(int i=0; i<24; i++) {
          if (i>=correlBytes.length) {
            fBuf.append("00");
          } else {
            byte b = correlBytes[i];
            String hexStr = Integer.toHexString(b);
            // -ve values produce 8 char results
            if (hexStr.length()>2) hexStr = hexStr.substring(hexStr.length()-2);
            // small values produce 1 char results
            if (hexStr.length()<2) fBuf.append("0");
            fBuf.append(hexStr);
          }
        }
        fBuf.append("'");
        String filter = fBuf.toString();
        System.out.println("creating receiver with filter: "+filter);
        QueueReceiver queueReceiver = queueSession.createReceiver(inQueue,filter);

// QueueReceiver queueReceiver = queueSession.createReceiver(inQueue, selector);

参考了 IBM 文档中的代码。

于 2010-09-24T05:05:33.167 回答
0

您的 MQ 库版本错误。尝试针对最新版本运行您的代码。

于 2010-09-23T08:00:04.320 回答