A nova API do JMS 2.0 no Java EE 7
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:
@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?