【发布时间】:2015-04-21 14:55:23
【问题描述】:
我正在使用现有的 Web 应用程序(在 Tomcat 7.0.26 中运行),该应用程序通常通过 JMS API 通过 IBM WebsphereMQ 与外部系统进行通信。代码类似于:
Hashtable<String, String> env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, initialContextFactory);
env.put(Context.PROVIDER_URL, providerURL);
// Note that this is instantiating an InitialDirContext,
// NOT an InitialContext!!!
Context context = new InitialDirContext(environment);
qcf = (QueueConnectionFactory)context.lookup(qcfName);
requestQueue = (Queue)context.lookup(requestQueueName);
responseQueue = (Queue)context.lookup(responseQueueName);
//... etc, usual type of JMS code
我现在正在尝试使用 ActiveMQ 5.10 客户端库来完成这项工作。我的一个限制是我不能修改源代码。我唯一需要玩的是上面代码中显示的变量:
-
initialContextFactory在当前情况下始终设置为com.sun.jndi.fscontext.RefFSContextFactory -
providerURL当前设置为file://C:/directoryURL,指向由 WebsphereMQ Explorer 中的“托管 JMS 对象”生成的.bindings文件 -
requestQueueName&responseQueueName
我现在将initialContextFactory 更改为org.apache.activemq.jndi.ActiveMQInitialContextFactory,并将providerURL 更改为tcp://localhost:61616。虽然我没有从代码中得到任何错误,但它不起作用。我在 ActiveMQ Web 管理控制台中看不到任何连接。
在网上研究,我发现通常 ActiveMQ JNDI 与 Tomcat 的设置不同:
-
Resourcecontext.xml 中的条目 - 将 InitialContext 创建为
new InitialContext(); - 得到一个“子上下文”作为
envContext = (Context) initCtx.lookup("java:comp/env"); - 从此子上下文中获取 JMS 对象(使用“jms/”前缀)
但正如我之前写的,这不是我的选择:虽然我可以访问代码,但我无法修改它。
有人知道解决这个问题的方法吗?如何从InitialDirContext 的实例中获取 ActiveMQ QueueConnectionFactory/Queue 对象,仅使用 INITIAL_CONTEXT_FACTORY 和 PROVIDER_URL 进行初始化,并且可能在 Tomcat 端没有任何其他配置(尽管如有必要,我也可以选择更改 tomcat 配置)。
马丁
【问题讨论】: