我得到了一个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);
答案 0 :(得分:0)
这里的问题是" mqjbnd"来自WebSphere MQ安装的本机库已由与WebSphere MQ MFT代理关联的Java ClassLoader加载。 mqjbnd库包含本机JNI代码,允许代理使用BINDINGS(共享内存)传输模式连接到队列管理器。
然而,您的DestinationTransferEndExit代码正在单独的Java ClassLoader上加载。 Java虚拟机(JVM)只允许一个ClassLoader加载特定的本机库。因此,当您的退出代码尝试加载mqjbnd库(已经加载)时,JVM会抛出java.lang.UnsatisfiedLinkError。
您可以通过不尝试在退出代码中加载本机mqjbnd库并使用CLIENT传输模式来连接到队列管理器来避免此问题。