У меня работает MDB в WebSphere, когда он пытается извлечь сообщение из очереди MQ выдается следующее исключение:
com.ibm.mq.MQException: каталог сообщений не найден
Есть идеи, как решить эту проблему?
Добавьте каталог, содержащий файл mqji.properties , в CLASSPATH
Поскольку сообщение об ошибке вы получите с , каталог сообщений также довольно бесполезен, вот небольшой патч для mq.jar:
Добавить этот код в MQException:
// PATCH New fields private final static IntHashMap completionCodes = new IntHashMap (); private final static IntHashMap reasonCodes = new IntHashMap (); static { addCodes (completionCodes, "MQCC_"); addCodes (reasonCodes, "MQRC_"); } /** * PATCH Create a map of names for the MQ error codes * * @param map * @param prefix */ private static void addCodes(IntHashMap map, String prefix) { Field[] field = MQException.class.getFields(); try { for (int i = 0; i < field.length; i++) { String name = field[i].getName(); if (name.startsWith(prefix)) { name = name.substring(prefix.length()); int value = field[i].getInt(null); map.put (value, name); } } } catch (IllegalArgumentException e) { throw new RuntimeException (e); } catch (IllegalAccessException e) { throw new RuntimeException (e); } }
Заменить getMessage() на этот код:
getMessage()
// PATCH Complete rewrite public String getMessage() { if(ostrMessage == null) { String rc = (String)reasonCodes.get(reasonCode); if (rc == null) rc = "ReasonCode "+reasonCode; String cc = (String)completionCodes.get(completionCode); if (cc == null) cc = "CompletionCode "+completionCode; String message = "MQJE001: "+cc+" "+rc; if(msgId == 0) ostrMessage = message; else { String s = msgId+" {0} {1}"; if (exceptionMessages != null) { s = exceptionMessages.getString(Integer.toString(msgId)); } if(numInserts > 0) { Object as1[] = new String[numInserts]; if(numInserts > 0) as1[0] = insert1; if(numInserts > 1) as1[1] = insert2; s = MessageFormat.format(s, as1); } ostrMessage = message+"\n"+s; } if (underlyingException != null) ostrMessage = ostrMessage + "\n" + underlyingException.getMessage(); } return ostrMessage; }
Либо скомпилируйте эти два класса в новый jar, либо исправьте оригинальный mq.jar.
Вместо MQJE001: RC 2 CC 2035 вы получите «MQJE001: FAILED NOT_AUTHORIZED»
Оказывается, эта ошибка возникла из-за того, что я определил фабрику соединений с очередью на уровне сервера (на сервере WebSphere v6) и неправильный загрузчик классов использовался для загрузить вышеупомянутый файл свойств.
Я решил проблему, переопределив фабрику на уровне ячейки.
Файлы mqji.properties уже включены в файл mq jar.
Исключение «Каталог сообщений не найден» выдается как часть «MQJMS2002: не удалось получить сообщение из очереди MQ».
Google говорит, что это пропущенная запись в пути к классам: http://www.mqseries.net/phpBB2/viewtopic.php?t=5979&highlight=mqji