JavaEE 6: Как внедрить JMS-ресурс в автономный JMS-клиент? - PullRequest
9 голосов
/ 07 сентября 2011

Я не могу ввести 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();
        }        
    }

}

Я создал соответствующую фабрику соединений и ресурс назначения Откройте MQ (MoM) с помощью консоли администратора Glassfish 3.1.

Может ли кто-нибудь помочь мне понять, что мне не хватает?

Ответы [ 2 ]

7 голосов
/ 23 сентября 2011

Внедрение ресурсов работает только в управляемой среде, например, на сервере приложений Java EE или в контейнере Spring. В автономном приложении JNDI - ваш единственный выбор .

Аннотации в целом предназначены для обработки каким-либо инструментом / каркасом, а простая JVM, выполняющая ваш метод main(), просто не содержитнапример.Единственные известные мне аннотации, которые обрабатываются JVM из коробки, это время компиляции @Deprecated, @Override и @SuppressWarnings.

Ответ на ваш комментарий: Я не знаюУ меня нет доступа к книге, поэтому я буду только догадываться, что они, вероятно, описывают работу клиентского компонента приложения и , а не автономного приложения-клиента .Это не то же самое - проверьте FAQ по Glassfish EJB .ACC обычно развертываются на сервере приложений и могут выполняться через Java Web Start или без него, но специфичным для AS способом.См. Пример Glassfish (вы не сказали, что выполняет ваш EJB).

1 голос
/ 08 сентября 2011

@ пропустить: попробуйте @Resource(name="jms/QueueConnectionFactory") instead of @Resource(mappedName="jms/QueueConnectionFactory")

name = имя JNDI согласно javax.annotation.Resource java doc.

...