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.1
appclient-client-myappclient.jar
。谢谢