JavaEE 6:如何在独立的JMS客户端中注入JMS资源?

时间:2011-09-07 07:51:26

标签: jms java-ee-6 glassfish-3 message-driven-bean

我无法将javax.jms.ConnectionFactory注入我的独立JMS客户端。 我在下面的代码中java.lang.NullPointerException获得了connectionFactory.createConnection()

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)创建了相应的连接工厂和目标资源。

有人可以帮我理解我错过了什么吗?

2 个答案:

答案 0 :(得分:7)

资源注入仅适用于托管环境,例如Java EE应用程序服务器或Spring容器。 在独立应用程序中,JNDI是您唯一的选择

通常,注释应由某个工具/框架处理,而执行main()方法的普通JVM根本不包含此类注释。我所知道的唯一由JVM处理的注释是编译时@Deprecated@Override@SuppressWarnings

回复您的评论:我无法访问该书,所以我只是猜测他们可能会描述运行应用程序客户端组件 独立应用程序客户端。它不一样 - check Glassfish EJB FAQ。 ACC通常部署到应用程序服务器中,可以通过Java Web Start或没有它来执行,但是以AS特定的方式执行。请参阅Glassfish example(您没有说明您的EJB执行的内容)。

答案 1 :(得分:1)

@skip:尝试@Resource(name="jms/QueueConnectionFactory") instead of @Resource(mappedName="jms/QueueConnectionFactory")

name = JNDI名称,根据javax.annotation.Resource java doc。