Pergunta

Eu não posso ficar javax.jms.ConnectionFactory injetado em meu autônomo JMS cliente.Eu recebo um java.lang.NullPointerException no connectionFactory.createConnection() no código abaixo.

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();
        }        
    }

}

Eu criei o correspondente Fábrica de Conexão e Destino de Recursos em Abrir MQ (MoM) usando o Glassfish 3.1 Console de Administração.

Alguém poderia me ajudar a entender o que eu estou ausente?

Foi útil?

Solução

Recurso de injeção funciona apenas em um ambiente controlado, tal como um servidor de aplicação Java EE, ou de uma Mola recipiente, por exemplo. Em um aplicativo independente de JNDI é sua única opção.

As anotações, em geral, destinam-se a ser processado por alguma ferramenta/framework, e simples JVM que executa a sua main() método simplesmente não conter tal.A única anotações que eu conheço que são processados pela JVM fora da caixa são em tempo de compilação @Deprecated, @Override e @SuppressWarnings.

Respondendo ao seu comentário: Eu não tenho acesso ao livro, então eu vou só acho que eles provavelmente descrever a execução de um aplicação de componente de cliente e não aplicativo autônomo de cliente.Não é a mesma — verifique o Glassfish EJB FAQ.ACCs são normalmente implantados em um servidor de aplicação e pode ser executado via Java Web Start ou sem ele, mas no de uma maneira específica.Ver O Glassfish exemplo (você não disse que COMO o EJB é executada).

Outras dicas

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

name = nome JNDI como por javax.annotation.Resource java doc.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top