Atividade de Laboratório - Java Message Service

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.

Publicando Mensagens com o JMS

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);
    }    
}

Recebendo Mensagens com o JMS

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]);
    }
}

Compilando e Executando a Aplicação JMS

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.