Servidores de Aplicação
Aula 19
Este material é parte integrante da disciplina oferecida pela UNINOVE.
O acesso às atividades, conteúdos multimídia e interativo, encontros virtuais, fóruns de discussão e a comunicação com o professor devem ser feitos diretamente no ambiente virtual de aprendizagem UNINOVE.
Uso consciente do papel.
Aula 19: Message Driven Beans – Parte II
Objetivo: Finalizar o aplicativo iniciado na aula 18, desenvolvendo o módulo web.
Criando o Bean Singleton
Nas aulas 16 e 17 foi criado um bean do tipo Singleton, uma forma mais simples de implementar um EJB que exista no servidor, apenas quando o aplicativo ao qual ele pertence estiver sendo executado.
Selecione o nome do módulo web com o botão direito do mouse e use as opções “Novo -> Bean de Sessão”. A forma de declará-lo é similar à forma de criar um bean de sessão, mas, em vez de usar Stateless ou Stateful, use a opção Único (Singleton). Nesse exemplo será usado o nome “GerenciadorSessao”. Isso fará com que seja criado o arquivo “GerenciadorSessao.java”.
Para que ele consiga contar os usuários conectados, ele precisa da anotação @WebListener associada à declaração dessa classe, que deve ser conectada a uma função de “escuta” do servidor web chamada HttpSessionListener.
Quando essa alteração for feita, o Netbeans mostrará o ícone , indicando que há alguma correção a fazer no código. Clique sobre o ícone e selecione a opção “Implementar Todos os Métodos Abstratos”, fazendo com que sejam criados os métodos sessionCreated e sessionDestroyed, chamados pelo servidor quando a sessão de conexão é criada (aplicação iniciada) ou destruída (aplicação encerrada). Esses métodos serão usados para incrementar e decrementar a variável contadora de sessões “contador”. Por último, crie um método que informe o número de conexões ativas, cujo código é listado a seguir:
public int getContagemSessoes() { return contador;
Servlet ListarMensagens
Neste momento deve ser criado um Servlet que liste todas as mensagens armazenadas no servidor. Crie esse Servlet do mesmo modo feito nas aulas anteriores, clique no nome do módulo web e use as opções “Novo -> Servlet” para configurar e criar a classe “ListarMensagens.java”.
Depois que essa classe for criada, clique com o botão direito do mouse na linha abaixo da declaração “public class ListarMensagens extends HttpServlet” e use as opções “Inserir Código -> Chamar Enterprise Bean” para adicionar as seguintes instruções ao Servlet:
@EJB
private MensagensFacade mensagensFacade. @EJB
private GerenciadorSessao gerenciadorSessao.
Essas instruções conectam o Servlet aos vários beans de sessão que serão usados para ter acesso à base de dados de mensagens para poder manipulá-las.
No Servlet, procure o método processRequest e insira o código listado a seguir, logo após a declaração do método processRequest.
request.getSession(true).
Essa instrução é usada para que seja obtido o identificador da sessão atual ou para criar uma nova. Esse resultado acionará os métodos sessionCreated e sessionDestroyed do bean GerenciadorSessao. Depois, ainda dentro do método processRequest, insira o código listado a seguir para que os dados lidos da base de dados sejam decodificados e formatados em uma página HTML que será apresentada ao usuário final.
List news = mensagensFacade.findAll(); for (Iterator it = news.iterator(); it.hasNext();) { Mensagens elem = (Mensagens) it.next();
out.println(" <b>" + elem.getTitulo() + " </b><br />"); out.println(elem.getMensagem() + "<br /> ");
}
out.println("<a href='InserirMensagem'>Postar nova mensagem</a>");
Após inserir esse código, adicione as instruções seguintes para que apareça o número de usuários lendo as mensagens que estão sendo postadas.
out.println("<br><br>");
out.println(gerenciadorSessao.getContagemSessoes() + " usuários lendo as mensagens").
Criando o Servlet InserirMensagem
Agora, será criado o Servlet InserirMensagem, que será usado para enviar mensagens. Ele utilizará anotações para injetar os recursos JMS que criamos diretamente no servlet, especificando o nome variável e o nome para o qual é mapeado. Depois, será adicionado o código para enviar a mensagem JMS e o código para o formulário HTML para adicionar uma mensagem.
O Servlet é criado como os demais, por meio da opção “Novo -> Servlet”. Após a realização do Servlet, adicione as anotações listadas a seguir, a fim de que ele possa acessar o provedor de JMS (jms/NovaMansagemFactory) e o próprio serviço JMS (jms/NovaMansagem) no servidor de aplicações:
@Resource(mappedName="jms/NovaMansagemFactory") private ConnectionFactory connectionFactory.
@Resource(mappedName="jms/NovaMansagem") private Queue queue.
Depois, no método processRequest() do Servlet, é necessário adicionar o seguinte código-fonte:
if ((titulo != null) && (mensagem != null)) { try {
Connection connection = connectionFactory.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE).
MessageProducer messageProducer = session.createProducer(queue); ObjectMessage message = session.createObjectMessage().
Mensagens e = new Mensagens(). e.setTitulo(titulo). e.setMensagem(mensagem). message.setObject(e). messageProducer.send(message). messageProducer.close(). connection.close(). response.sendRedirect("ListarMensagens"). } catch (JMSException ex) {
ex.printStackTrace(). }
Nesse código, a instrução “if ((titulo != null) && (mensagem != null))” verifica se o Servlet recebeu esses parâmetros do formulário HTML e, se houver valores, ele iniciará o procedimento para inserir esses dados no banco de dados. Assim, a instrução “Connection connection = connectionFactory.createConnection();” criará uma conexão ao provedor de JMS do servidor de aplicações.
A instrução “Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);” cria a sessão de comunicação com o provedor de JMS. Depois, as instruções “MessageProducer messageProducer =
session.createProducer(queue);” e “ObjectMessage message =
session.createObjectMessage();” realizarão uma fila que processará as mensagens e a criação de uma posição para elas dentro dessa fila.
Após, as instruções geram o objeto na memória que será enviado para a fila de mensagens por meio da instrução “messageProducer.send(message);”. Assim que a mensagem for enviada, as sessões serão encerradas pelos métodos close(), e o processamento dessas mensagens ficará a cargo do servidor de aplicações, que as processará de acordo com a prioridade de tarefas que ele tem para executar. Como as operações são assíncronas, quando uma mensagem é gravada na base de dados, pode ocorrer que o Servlet que lista as mensagens acesse a base de mensagens antes que a última tenha sido gravada, fazendo com que ela não apareça na lista.
A última alteração nesse Servlet é a adição do código listado a seguir:
out.println("<form>").
out.println("Título: <input type='text' name='titulo'><br/>");
out.println("Messagem: <textarea name='mensagem'></textarea><br/>"); out.println("<input type='submit'><br/>");
out.println("</form>");
Esse código será usado para montar o formulário que interagirá com o usuário, ou seja, é o lugar onde ele digita as mensagens que serão armazenadas na base de dados.
* O QR Code é um código de barras que armazena links às páginas da web. Utilize o leitor de QR Code de sua preferência
Conclusão
Finalizamos aqui o desenvolvimento de aplicativos distribuídos, usando um exemplo que aplica um serviço, por meio da API JMS.
Na aula 20 abordaremos algumas questões a respeito da plataforma Java EE, tentando esclarecer alguns pontos que tenham ficado em aberto.
Caso fique alguma dúvida, leve a questão ao Fórum e divida-a com seus colegas e professor.
REFERÊNCIA
KEITH, Mike.; SCHINCARIOL, Merrick. EJB 3 Professional: Java Persistence API. United States of America: A Press, 2008.