logo

Tutorial JMS

JMS (Java Message Service) é uma API que fornece a facilidade de criar, enviar e ler mensagens. Ele fornece comunicação fracamente acoplada, confiável e assíncrona.

como gerar número aleatório em java

JMS também é conhecido como serviço de mensagens.


Compreendendo as mensagens

Mensagens é uma técnica para comunicar aplicativos ou componentes de software.

JMS é usado principalmente para enviar e receber mensagens de um aplicativo para outro.


Requisito de JMS

Geralmente, o usuário envia uma mensagem para o aplicativo. Mas, se quisermos enviar mensagens de uma aplicação para outra, precisamos usar a API JMS.

Considere um cenário: um aplicativo A está em execução na ÍNDIA e outro aplicativo B está em execução nos EUA. Para enviar mensagem de uma aplicação para B, precisamos usar JMS.


Vantagem do JMS

1) Assíncrono: Para receber a mensagem, o cliente não é obrigado a enviar solicitação. A mensagem chegará automaticamente ao cliente.

2) Confiável: Ele fornece garantia de que a mensagem será entregue.


Domínios de mensagens

Existem dois tipos de domínios de mensagens no JMS.

  1. Domínio de mensagens ponto a ponto
  2. Domínio de mensagens do editor/assinante

1) Domínio de mensagens ponto a ponto (PTP)

No modelo PTP, uma mensagem é entregue a um receptor apenas. Aqui, Fila é usado como um middleware orientado a mensagens (MOM).

A Fila é responsável por reter a mensagem até que o receptor esteja pronto.

No modelo PTP, há sem dependência de tempo entre remetente e destinatário.


2) Domínio de mensagens do editor/assinante (Pub/Sub)

No modelo Pub/Sub, uma mensagem é entregue a todos os assinantes . É como uma radiodifusão. Aqui, Tema é usado como um middleware orientado a mensagens responsável por reter e entregar mensagens.

No modelo PTP, há dependência de tempo entre editor e assinante.



Modelo de programação JMS


Exemplo de fila JMS

Para desenvolver um exemplo de fila JMS, é necessário instalar qualquer servidor de aplicativos. Aqui, estamos usando peixevidro3 servidor onde estamos criando dois JNDI.

  1. Criar connection factory nomeado minhaQueueConnectionFactory
  2. Criar recurso de destino nomeado minhaQueue

Após criar o JNDI, crie o aplicativo servidor e receptor. Você precisa executar o servidor e o receptor em um console diferente. Aqui, estamos usando o Eclipse IDE, ele é aberto em um console diferente por padrão.

1) Criar connection factory e recurso de destino

Abra o console de administração do servidor pelo URL http://localhost:4848

Faça login com o nome de usuário e senha.

Clique no Recurso JMS -> Connection Factories -> Novo , agora escreva o nome do pool e selecione o tipo de recurso como QueueConnectionFactory e clique no botão ok.

Clique no Recurso JMS -> Recursos de Destino -> Novo , agora escreva o nome JNDI e o nome do destino físico e clique no botão ok.

2) Crie um aplicativo remetente e destinatário

Vamos ver o código do remetente e do destinatário. Observe que o receptor está anexado ao ouvinte que será invocado quando o usuário enviar a mensagem.

Arquivo: MeuSender.java
 import java.io.BufferedReader; import java.io.InputStreamReader; import javax.naming.*; import javax.jms.*; public class MySender { public static void main(String[] args) { try { //Create and start connection InitialContext ctx=new InitialContext(); QueueConnectionFactory f=(QueueConnectionFactory)ctx.lookup('myQueueConnectionFactory'); QueueConnection con=f.createQueueConnection(); con.start(); //2) create queue session QueueSession ses=con.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); //3) get the Queue object Queue t=(Queue)ctx.lookup('myQueue'); //4)create QueueSender object QueueSender sender=ses.createSender(t); //5) create TextMessage object TextMessage msg=ses.createTextMessage(); //6) write message BufferedReader b=new BufferedReader(new InputStreamReader(System.in)); while(true) { System.out.println('Enter Msg, end to terminate:'); String s=b.readLine(); if (s.equals('end')) break; msg.setText(s); //7) send message sender.send(msg); System.out.println('Message successfully sent.'); } //8) connection close con.close(); }catch(Exception e){System.out.println(e);} } } 
Arquivo: MeuReceptor.java
 import javax.jms.*; import javax.naming.InitialContext; public class MyReceiver { public static void main(String[] args) { try{ //1) Create and start connection InitialContext ctx=new InitialContext(); QueueConnectionFactory f=(QueueConnectionFactory)ctx.lookup('myQueueConnectionFactory'); QueueConnection con=f.createQueueConnection(); con.start(); //2) create Queue session QueueSession ses=con.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); //3) get the Queue object Queue t=(Queue)ctx.lookup('myQueue'); //4)create QueueReceiver QueueReceiver receiver=ses.createReceiver(t); //5) create listener object MyListener listener=new MyListener(); //6) register the listener object with receiver receiver.setMessageListener(listener); System.out.println('Receiver1 is ready, waiting for messages...'); System.out.println('press Ctrl+c to shutdown...'); while(true){ Thread.sleep(1000); } }catch(Exception e){System.out.println(e);} } } 
Arquivo: MyListener.java
 import javax.jms.*; public class MyListener implements MessageListener { public void onMessage(Message m) { try{ TextMessage msg=(TextMessage)m; System.out.println('following message is received:'+msg.getText()); }catch(JMSException e){System.out.println(e);} } } 

Execute primeiro a classe Receiver e depois a classe Sender.


Exemplo de tópico JMS

É o mesmo que Fila JMS, mas você precisa alterar Fila para Tópico, Remetente para Publicador e Destinatário para Assinante.

Você precisa criar 2 JNDI nomeados myTopicConnectionFactory e meu tópico .

Arquivo: MeuSender.java
 import java.io.BufferedReader; import java.io.InputStreamReader; import javax.naming.*; import javax.jms.*; public class MySender { public static void main(String[] args) { try { //Create and start connection InitialContext ctx=new InitialContext(); TopicConnectionFactory f=(TopicConnectionFactory)ctx.lookup('myTopicConnectionFactory'); TopicConnection con=f.createTopicConnection(); con.start(); //2) create queue session TopicSession ses=con.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); //3) get the Topic object Topic t=(Topic)ctx.lookup('myTopic'); //4)create TopicPublisher object TopicPublisher publisher=ses.createPublisher(t); //5) create TextMessage object TextMessage msg=ses.createTextMessage(); //6) write message BufferedReader b=new BufferedReader(new InputStreamReader(System.in)); while(true) { System.out.println('Enter Msg, end to terminate:'); String s=b.readLine(); if (s.equals('end')) break; msg.setText(s); //7) send message publisher.publish(msg); System.out.println('Message successfully sent.'); } //8) connection close con.close(); }catch(Exception e){System.out.println(e);} } } 
Arquivo: MeuReceptor.java
 import javax.jms.*; import javax.naming.InitialContext; public class MyReceiver { public static void main(String[] args) { try { //1) Create and start connection InitialContext ctx=new InitialContext(); TopicConnectionFactory f=(TopicConnectionFactory)ctx.lookup('myTopicConnectionFactory'); TopicConnection con=f.createTopicConnection(); con.start(); //2) create topic session TopicSession ses=con.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); //3) get the Topic object Topic t=(Topic)ctx.lookup('myTopic'); //4)create TopicSubscriber TopicSubscriber receiver=ses.createSubscriber(t); //5) create listener object MyListener listener=new MyListener(); //6) register the listener object with subscriber receiver.setMessageListener(listener); System.out.println('Subscriber1 is ready, waiting for messages...'); System.out.println('press Ctrl+c to shutdown...'); while(true){ Thread.sleep(1000); } }catch(Exception e){System.out.println(e);} } } 
Arquivo: MyListener.java
 import javax.jms.*; public class MyListener implements MessageListener { public void onMessage(Message m) { try{ TextMessage msg=(TextMessage)m; System.out.println('following message is received:'+msg.getText()); }catch(JMSException e){System.out.println(e);} } }