WebSphere で MDB を実行していますが、MQ キューからメッセージを取得しようとすると、次の例外がスローされます。
com.ibm.mq.MQException: メッセージ カタログが見つかりません
これを解決する方法はありますか?
WebSphere で MDB を実行していますが、MQ キューからメッセージを取得しようとすると、次の例外がスローされます。
com.ibm.mq.MQException: メッセージ カタログが見つかりません
これを解決する方法はありますか?
mqji.propertiesファイルを含むディレクトリーをCLASSPATH に追加します。
mqji.propertiesファイルはすでにmqjarファイルに含まれています。
「MQJMS2002:MQキューからメッセージを取得できませんでした」の一部として「メッセージカタログが見つかりません」という例外がスローされます。
メッセージカタログで表示されるエラーメッセージもかなり役に立たないので、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()
ます。
// 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;
}
これらの2つのクラスを新しいjarにコンパイルするか、元のmq.jarにパッチを適用します。
MQJE001:RC 2 CC 2035の代わりに、「MQJE001:FAILEDNOT_AUTHORIZED」が表示されます。
サーバー レベル (WebSphere v6 サーバー上) で定義された Queue Connection Factory があり、上記のプロパティ ファイルをロードするために間違ったクラスローダーが使用されていたため、このエラーがスローされたことが判明しました。
factory をセルレベルで再定義することで問題を解決しました。
Google によると、クラスパスにエントリがありません: http://www.mqseries.net/phpBB2/viewtopic.php?t=5979&highlight=mqji