A nova API do JMS 2.0 no Java EE 7

A nova API do JMS 2.0 no Java EE 7
mario.amaral
mario.amaral

Compartilhe

Junto com o Java EE 7 saiu uma nova versão da especificação de mensageria, o JMS. Agora na versão 2.0, a integração com o CDI e uma reformulação geral nas APIs simplificaram muito a vida do desenvolvedor.

A principal mudança foi a inclusão das interfaces JMSContext, JMSProducer e JMSConsumer, reduzindo muito o código e a complexidade  para enviar ou receber mensagens. Vamos comparar algumas operações comuns na api do JMS 1.1 e na nova versão, para se ter uma idéia das mudanças:

Antes para enviar uma mensagem de texto pra uma fila, era necessário o seguinte código:

Banner da Escola de Programação: Matricula-se na escola de Programação. Junte-se a uma comunidade de mais de 500 mil estudantes. Na Alura você tem acesso a todos os cursos em uma única assinatura; tem novos lançamentos a cada semana; desafios práticos. Clique e saiba mais!
 @Resource(lookup = "jms/connectionFactory") ConnectionFactory connectionFactory;

@Resource(lookup = "jms/fila") Destination fila;

public void sendMessage(String mensagem) throws JMSException { try (Connection connection = connectionFactory.createConnection()) { Session session = connection.createSession(); MessageProducer producer = session.createProducer(fila); TextMessage textMessage = session.createTextMessage(mensagem); producer.send(textMessage); } } 

Agora, com a nova api:

 @Resource(lookup = "jms/connectionFactory") ConnectionFactory connectionFactory;

@Resource(lookup="jms/fila") Destination fila; public void sendMessageNew (String body) { try (JMSContext context = connectionFactory.createContext();){ context.createProducer().send(fila,body); } } 

O JMSContext encapsula toda a complexidade para se enviar uma mensagem, deixando o código bem mais limpo. É possível deixar o código ainda melhor, injetando o JMSContext usando o CDI:

 @Inject @JMSConnectionFactory("jms/connectionFactory") JMSContext context;

@Resource(mappedName = "jms/fila") Destination fila;

public void sendMessageNew(String mensagem) { context.createProducer().send(fila, mensagem); } 

A anotação @JMSConnectionFactory indica ao CDI qual a ConnectionFactory que deve ser usada para criar o JMSContext.

Para receber uma mensagem sem o uso de um Message-Driven Bean , o código era o seguinte:

 @Resource(lookup = "jms/connectionFactory") ConnectionFactory connectionFactory;

@Resource(lookup = "jms/fila") Destination fila;

public String receiveMessage() throws JMSException { try (Connection connection = connectionFactory.createConnection()) { connection.start(); Session session = connection.createSession(); MessageConsumer consumer = session.createConsumer(fila); TextMessage textMessage = (TextMessage) consumer.receive(); String body = textMessage.getText(); return body; } } 

Com a nova api, não são necessárias mais que duas linhas:

 @Inject @JMSConnectionFactory("jms/connectionFactory") private JMSContext context;

@Resource(lookup = "jms/fila") Destination fila;

public String receiveMessageNew() { JMSConsumer consumer = context.createConsumer(fila); return consumer.receiveBody(String.class); } 

Para ver mais exemplos de código, visite a página do JCP e baixe a ultima versão da especificação. Existe um capítulo inteiro dedicado a comparar a versão antiga e nova da api, além de todas as novidades e melhorias da nova versão.

E ai, o que achou das mudanças? Já está utilizando em algum projeto?

Veja outros artigos sobre Programação