Você está na página 1de 28

Desenvolvimento de Aplicações Java

Plataforma Corporativa

Tutorial
MDB e JMS

Agosto 2016
Sumário
1.Introdução ...................................................................................................................................................................... 3
2. Estrutura da Aplicação .................................................................................................................................................. 4
3.Configuração de uma fila no provedor JMS do JBoss WildFly ....................................................................................... 5
4. Criar um cliente JMS ..................................................................................................................................................... 8
ClienteJMS.java ....................................................................................................................................................... 11
5. Criação de um projeto para um módulo EJB .............................................................................................................. 14
5.1. Implementação do componente corporativo MDB ............................................................................................. 15
ProcessadorDeEventos.java .................................................................................................................................... 17
6. Aplicação Corporativa ................................................................................................................................................. 19
6.1. Configuração dos módulos corporativos da aplicação corporativa. .................................................................... 20
7. Cliente JMS na aplicação WEB .................................................................................................................................... 22
MDBServlet.java ...................................................................................................................................................... 26
1.Introdução

Neste documento os procedimentos para implantação de um componente corporativo nodo tipo MDB no JBoss
Wildfly e realizar sua chamada a partir de um servlet e de um cliente remoto utilizando a API JMS.
2. Estrutura da Aplicação

 Vai ser necessário configurar no servidor de aplicações o servidor de mensagens, implantando nele uma fila.
 Inicialmente, no servidor de aplicações iremos implantar uma aplicação Java EE, sem a camada de aplicação,
somente os componentes corporativos (Módulo EE).
 Iremos executar uma aplicação cliente para disparar a execução do bean de mensagem remotamente.
 Em seguida, iremos implementar um servlet que também envia uma mensagem para a fila de mensagens
associada ao bean de mensagem.
3.Configuração de uma fila no provedor JMS do JBoss WildFly

Vamos implantar uma Fila (Queue) chamada eventQueue e seu bind JNDI java:/jms/queue/eventQueue.

Para permitir acesso remote, também precisaremos incluir o bind JNDI


java:/jboss/exported/jms/queue/demoQueue no namespace java:/jboss/exported.

 Execute o seu servidor de aplicação (standalone.bat) através do promp de comando, com o comando abaixo
para que o subsistema de mensageria (HornetQ) seja executado:
standalone.bat –b 0.0.0.0 –c standalone-full.xml

 Inicie o CLI:
o Abra uma nova janela de prompt de comando e execute o comando:
jboss-cli.bat --connect.

 Criar uma fila chamada eventQueue:


o Execute o comando abaixo para criar a fila:
jms-queue add --queue-address=eventQueue --
entries=java:/jms/queue/eventQueue,java:jboss/exported/jms/queue/eventQueue
o Verifique se a fila foi criada executando o comando abaixo:
/subsystem=messaging/hornetq-server=default/jms-queue=eventQueue:read-resource

 Crie um usuário de aplicação jmsUser com senha jmsUser123!


4. Criar um cliente JMS

 Execute o Netbeans.
 Na barra de comando selecione “Arquivo” -> Novo projeto.

 Em categoria selecione “Java” e em Projetos, selecione “Aplicação Java”. Clique em próximo.

 De um nome para se projeto e clique em finalizar.


 O projeto de sua aplicação Java foi criado.

 Adicione a biblioteca de API Java EE 7.


 Implemente a classe ClienteJMS no pacote jms.cliente.

 Execute a sua classe cliente. Não se esqueça de incluir no seu projeto a biblioteca do WildFly que provê o
serviço de nomes para o JNDI.
ClienteJMS.java
package jms.cliente;

import java.util.logging.Logger;

import java.util.Properties;

import javax.jms.Connection;

import javax.jms.ConnectionFactory;

import javax.jms.Destination;

import javax.jms.MessageConsumer;

import javax.jms.MessageProducer;

import javax.jms.Session;

import javax.jms.TextMessage;

import javax.naming.Context;

import javax.naming.InitialContext;

public class ClienteJMS {

private static final Logger log = Logger.getLogger(ClienteJMS.class.getName());

private static final String CONNECTION_FACTORY = "jms/RemoteConnectionFactory";

private static final String DESTINATION = "java:/jms/queue/eventQueue";

private static final String MESSAGE_COUNT = "1";

private static final String USER = "jmsUser";

private static final String PASSWORD = "jmsUser123!";

private static final String INITIAL_CONTEXT_FACTORY =


"org.jboss.naming.remote.client.InitialContextFactory";

private static final String PROVIDER_URL = "http-remoting://localhost:8080";

public static void main(String[] args) throws Exception {

ConnectionFactory connectionFactory = null;

Connection conn = null;

Session session = null;

MessageProducer producer = null;

MessageConsumer consumer = null;


Destination destination = null;

TextMessage message = null;

Context context = null;

try {

// configura JNDI

final Properties env = new Properties();

env.put(Context.INITIAL_CONTEXT_FACTORY, INITIAL_CONTEXT_FACTORY);

env.put(Context.PROVIDER_URL, System.getProperty(Context.PROVIDER_URL,
PROVIDER_URL));

env.put(Context.SECURITY_PRINCIPAL, System.getProperty("username", USER));

env.put(Context.SECURITY_CREDENTIALS, System.getProperty("password",
PASSWORD));

context = new InitialContext(env);

// lookup JNDI

String connectionFactoryString = System.getProperty("connection.factory",


CONNECTION_FACTORY);

log.info("Tentativa de obter connection factory \"" + connectionFactoryString +


"\"");

connectionFactory = (ConnectionFactory) context.lookup(connectionFactoryString);

log.info("Connection factory encontrada no JNDI \"" + connectionFactoryString +


"\"");

String destinationString = System.getProperty("destination", DESTINATION);

log.info("Tentativa de obter destination \"" + destinationString + "\"");

destination = (Destination) context.lookup(destinationString);

log.info("Destination \"" + destinationString + "\" econtrado no JNDI");

// JMS - cria conexao, sessao e produtor/consumidor

conn = connectionFactory.createConnection(System.getProperty("username", USER),


System.getProperty("password", PASSWORD));

session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);

producer = session.createProducer(destination);

// consumer = session.createConsumer(destination);

conn.start();
int count = Integer.parseInt(System.getProperty("message.count",
MESSAGE_COUNT));

String content = System.getProperty("message.content", "Evento tipo1");

log.info("Enviando " + count + " mensagens: " + content);

// Envia mensagem

for (int i = 0; i < count; i++) {

message = session.createTextMessage(content);

producer.send(message);

} catch (Exception e) {

log.severe(e.getMessage());

throw e;

} finally {

if (context != null) {

context.close();

// Fecha conexao.

if (conn != null) {

conn.close();

}
5. Criação de um projeto para um módulo EJB

 Execute o Netbeans.
 Na barra de comando selecione “Arquivo” -> Novo projeto.

 Em categoria selecione “Java EE” e em Projetos, selecione “Módulo EJB”. Clique em próximo.

 De um nome para seu módulo e indique onde você deseja manter o projeto. Clique em próximo.

 Indique qual o servidor de aplicação para implantação. Clique em finalizar.


Seu módulo EJB (módulo em que os componentes corporativos serão implementados e implantados) foi criado.

5.1. Implementação do componente corporativo MDB

 Na aba projetos, clique com o botão da direita sobre o projeto de seu módulo EJB e selecione “Novo” ->
Bean Baseado em Mensagens....

 Informe para o seu bean:


o Nome: ProcessadorDeEventos
o Pacote: ejb.beans
o Selecione Destinos do Servidor -> eventQueue
o Clicar em Próximo.
 Clique em finalizar.

 Implementar a classe ProcessadorDeEventos.


ProcessadorDeEventos.java

package ejb.beans;

import java.util.logging.Logger;

import javax.ejb.ActivationConfigProperty;

import javax.ejb.MessageDriven;

import javax.jms.JMSException;

import javax.jms.Message;

import javax.jms.MessageListener;

import javax.jms.TextMessage;

@MessageDriven(name = "EventMDB", activationConfig = {

@ActivationConfigProperty(propertyName = "destinationType", propertyValue =


"javax.jms.Queue"),

@ActivationConfigProperty(propertyName = "destination", propertyValue =


"java:/jms/queue/eventQueue"),

@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-


acknowledge")})

public class ProcessadorDeEventos implements MessageListener {

private final static Logger LOGGER =


Logger.getLogger(ProcessadorDeEventos.class.toString());

public ProcessadorDeEventos() {

@Override

public void onMessage(Message message) {

TextMessage msg = null;

try {

if (message instanceof TextMessage) {

msg = (TextMessage) message;

System.out.println("Mensagem recebida da fila: " + msg.getText());

} else {

System.out.println("Mensagem de tipo não esperado: " +


message.getClass().getName());
}

} catch (JMSException e) {

throw new RuntimeException(e);

}
6. Aplicação Corporativa

Para realizar a implantação completa do módulo EJB é necessário criar uma aplicação corporativa.

 Execute o netbeans.
 Na barra de comando selecione “Arquivo” -> Novo projeto.

 Em categoria selecione “Java EE” e em Projetos, selecione “Aplicação Enterprise”. Clique em próximo.

 De um nome e escolha o diretório onde você deseja manter os fontes da aplicação e clique em próximo.
 Como já possuímos um módulo web (aplicação desenvolvida até o momento) e já criamos o módulo EJB, não
devemos criar os módulos WEB e EJB. Clicar em Finalizar.

6.1. Configuração dos módulos corporativos da aplicação corporativa.

 Devemos configurar os módulos de uma aplicação corporativa, neste caso, o módulo EJB que contém a
implementação dos componentes que serão executados no EJB Container.
 Clicar com o botão da direita sobre o projeto java corporativo na aba Projetos e selecionar “Adicionar
Módulo Java EE”.
 Selecione o módulo EJB e clique em OK.

A aplicação Java EE está pronta para implantação no Servidor de Aplicações.

 Implante a sua aplicação corporativa para execução no Servidor de Aplicações.


 Execute a aplicação ClienteJMS e verifique o comportamento de seu servidor.
7. Cliente JMS na aplicação WEB

 Execute o Netbeans.
 Na barra de comando selecione “Arquivo” -> Novo projeto.

 Em categoria selecione “Java Web” e em Projetos, selecione “Aplicação Web”. Clique em próximo.

 De um nome para a aplicação e clique em próximo.


 Adicione a aplicação web à aplicação corporativa criada na seção anterior, selecione o servidor de aplicações
e clique em proximo.

 Não iremos utilizar nenhum framework adiciona. Clique em finalizar.

 O projeto web foi criado.


 Criar um servlet.

 Não se esqueça de adicionar informação ao descritor de implantação.


 Implemente o Servlet.
 Execute o Servlet e verifique o comportamento do seu bean de mensagem.
MDBServlet.java
package ejb.servlets;

import java.io.IOException;

import java.io.PrintWriter;

import java.util.Properties;

import javax.jms.Connection;

import javax.jms.ConnectionFactory;

import javax.jms.Destination;

import javax.jms.JMSException;

import javax.jms.MessageConsumer;

import javax.jms.MessageProducer;

import javax.jms.Session;

import javax.jms.TextMessage;

import javax.naming.Context;

import javax.naming.InitialContext;

import javax.naming.NamingException;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class MDBServlet extends HttpServlet {

protected void processRequest(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

ConnectionFactory connectionFactory = null;

Connection conn = null;

Session session = null;

MessageProducer producer = null;

MessageConsumer consumer = null;

Destination destination = null;

TextMessage message = null;

Context context = null;


try {

context = new InitialContext();

connectionFactory = (ConnectionFactory) context.lookup("java:/ConnectionFactory");

destination = (Destination) context.lookup("java:/jms/queue/eventQueue");

conn = connectionFactory.createConnection("jmsUser", "jmsUser123!");

session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);

producer = session.createProducer(destination);

conn.start();

message = session.createTextMessage("Mensagem Tipo 2");

producer.send(message);

} catch (Exception e) {

e.printStackTrace();

response.setContentType("text/html;charset=UTF-8");

try (PrintWriter out = response.getWriter()) {

/* TODO output your page here. You may use following sample code. */

out.println("<!DOCTYPE html>");

out.println("<html>");

out.println("<head>");

out.println("<title>Servlet MDBServlet</title>");

out.println("</head>");

out.println("<body>");

out.println("<h1>Servlet MDBServlet : Evento gerado com sucesso</h1>");

out.println("</body>");

out.println("</html>");

} catch (Exception e) {

e.printStackTrace();

}
@Override

protected void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

processRequest(request, response);

@Override

protected void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

processRequest(request, response);

@Override

public String getServletInfo() {

return "Short description";

}// </editor-fold>

Você também pode gostar