Вопрос
Застряли с этой проблемой в течение нескольких часов сейчас, все какие-либо идеи?
java.lang.noSuchmethodError: com.ibm.mq.mqException. (ljava / lang / string; ljava / lang / string; ii) v на com.ibm.msg.client.wmq.common.internal.reason.rueeeeexception .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.wmqsyncconsumershadow.receiveNidernal (wmqsyncconsumershadow.java:233) в com.ibm.msg.client.wmq.internal.wmqconsumershadow.receive (wmqconsumershadow.java:922) в ком. IBM.MSG.client.wmq.internal.wmqmessageConsumer.receive (wmqmessageConsumer.java:450) на com.ibm.msg.client.jms.internal.jmsmessageConsumerimpl.jmsmessageConsumessage (jmsmessageConsumerimpl.java:742) в com.ibm.msg. Client.jms.internal.jmsmessageconsumerimpl.receive (jmsmessageConsumerimpl.java:423) на com.ibm.mq.jms.mqmessageConsumer.receive (MQMessageConsumer.java:258)
Получаю эту ошибку, когда я кладу сообщение, используя MQ нативные библиотеки, и я прочитал их с помощью JMS API. JMS читает не удается бросать исключение выше. Я также использую селектор JMS, который, кажется, вызывает проблему. С вне селектора все работает нормально. TIA.
Решение
Наконец, я смог решить это, все это пришлось делать с тем, как создан селектор. Разница состояла в том, что MQ API имеет корреляционный идентификатор в качестве массива байтов, где в качестве JMS принимает его в виде строки. Из-за этого селектор не смог выбрать сообщение и бросил опубликованную ошибку. Ошибка не совсем удобная для отладки, следовательно, должна была сделать много испытаний и ошибок. В любом случае сейчас это работает, поэтому я рад. Ниже приведен ли код изменения, который мне пришлось сделать для этого:
// Строковый селектор = "jmscorrelationId = '" + CorleationInid + "'"; до смены
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 = QueoUsession.CreeSeaceiver (Inqueue, Selector);
Ссылается код из IBM Docs.
Другие советы
У вас неправильная версия библиотек MQ. Попробуйте запустить свой код против новых версий.