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.
- Domínio de mensagens ponto a ponto
- 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.
- Criar connection factory nomeado minhaQueueConnectionFactory
- 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.javaimport 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.javaimport 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);} } }