从MQ FTE获取队列管理器

时间:2015-03-09 10:00:15

标签: java websphere-mq-fte

我得到了一个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);

1 个答案:

答案 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传输模式来连接到队列管理器来避免此问题。