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?

10 Comentários

  1. Roberto Shizuo 26/11/2013 at 16:41 #

    O JMS mudou pra melhor! Bem melhor! Bom post

  2. Ana Paula de Souza 03/12/2013 at 10:06 #

    Excelente post

  3. Felipe 12/12/2013 at 13:53 #

    Show demais! Obrigado Comunidade Java!

  4. Tiago 10/03/2014 at 20:02 #

    try (JMSContext context = connectionFactory.createContext();){
    context.createProducer().send(fila,body);
    }

    Ponto e virgula dentro do parenteses do try ? E roda ?

  5. Mário Amaral 10/03/2014 at 23:46 #

    Oi Tiago

    Sim, roda sim. Não é obrigatório colocar caso tenha um só objeto declarado no try, se forem 2 ou mais, todos exceto o último tem que ter o ponto e vírgula obrigatóriamente. O último ; é sempre opcional.

  6. cviniciusm 15/03/2014 at 15:53 #

    Ótimo artigo. Obrigado pela dica.

  7. Patrick S. 06/05/2014 at 21:07 #

    Estou fazendo uma aplicação utilizando struts e spring, agora preciso utilizar JMS. Testei como está no artigo mas não deu certo. O que preciso mudar para rodar?

  8. Paulo Silveira 07/05/2014 at 01:03 #

    que erro deu Patrick? Poste a mensagem de erro no guj.com.br junto com o codigo testado

  9. vanderson 16/07/2015 at 13:42 #

    Gostei !!!

Deixe uma resposta