0

我有一个 MQFTE 作业,将文件从一个代理移动到另一个代理。移动文件后,MQFTE 代理将文件拆分为单独的消息。

拆分完成后,需要通过用户出口将消息从一个队列移动到另一个队列。用户出口是通过实现 DestinationTransferEndExit 接口来实现的。

问题是我无法在绑定模式下获得 QueueManager 的句柄。如果我在代理 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 类加载器加载。mqjbnd 库包含允许代理使用 BINDINGS(共享内存)传输模式连接到队列管理器的本机 JNI 代码。

但是,您的 DestinationTransferEndExit 代码正在加载到单独的 Java ClassLoader 上。Java 虚拟机 (JVM) 只允许一个 ClassLoader 加载特定的本地库。因此,当您的退出代码尝试加载 mqjbnd 库(已加载)时,JVM 会抛出 java.lang.UnsatisfiedLinkError。

您可以通过不在退出代码中加载本机 mqjbnd 库并改用 CLIENT 传输模式连接到队列管理器来避免此问题。

于 2015-03-09T22:03:48.023 回答