问题描述
|
我正在尝试从非托管应用程序(控制台应用程序)读取\“ Sun App Server \”中创建的jms队列中的消息,但出现以下错误:
NoInitialContextException
Cannot instantiate class: javax.jms.TopicConnectionFactory
使用此代码:
Properties env = new Properties( );
env.put(Context.INITIAL_CONTEXT_FACTORY,\"javax.jms.TopicConnectionFactory\");
InitialContext jndi = new InitialContext(env);
并且我引用了包含该类的j2ee.jar库,但是可以肯定的是,该类是一个接口。
我可以从非托管应用程序访问队列吗?
解决方法
Aitor;
当您说“ Sun App Server”时,我不确定这是什么意思,但是我假设它是Glassfish。
获取远程JMS资源有两个单独的步骤。
您需要创建一个远程JNDI连接,该连接需要一个有效的InitialContextFactory类名称。
建立连接后,可以查找TopicConnectionFactory。
对于项目#1,此链接演示了如何建立远程JNDI连接。
对于项目2,一旦有了JNDI上下文,您还需要知道TopicConnectionFactory的JNDI名称,该名称类似于:
TopicConnectionFactory tcf = (TopicConnectionFactory) jndi.lookup(\"jms/TopicConnectionFactory\");
您需要牢记的一个方面是j2ee.jar库包含JMS类的通用Java EE接口,但是您还将在类路径中需要一个包含JMS实现具体类的库。 JNDI连接也是如此。本教程提供的简要清单如下:
Applicationserver JNDI查找
/lib/appserv-rt.jar
/lib/appserv-admin.jar
/lib/javaee.jar /lib/j2ee.jar
客户库
/imq/lib/jms.jar
/imq/lib/imq.jar
/imq/lib/imqutil.jar
/lib/install/applications/jmsra/jmsra.jar