A interface de uma mensagem é extremamente flexível e permite várias formas de customização de conteúdo. Figura 1 - Tipos de Mensagens JMS

Documentos relacionados
INF1013 MODELAGEM DE SOFTWARE

Enviando com a API JavaMail

Message Driven Beans. Apresentação. Introdução Implementação de MDBs Deployment no JBoss Java Messaging Service Exemplo

Enterprise Java Beans

GUIA INTEGRA SERVICES E STATUS MONITOR

Instalando o WordPress em localhost

Java com Banco de Dados Posgree

Despachante Express - Software para o despachante documentalista veicular DESPACHANTE EXPRESS MANUAL DO USUÁRIO VERSÃO 1.1

Parte I. Demoiselle Mail

CURSO DE PROGRAMAÇÃO EM JAVA

Instalando servidor Apache com MySQL e as linguagens ColdFusion e PHP. XAMPP (xampp-win installer.exe), veja aqui.

JAVA COM BANCO DE DADOS PROFESSORA DANIELA PIRES

Para funcionamento do Netz, alguns programas devem ser instalados e alguns procedimentos devem ser seguidos. São eles:

MANUAL PORTAL CLIENTE AVANÇO

2 Orientação a objetos na prática

Programação para Internet Orientada a Objetos com PHP & MySQL Instalando e configurando um ambiente de ferramentas PHP e MySQL. Prof. MSc.

Tutorial RMI (Remote Method Invocation) por Alabê Duarte

MANUAL DE INSTALAÇÃO E CONFIGURAÇÃO. Motor Periférico Versão 8.0

Manual do Sistema "Fala Comigo - Sistema de Atendimento On-Line" Editorial Brazil Informatica

ECD1200 Equipamento de Consulta de Dados KIT DE DESENVOLVIMENTO

Introdução Contratando o produto Link2NFe Assistente de configuração de emissor Configurações Avançadas do Emissor...

Manual de configuração do sistema

Omega Tecnologia Manual Omega Hosting

Leonardo Gresta Paulino Murta

MQSeries Everyplace. Leia-me primeiro G

CONFIGURAÇÃO DE REDE SISTEMA IDEAGRI - FAQ CONCEITOS GERAIS

TUTORIAL: MANTENDO O BANCO DE DADOS DE SEU SITE DENTRO DO DOMÍNIO DA USP USANDO O SSH!

Entendendo como funciona o NAT

GEPLANES GESTÃO DE PLANEJAMENTO ESTRATÉGICO MANUAL DE INSTALAÇÃO DO GEPLANES EM UM AMBIENTE WINDOWS

INSTALANDO E CONFIGURANDO O MY SQL

Aula 30 - Sockets em Java

SUMÁRIO 1. AULA 6 ENDEREÇAMENTO IP:... 2

Manual de Instalação e Configuração. Módulo Remote. (G2KA) para NFSE. v1.0

3. No painel da direita, dê um clique com o botão direito do mouse em qualquer espaço livre (área em branco).

JDBC. Siga as instruções para instalar o banco de dados H2 e criar a tabela Alunos.

Vamos criar uma nova Página chamada Serviços. Clique em Adicionar Nova.

Persistência de Classes em Tabelas de Banco de Dados

Sistema Operacional Unidade 12 Comandos de Rede e Acesso Remoto

GUIA MUDANÇA E FORMATAÇÃO DE SERVIDOR - SLIM

Passo a Passo da instalação da VPN

Manual do Usúario Backup Online. Manual do Usuário. Backup Online. Versão Copyright GVT

PADRÃO PARA ENVIO DE . Versão 1.0

INTRODUÇÃO À TECNOLOGIA SERVLETS

Java : Comunicação Cliente-Servidor.

Manual Replicação Manual VPN

Smart Laudos 1.9. A Forma Inteligente de Criar seus Laudos Médicos. Manual do Usuário

Usar Atalhos para a Rede. Logar na Rede

GUIA MUDANÇA E FORMATAÇÃO DE SERVIDOR - MILLENNIUM

Serviço Seguro de Mensagens Instantâneas

Listando itens em ComboBox e gravando os dados no Banco de Dados MySQL.

TUTORIAL DO ALUNO. Olá, bem vindo à plataforma de cursos a distância da Uniapae!!!

Descrição. Implementação. Departamento de Informática e Estatística Universidade Federal de Santa Catarina LAB 4 Transferência de Arquivos

Manual de Instalação (TEF LOJA)

Cadastrar Categorias e Produtos

Tutorial do administrador do HelpCenterLive (Sistema de Ajuda)

Tutorial JMS com ActiveMQ Nível: Introdutório Autor: José Damico IBM Data: 26 de novembro de 2006

ArpPrintServer. Sistema de Gerenciamento de Impressão By Netsource Rev: 02

AP_ Conta Aplicativo para digitação e envio de contas médicas no padrão TISS

Laboratório - Exploração do FTP

Java Message Service (JMS)

Manual do Usuário Nextel Cloud. Manual do Usuário. Versão Copyright Nextel

IBM SPSS Modeler - Princípios Básicos do R: Instruções de Instalação

02 - Usando o SiteMaster - Informações importantes

LOGGING DE EVENTOS COM LOG4J

Módulo e-rede VirtueMart v1.0. Manual de. Instalação do Módulo. estamos todos ligados

Vamos criar uma nova Página chamada Serviços. Clique em Adicionar Nova.

1 Sumário O Easy Chat Conceitos Perfil Categoria Instalação O Aplicativo HTML...

Manipulação de Banco de Dados com Java. Ms. Bruno Crestani Calegaro Maio/ 2015

UNIVERSIDADE FEDERAL DE GOIÁS CERCOMP (CENTRO DE RECURSOS COMPUTACIONAIS) TUTORIAL DE USO DO WEBMAIL - UFG

GUIA BÁSICO DA SALA VIRTUAL

1 REQUISITOS BÁSICOS PARA INSTALAR O SMS PC REMOTO

Procedimentos para Instalação do Sisloc

Um pouco do Java. Prof. Eduardo

Satélite. Manual de instalação e configuração. CENPECT Informática cenpect@cenpect.com.br

Acessando um Banco de Dados

Manual Comunica S_Line

EAI Manual do Administrador

ROTEIRO PARA INSTALAÇÃO DO BITVISE, CONFIGURAÇÃO DE CHAVES SSH, DEFINIÇÃO DAS PORTAS PARA OS TÚNEIS SSH E CONFIGURAÇÃO DO THUNDERBIRD

Esse manual é um conjunto de perguntas e respostas para usuários(as) do Joomla! 1.5.

Prática da Disciplina de Sistemas Distribuídos Serviços Web IFMA DAI Professor Mauro Lopes C. Silva

BLACKBERRY - PME e PL Passo a Passo Registro Site BIS BlackBerry PME e Profissional Liberal

Procedimentos para Reinstalação do Sisloc

Comunicaçãoentre processos: Mensagens

Manual de Utilização do Zimbra

Microsoft Access XP Módulo Um

Manual de Instalação ProJuris8

Manipulação de Banco de Dados com Java 1. Objetivos

Projeto Amadeus. Guia de Instalação Windows

Faculdade de Tecnologia SENAC Goiás. Disciplina: Gerenciamento de Rede de Computadores. Goiânia, 16 de novembro de 2014.

Configurando o DDNS Management System

Aplicativo da Manifestação do Destinatário. Manual

Usar o Office 365 no iphone ou ipad

Procedimento para instalação do OMNE-Smartweb em Raio-X

USANDO O ROUNDCUBE WEBMAIL

ADMINISTRAÇÃO DE SISTEMAS OPERACIONAIS SERVIÇOS IMPRESSÃO. Professor Carlos Muniz

Follow-Up Acompanhamento Eletrônico de Processos (versão 3.0) Manual do Sistema. 1. Como acessar o sistema Requisitos mínimos e compatibilidade

Web Design Aula 11: Site na Web

Transcrição:

Programando com Java Artigo http://mballem.wordpress.com/ Chat JMS com ActiveMQ Java Message Service Autor Marcio Ballem: é formado em Sistemas de Informação e possui certificação Oracle Certified Professional, Java SE 6 Programmer. Trabalhou profissionalmente com desenvolvimento em Delphi 7 e Java JEE. Introdução Algum tempo atrás postei no blog um tutorial sobre como criar um chat muilti usuários com a utilização da classe Socket e o uso de threads (http://mballem.wordpress.com/2011/02/04/chat-multiusuario-com-socket/), agora irei mostrar uma outra forma de criar um chat multi usuários, sem a utilização de Socket e nem de threads e sim utilizando a API JMS. Java Message Service, ou simplesmente JMS, é uma API da linguagem Java para middleware orientado a mensagens. Através da API JMS, uma ou mais aplicações podem se comunicar trocando mensagens através de um provider. O provider é um servidor que gerencia e armazena essas mensagens. Vários servidores Java como, JOnAS http://wiki.jonas.ow2.org/xwiki/bin/view/main/webhome), GlassFish http://glassfish.java.net/), JBoss http://www.jboss.org/jbossas/downloads/), entre outros, possuem suporte a JMS. Mas existe também alguns servidores JMS que não estão vinculados a um servidor web, entre eles temos o Joram http://joram.ow2.org/), OpenJMS http://openjms.sourceforge.net/) e o ActiveMQ http://activemq.apache.org/), o qual será o foco deste artigo para a criação do chat através do conceito de tópicos. 1. Arquitetura JMS A arquitetura JMS disponibiliza dois tipos de troca de mensagens, o Queue (modelo ponto a ponto ou modelo de filas) e o modelo Topic ou Publish/Subscribe. Com o modelo de troca de mensagens por filas, poderíamos ter um ou vários produtores enviando mensagens para uma mesma fila, mas teríamos apenas um único consumidor. Neste modelo, cada vez que uma mensagem é consumida, ela deixa de existir na fila, por isso, podemos ter apenas um único consumidor. O modelo Topic, permite uma situação em que teríamos de um a vários consumidores para o mesmo tópico. Funciona como um sistema de assinaturas, cada cliente assina um tópico e a mensagem fica armazenada no servidor até todos assinantes a tenham consumido. Este será o modelo usado neste artigo. 2. Elementos da API JMS Cliente JMS: Uma aplicação ou objeto Java que produz (Programas Java que criam e enviam mensagens) e que consome (Programas Java que recebem mensagens) as mensagens. As mensagens são objetos que contém os dados que são transferidos entre os clientes JMS. Essas transferências são feitas a partir de um Provedor JMS. Conexão JMS: A partir do momento que uma factory é obtida, conexões para o provedor JMS podem ser criadas. Uma conexão representa a ligação entre a aplicação cliente e a aplicação servidora. Dependendo do tipo da conexão, ela permitirá que os clientes criem sessões para o envio e recebimento de mensagens de filas ou tópicos. Factory de conexões JMS: É um objeto administrado que a aplicação cliente utiliza para a criação de conexões para o provedor JMS. Normalmente o cliente obtém as factories através de interfaces portável, desta forma, mesmo se as configurações do provedor JMS

mudar, o código do cliente permanece inalterado. Os administradores mantêm as configurações em objetos (objetos da classe factory), que são obtidos através de buscas (lookup) na JNDI. Dependendo do tipo da mensagem, o cliente obterá uma factory para tópico ou para fila. Destino: É um objeto administrado que encapsula a identidade do destino das mensagens, que é para onde as mensagens são enviadas e consumidas, são uma fila ou um tópico. O administrador JMS cria estes objetos, e os usuários os obtém através de buscas na JNDI. Da mesma forma que as factories de conexões, o administrador pode criar dois tipos de classe de destino, fila e tópico. O destino recebe um nome, que é pelo qual o produtor e o consumidor se comunicam com o provedor. Consumidor: Um objeto criado através de uma sessão JMS. Ele recebe mensagens de um destino. O consumidor pode receber mensagens de maneira síncrona ou assíncrona de filas ou tópicos. Produtor: Um objeto criado através de uma sessão JMS. Ele envia mensagens para um destino. Mensagens: São objetos enviados entre consumidores e produtores de mensagens. Eles contêm um objeto que encapsula os dados que serão trafegados pelas mensagens. As mensagens são pacotes independentes de dados de negócios. Uma mensagem possui três partes principais: o o Cabeçalho (Contém informações de roteamento de rede e identificadores de mensagens), propriedades (Contém metadados para a mensagem. O JMS dita algumas das propriedades, mas programadores também podem incluir suas próprias propriedades) e carga útil (Contém os verdadeiros dados do negócio. A carga útil é totalmente controlada pelo programador). Corpo da mensagem pode conter seis tipos de mensagens: TextMessage(padrão para textos e xml), ObjectMessage, ByteMessage, MapMessage, StreamMessage. Todos esses tipos são subtipos da interface javax.jms.message, mensagem genérica sem corpo, que contém apenas informações como cabeçalho e propriedades. o A interface de uma mensagem é extremamente flexível e permite várias formas de customização de conteúdo. Provedor JMS: Representa uma interface para um software de middleware orientado à mensagens. Ele suporta a interface JMS que é especificada pela Sun MicroSystems, recentemente adquirida pela Oracle (http://www.oracle.com/technetwork/java/jms/index.html). Ele é basicamente um adaptador de um middleware. Figura 1 - Tipos de Mensagens JMS 3. Apache ActiveMQ O ActiveMQ é um provedor open source(licence Apache 2.0). O ActiveMQ pode ser utilizado por linguagens como Java,.NET, C/C++, Delphi, Perl, entre outras, através do chamado "Cross Language Clients".

Para obter o ActiveMQ devemos acessar o endereço http://activemq.apache.org/activemq-542-release.html e fazer o download da versão apache-activemq-5.4.2-bin.zip. Após baixar o arquivo, vamos descompactálo no diretório "c:\". Para nosso projeto vamos precisar adicionar a biblioteca activemq-all-5.4.2.jar, encontrada no diretório raiz do pacote. Para ativar o ActiveMQ, entre no diretório bin e execute o arquivo activemq.bat. Não é necessária nenhuma alteração em configuração do ActiveMQ para executar o exemplo deste artigo, você deve ter apenas o Java nas variáveis de ambiente do Windows. Você pode fazer um teste pelo browser, procure no log lançado no console por uma linha tipo esta: INFO ActiveMQ Console at http://0.0.0.0:8161/admin. O importante aqui é o número da porta, se a sua não for 8161, não tem problema algum. Digite no browser este endereço e substitua os zeros por localhost, ficando assim: http://localhost:8161/admin, e caso sua porta seja outra, também substitua o número dela. Você deverá ter uma página como a da figura 2. Figura 2 - Painel de Administração ActiveMQ 4. Entendendo o JMS Para escrever aplicações que enviam ou recebem mensagens é preciso realizar uma série de etapas: 1. Obter um destino e uma fábrica de conexões via JNDI 2. Usar a fábrica para obter uma conexão 3. Usar a conexão para obter uma ou mais sessões 4. Usar a sessão para criar uma mensagem 5. Iniciar a sessão 6. Enviar e/ou receber mensagens 7. Cadastrar ouvintes para receber mensagens

Figura 3 - Diagrama JMS Um tópico JMS pode ser de dois tipos, durável e não durável. Quando um tópico é configurado como durável o assinante não precisa estar conectado no momento em que o produtor envia a mensagem, ela permanece no provedor até que o assinante (consumidor) esteja ativo e faça o consumo dela. O tópico não durável o assinante deve estar ativo para receber a mensagem, caso não esteja a mensagem não será entregue. Cada tópico pode ter vários assinantes, e para um assinante receber as mensagens enviadas para o tópico, eles já devem ser assinantes antes da mensagem ser enviada. Isto significa que se dois assinantes receberem a mensagem "Java com JMS", e um terceiro assinante se inscrever no tópico após o envio desta mensagem, este terceiro assinante não irá receber a mensagem. O contexto utilizado para a conexão JMS é feito através de uma conexão JNDI (http://pt.wikipedia.org/wiki/jndi) que pode ser efetuada programaticamente ou por um arquivo de configurações do tipo properties. Os elementos desta configuração são o endereço e a porta do provedor, o nome da fabrica de conexão, o nome do tópico e a classe JNDI de criação do objeto do contexto. Essa classe não é uma classe padrão para qualquer provedor, cada um possui a sua própria classe como pode diferenciar também a maneira de configurar as demais propriedades. 5. Configurando um tópico Antes de tudo precisamos configurar um tópico no provedor, para isso, inicie o provedor como mostrado na sessão 3 e acesse a url do administrador. Quando a página abrir, como a figura 2, clique em Topics e no campo TopicName insira topicchat e clique em create. Você verá em seguida na tabela Topics, que será criado um tópico com este nome. Feito isto, vamos criar o arquivo jndi.properties para depois adicioná-lo no classpath da aplicação, conforme listagem 1. Listagem 1. Arquivo jndi.properties #classe jndi para o ActiveMQ java.naming.factory.initial = org.apache.activemq.jndi.activemqinitialcontextfactory #url para conexão com o provedor java.naming.provider.url = tcp://localhost:61616

#nome da conexão connectionfactorynames = TopicCF #nome do tópico jms topic.topicchat = topicchat 6. Classe Chat Crie a classe Chat conforme a listagem 1. Não se esqueça de adicionar ao projeto a biblioteca activemqall-5.4.2.jar, ela contém todas as classes necessárias para a criação dos serviços JMS. Os comentários estão linha a linha no código, para indicar o que cada linha faz durante o processo de criação do chat. Listagem 2. Classe de conexão com banco de dados package br.mb.tutorialactivemq.chat; import javax.jms.jmsexception; import javax.jms.topicconnection; import javax.jms.topicpublisher; import javax.jms.topicsession; import javax.jms.topicconnectionfactory; import javax.jms.session; import javax.jms.topic; import javax.jms.topicsubscriber; import javax.jms.message; import javax.jms.textmessage; import javax.jms.messagelistener; import javax.naming.initialcontext; import java.util.scanner; public class Chat implements MessageListener { private TopicSession pubsession; private TopicPublisher publisher; private TopicConnection connection; private String username; /* Construtor usado para inicializar o cliente JMS do Chat */ public Chat(String topicfactory, String topicname, String username) throws Exception { // Obtém os dados da conexão JNDI através do arquivo jndi.properties InitialContext ctx = new InitialContext(); // O cliente utiliza o TopicConnectionFactory para criar um objeto do tipo TopicConnection com o provedor JMS TopicConnectionFactory confactory = (TopicConnectionFactory) ctx.lookup(topicfactory); // Utiliza o TopicConnectionFactory para criar a conexão com o provedor JMS TopicConnection connection = confactory.createtopicconnection(); // Utiliza o TopicConnection para criar a sessão para o produtor // Atributo false -> uso ou não de transações(tratar uma série de envios/recebimentos como unidade atômica e // controlá-la via commit e rollback) // Atributo AUTO_ACKNOWLEDGE -> Exige confirmação automática após recebimento correto

TopicSession pubsession = connection.createtopicsession(false, Session.AUTO_ACKNOWLEDGE); // Utiliza o TopicConnection para criar a sessão para o consumidor TopicSession subsession = connection.createtopicsession(false, Session.AUTO_ACKNOWLEDGE); // Pesquisa o destino do tópico via JNDI Topic chattopic = (Topic) ctx.lookup(topicname); // Cria o tópico JMS do produtor das mensagens através da sessão e o nome do tópico TopicPublisher publisher = pubsession.createpublisher(chattopic); // Cria(Assina) o tópico JMS do consumidor das mensagens através da sessão e o nome do tópico TopicSubscriber subscriber = subsession.createsubscriber(chattopic); // Escuta o tópico para receber as mensagens através do método onmessage() subscriber.setmessagelistener(this); // Inicializa as variaveis do Chat this.connection = connection; this.pubsession = pubsession; this.publisher = publisher; this.username = username; // Inicia a conexão JMS, permite que mensagens sejam entregues connection.start(); // Recebe as mensagens do tópico assinado public void onmessage(message message) { try { // As mensagens criadas como TextMessage devem ser recebidas como TextMessage TextMessage textmessage = (TextMessage) message; System.out.println(textMessage.getText()); catch (JMSException jmse) { jmse.printstacktrace(); // Cria a mensagem de texto e a publica no tópico. Evento referente ao produtor public void writemessage(string text) throws JMSException { // Recebe um objeto da sessao para criar uma mensagem do tipo TextMessage TextMessage message = pubsession.createtextmessage(); // Seta no objeto a mensagem que será enviada message.settext(username + ": " + text); // Publica a mensagem no tópico publisher.publish(message); // Fecha a conexão JMS public void close() throws JMSException { connection.close(); // Roda o Chat public static void main(string[] args) { try { //Habilita o envio de mensagens por linha de comando Scanner commandline = new Scanner(System.in); System.out.print("Digite seu nome: ");

String name = commandline.nextline(); // Faz uma chamada ao construtor da classe para iniciar o chat Chat chat = new Chat("TopicCF", "topicchat", name); // Depois da conexão criada, faz um loop para enviar mensagens while (true) { //captura a mensagem digitada no console String s = commandline.nextline(); //para sair digite exit if (s.equalsignorecase("exit")) { //fecha a conexão com o provedor chat.close(); //sai do sistema System.exit(0); else { //envia a mensagem digitada no console para o método writemessage que irá publica-la chat.writemessage(s); catch (Exception e) { e.printstacktrace(); Não se esqueça de adicionar no projeto, dentro do diretório src(root dos fontes), o arquivo jndi.properties para ser possível a conexão com o provedor. Quando quiser para o provedor utilize "ctrl+c" e na próxima pergunta confirme. Conclusão Este artigo exemplificou como instalar e configurar um provedor do tipo ActiveMQ utilizando a API JMS. Foi criado um chat com os recursos do tipo Topic, onde a mesma aplicação envia e recebe mensagens. O exemplo do chat foi retirado da referência O'REILLY com algumas poucas modificações. Referências O'REILLY, Java Message Service, Second Edition by Mark Richards, Richard Monson- Haefel, and David A. Chappell. ORACLE, Java Naming and Directory Interface(JNDI) disponível em http://www.oracle.com/technetwork/java/jndi/index.html ORACLE, Java Message Service(JMS) disponível em http://www.oracle.com/technetwork/java/jms/index.html