As instruções abaixo descrevem como criar programas para publicar e receber mensagens utilizando o JMS. As mensagens serão publicadas com o tópico flightStatus e consistirão de strings contendo dados sobre o status de vôos partindo ou chegando ao aeroporto de Florianópolis.
Será utilizado o provedor JMS do servidor de aplicação GlassFish. Os programas serão criados utilizando o NetBeans, para facilitar o processo de compilação, empacotamento e implantação da aplicação.
Crie um projeto do tipo 'Cliente de Aplicação Corporativa' e adicione a classe JmsPublisher, listada a seguir, ao projeto. O código necessário para conectar ao provedor de mensagens está no construtor da classe. O método main() cria uma instância da classe e publica três mensagens com o tópico flightStatus, contendo dados sobre o status de vôos partindo ou chegando ao aeroporto de Florianópolis.
import javax.jms.JMSException; import javax.jms.Session; import javax.jms.TextMessage; import javax.jms.Topic; import javax.jms.TopicConnection; import javax.jms.TopicConnectionFactory; import javax.jms.TopicSession; import javax.jms.TopicPublisher; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException;
public class JmsPublisher {
private TopicPublisher publisher;
private TopicSession session;
private TopicConnection connect;
public JmsPublisher(String factoryName, String topicName)
throws JMSException, NamingException {
Context jndiContext = new InitialContext();
TopicConnectionFactory factory = (TopicConnectionFactory)
jndiContext.lookup(factoryName);
Topic topic = (Topic) jndiContext.lookup(topicName);
this.connect = factory.createTopicConnection();
this.session = connect.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
this.publisher = session.createPublisher(topic);
}
public void publish(String message) throws JMSException {
TextMessage textMsg = this.session.createTextMessage();
textMsg.setText(message);
System.out.println("PUBLISHING MESSAGE: "+ message);
this.publisher.publish(textMsg);
}
public void close() throws JMSException {
this.connect.close();
}
public static void main(String[] args) throws Exception {
JmsPublisher publisher;
if(args.length != 2)
publisher = new JmsPublisher("ConnectionFactory", "topic/flightStatus");
else
publisher = new JmsPublisher(args[0], args[1]);
publisher.publish("30JUL08 1032 TAKEOFF JJ8011 FLN GRU");
Thread.sleep(5000);
publisher.publish("30JUL08 1120 LANDING RG2541 FLN POA");
Thread.sleep(5000);
publisher.publish("30JUL08 1155 TAKEOFF G94321 FLN CGH");
publisher.close();
System.exit(0);
}
}
Crie um novo projeto do tipo 'Cliente de Aplicação Corporativa' e adicione a classe JmsSubscriber, listada a seguir, ao projeto. O método main() cria uma instância da classe, que fica ouvindo mensagens com o tópico flightStatus. O método onMessage() será executado sempre que uma mensagem for recebida.
import javax.jms.Message; import javax.jms.TextMessage; import javax.jms.TopicConnectionFactory; import javax.jms.TopicConnection; import javax.jms.TopicSession; import javax.jms.Topic; import javax.jms.TopicSubscriber; import javax.jms.JMSException; import javax.naming.NamingException; import javax.naming.Context; import javax.naming.InitialContext; import javax.jms.Session; import javax.jms.MessageListener;
public class JmsSubscriber implements MessageListener {
private TopicConnection connect;
public JmsSubscriber(String factoryName, String topicName)
throws JMSException, NamingException {
Context jndiContext = new InitialContext();
TopicConnectionFactory factory = (TopicConnectionFactory) jndiContext.lookup(factoryName);
Topic topic = (Topic) jndiContext.lookup(topicName);
this.connect = factory.createTopicConnection();
TopicSession session = connect.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
TopicSubscriber subscriber = session.createSubscriber(topic);
subscriber.setMessageListener(this);
connect.start();
}
public void onMessage(Message message) {
try {
TextMessage textMsg = (TextMessage) message;
String text = textMsg.getText();
System.out.println(text);
} catch (JMSException ex) {
ex.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
if(args.length != 2)
new JmsSubscriber("ConnectionFactory", "topic/flightStatus");
else
new JmsSubscriber(args[0], args[1]);
}
}
Primeiramente você deve configurar o provedor de mensagens. Para isso, inicie o GlassFish (na aba 'Serviços' do NetBeans, abra o nó 'Servidores', clique com o botão da direita sobre o GlassFish e selecione 'Iniciar') e entre na interface administrativa (clique aqui e faça o login como usuário 'admin' e com a senha de administrador, cujo valor padrão é 'adminadmin'). Selecione Resources > JMS Resources > Connection Factories e clique em 'New'. Em seguida, defina o nome JNDI como 'ConnectionFactory', selecione o tipo de recurso 'javax.jms.ConnectionFactory' e clique em 'OK'. A seguir, clique em Resources > JMS Resources > Destination Resources e clique em 'New'. Defina o nome JNDI como 'topic/flightStatus', o nome do destino físico 'flightStatus', selecione o tipo de recurso 'javax.jms.Topic' e clique em 'OK'.
Execute primeiramente o projeto contendo a classe JmsSubscriber. Em seguida, execute o projeto contendo a classe JmsPublisher.