0

あるエージェントから別のエージェントにファイルを移動する MQFTE ジョブを受け取りました。ファイルが移動されると、ファイルは MQFTE エージェントによって個々のメッセージに分割されます。

分割が完了したら、ユーザー出口によってメッセージをあるキューから別のキューに移動する必要があります。ユーザー出口は、DestinationTransferEndExit インターフェースを実装することによって実装されます。

問題は、バインディング モードで QueueManager へのハンドルを取得できないことです。Agent JVM の外部でコードを実行すると、問題なく動作します。

次のエラーが表示されます。

[01/03/2015 13:46:31:107 SAST] 0000001d StdErr        E   com.ibm.mq.MQException: MQJE001: Completion Code '2', Reason '2495'.

.

.

.

[01/03/2015 13:46:31:115 SAST] 0000001d StdErr        E   Caused by: com.ibm.mq.jmqi.local.LocalMQ$3: CC=2;RC=2495;AMQ8598: Failed to load the WebSphere MQ native JNI library: 'mqjbnd'.

.

.

.

[01/03/2015 13:46:31:117 SAST] 0000001d StdErr        E   Caused by: java.lang.UnsatisfiedLinkError: mqjbnd (Library is already loaded in another ClassLoader)

私が実行するコードは次のとおりです。

  MQEnvironment.properties.put(MQC.TRANSPORT_PROPERTY, 
            MQC.TRANSPORT_MQSERIES_BINDINGS);
  MQQueueManager sourceMgr = new MQQueueManager(aQManagerName); 
  int openOptions = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_OUTPUT ; 
  MQQueue source_queue = sourceMgr.accessQueue(aSourceQName, openOptions);
4

1 に答える 1

0

ここでの問題は、WebSphere MQ インストールの「mqjbnd」ネイティブ ライブラリーが、WebSphere MQ MFT エージェントに関連付けられた Java ClassLoader によって既にロードされていることです。mqjbnd ライブラリーには、エージェントが BINDINGS (共有メモリー) トランスポート・モードを使用してキュー・マネージャーに接続できるようにするネイティブ JNI コードが含まれています。

ただし、DestinationTransferEndExit コードは別の Java ClassLoader にロードされています。Java 仮想マシン (JVM) では、1 つの ClassLoader のみが特定のネイティブ ライブラリをロードできます。したがって、終了コードが (既にロードされている) mqjbnd ライブラリーをロードしようとすると、JVM は java.lang.UnsatisfiedLinkError をスローします。

終了コードでネイティブ mqjbnd ライブラリーをロードしようとせず、代わりに CLIENT トランスポート・モードを使用してキュー・マネージャーに接続することで、この問題を回避できます。

于 2015-03-09T22:03:48.023 に答える