具有InitialDirContext的Tomcat 7中的ActiveMQ 5.10客户端

时间:2015-04-19 15:00:59

标签: java tomcat activemq jndi

我正在使用现有的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:/directory网址,指向由WebsphereMQ Explorer中的“托管JMS对象”生成的.bindings文件
  • requestQueueName&amp; responseQueueName

我现在正在将initialContextFactory更改为org.apache.activemq.jndi.ActiveMQInitialContextFactory,将providerURL更改为tcp://localhost:61616。虽然我没有从代码中得到任何错误,但它不起作用。我在ActiveMQ Web管理控制台中看不到任何连接。

在网上研究,我看到通常与Tomcat的ActiveMQ JNDI设置不同:

    context.xml中的
  • Resource条目
  • 将InitialContext创建为new InitialContext();
  • 获取“子上下文”为envContext = (Context) initCtx.lookup("java:comp/env");
  • 从此子上下文中获取JMS对象(使用“jms /”前缀)

但正如我之前写的,这对我来说不是一个选项:虽然我可以访问代码,但我无法修改它。

有人知道解决这个问题吗?如何从InitialDirContext的实例获取ActiveMQ QueueConnectionFactory / Queue对象,仅使用INITIAL_CONTEXT_FACTORY和PROVIDER_URL初始化,并且可能在Tomcat端没有任何其他配置(尽管如果有必要,我可以选择更改tomcat配置同样)。

马腾

1 个答案:

答案 0 :(得分:1)

结果我需要将geronimo-j2ee-management_1.1_spec-1.0.1.jar也包含在此应用程序的CLASSPATH中。如果没有这个,就会抛出一个未在任何地方记录的异常,所以需要一些别出心裁来解决这个问题。

马腾