JavaEE6:如何在独立的JMS客户机中注入JMS资源?
我无法将JavaEE6:如何在独立的JMS客户机中注入JMS资源?,jms,java-ee-6,glassfish-3,message-driven-bean,Jms,Java Ee 6,Glassfish 3,Message Driven Bean,我无法将javax.jms.ConnectionFactory注入到我的独立jms客户机中。 在下面的代码中,我在connectionFactory.createConnection()处得到了一个java.lang.NullPointerException JmsClient.java public class JmsClient { @Resource(mappedName="jms/QueueConnectionFactory") private static Conne
javax.jms.ConnectionFactory
注入到我的独立jms客户机中。
在下面的代码中,我在connectionFactory.createConnection()
处得到了一个java.lang.NullPointerException
JmsClient.java
public class JmsClient {
@Resource(mappedName="jms/QueueConnectionFactory")
private static ConnectionFactory connectionFactory;
@Resource(mappedName="jms/ShippingRequestQueue")
private static Destination destination;
public static void main(String[] args) {
try {
Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer producer = session.createProducer(destination);
ObjectMessage message = session.createObjectMessage();
ShippingRequestQueue shippingRequest = new ShippingRequestQueue(1, "107, Old Street");
message.setObject(shippingRequest);
producer.send(message);
session.close();
connection.close();
System.out.println("Shipping request message sent ..");
} catch (Throwable ex) {
ex.printStackTrace();
}
}
}
我已经使用Glassfish 3.1管理控制台在Open MQ(MoM)上创建了相应的连接工厂和目标资源
有人能帮我理解我遗漏了什么吗?@skip:尝试@Resource(name=“jms/QueueConnectionFactory”)而不是@Resource(mappedName=“jms/QueueConnectionFactory”)
根据javax.annotation.Resource java doc,name=JNDI名称。资源注入仅在托管环境中工作,例如java EE应用程序服务器或Spring容器在独立应用程序中,JNDI是您唯一的选择
注释通常是由一些工具/框架处理的,而执行main()
方法的普通JVM根本不包含这样的注释。据我所知,JVM能够即时处理的注释只有编译时@弃用的,@重写和@SuppressWarnings
回复您的评论:我没有这本书的访问权限,所以我只能猜测他们可能描述了运行应用程序客户端组件,而不是独立的应用程序客户端。这不一样。ACC通常部署到应用程序服务器中,可以通过JavaWebStart执行,也可以不使用它,但具体方式是AS。请参阅(您没有说明EJB在中执行时的内容)。@Resource
不起作用,但使用JNDI名称查找会起作用。Context jndiContext=new InitialContext();ConnectionFactory ConnectionFactory=(ConnectionFactory)jndiContext.lookup(“jms/QueueConnectionFactory”);Queue destination=(Queue)jndiContext.lookup(“jms/ShippingRequestQueue”)代码>谢谢,这对我很有效。我也尝试了@Resource(lookup=“jms/QueueConnectionFactory”)
,但我仍然得到了与上述相同的错误,因为我无法获得注入的资源。@skip,这很奇怪。因为如果您查看link:-与JNDI名称相关的属性名称。您是否尝试通过NamingContext API显式解析此JNDI名称?@ag112-我尝试了特定于服务器的mappedName
、可移植的name
和来自JavaEE 6的新“查找”,但我无法获得注入的资源。它工作的唯一方式是当我执行以下操作时:Context jndiContext=new InitialContext();ConnectionFactory ConnectionFactory=(ConnectionFactory)jndiContext.lookup(“jms/QueueConnectionFactory”);Queue destination=(Queue)jndiContext.lookup(“jms/ShippingRequestQueue”)代码>。我也尝试过在java:comp/env
后面显式附加上面的JNDI名称,我不应该这样做,但这也不起作用。这里我缺少什么?公共类ShippingRequestJMSProducer{@Resource(name=“jms/ShippingRequestQueue”,mappedName=“ShippingRequestQueue”)私有静态目标;@Resource(name=“jms/QueueConnectionFactory”)私有静态连接工厂连接工厂;公共静态void main(字符串[]args){//代码的其余部分}
。这是EJB3中第4章代码的一部分。资源的依赖项注入正在这个独立客户端中进行。它是怎么工作的?对。在构建路径中使用gf-client.jar时,您只能使用带有JNDI名称的lookup
方法来访问资源。但是,要使依赖项注入在独立客户机中工作,需要将其部署到EJB容器以获得额外的JavaEE资源。这是有用的。使用Glassfish 3.1appclient-client-myappclient.jar
。谢谢