Desenvolvendo um aplicativo corporativo para utilizar beans orientados por mensagens
Os aplicativos podem usar beans acionados por mensagens como consumidores de mensagens assíncronos. Você implementa um bean acionado por mensagens como um listener de mensagens para um destino. O bean acionado por mensagens é invocado por uma especificação de ativação ou listener JMS quando uma mensagem chega ao destino de entrada que está sendo monitorado.
Sobre Esta Tarefa
Você desenvolve um aplicativo corporativo para usar um bean acionado por mensagens como com qualquer outro enterprise bean, exceto que o bean acionado por mensagens não possui uma interface inicial ou uma interface remota.
Você deveria desenvolver um bean acionado por mensagens para delegar o processamento de negócios de mensagens de entrada a outro enterprise bean, o que fornece uma separação clara entre a manipulação de mensagens e o processamento de negócios. Essa separação também significa que o processamento de negócios pode ser invocado pela chegada de mensagens recebidas ou, por exemplo, por um cliente WebSphere J2EE. As respostas podem ser manipuladas por outro enterprise bean agindo como um bean emissor ou podem ser manipuladas no bean acionado por mensagens.
Os beans acionados por mensagens do EJB 2.0 suportam apenas o sistema de mensagens JMS (Java™ Message Service). Os beans acionados por mensagens EJB 2.1 e EJB 3 podem suportar outros tipos de sistemas de mensagens além do JMS. Todos os beans acionados por mensagens devem implementar a interface MessageDrivenBean. Para o sistema de mensagens JMS, um bean acionado por mensagens também deve implementar a interface do listener de mensagens javax.jms.MessageListener. Outros adaptadores de recursos compatíveis ao Java EE Connector Architecture (JCA) podem fornecer suas próprias interfaces do listener de mensagem que devem ser implementadas.
É possível usar o assistente Novo Enterprise Bean do Rational Application Developer para criar um enterprise bean com um tipo de bean Bean Acionado por Mensagens. O assistente cria métodos apropriados para o tipo de bean.
public class MyJMSppMDBBean implements MessageDrivenBean, javax.jms.MessageListener
Um bean acionado por mensagens pode ser registrado no serviço de cronômetro EJB para notificações de eventos baseados em tempo, se também implementar a interface javax.ejb.TimedObject e chamar o método de retorno de chamada do cronômetro pela seguinte chamada: void ejbTimeout(Timer). No tempo planejado, o contêiner então chama o método ejbTimeout do bean acionado por mensagens.
- onMessage(message), que devem atender aos seguintes requisitos:
- O método deve ter um único argumento do tipo javax.jms.Message.
- A cláusula throws não deve definir nenhuma exceção de aplicativo.
- Se o bean acionado por mensagens estiver configurado para usar transações gerenciadas por bean, ele deverá chamar a interface javax.transaction.UserTransaction para fazer o escopo das transações. Como estas chamadas ocorrem dentro do método onMessage(), o escopo de transação não inclui o recebimento de mensagem inicial. Para obter mais informações, consulte o tópico sobre suporte a transações de beans acionados por mensagens.
Para tratar a mensagem no método onMessage() (por exemplo, para passar a mensagem para o outro enterprise bean), use o JMS padrão. Isto é conhecido como sistema de mensagens gerenciado por bean.
Se estiver usando um adaptador de recursos compatível com JCA com uma interface do listener de mensagens diferente, outro método além do método onMessage() pode ser necessário. Para obter informações sobre a interface do listener de mensagens necessária, consulte a documentação que foi fornecida com seu adaptador de recursos compatível com JCA.
- ejbCreate()
Você deve definir e implementar um método ejbCreate para cada maneira na qual você deseja que uma nova instância de um enterprise bean seja criada.
- ejbRemove()
Este método é invocado pelo contêiner quando um cliente invoca o método remove herdado pela interface inicial do enterprise bean da interface javax.ejb.EJBHome. Esse método deve conter todo o código que você deseja executar antes de uma instância de enterprise bean ser removida do contêiner (e os dados associados serem removidos da origem de dados).
- ejbTimeout(Timer)
Esse método é necessário apenas para suportar notificações do serviço de cronômetro e contém a lógica de negócios que manipula os eventos de tempo recebidos.
Procedimento
Resultados
Exemplo
O exemplo a seguir mostra como criar a classe do bean acionado por mensagens. O código de exemplo mostra como acessar o texto e o ID de Mensagem JMS, a partir de uma mensagem JMS do tipo TextMessage. Neste exemplo, primeiro o método onMessage() de um bean acionado por mensagens é usado para descompactar a mensagem de texto recebida e extrair o texto e o identificador de mensagem; em seguida, um método putMessage privado (definido na mesma classe do bean de mensagem) é usado para colocar a mensagem em outra fila:
public void onMessage(javax.jms.Message msg)
{
String text = null;
String messageID = null;
try
{
text = ((TextMessage)msg).getText();
System.out.println("senderBean.onMessage(), msg text2: "+text);
//
// armazenar o id da mensagem para uso como o valor do Correlator
//
messageID = msg.getJMSMessageID();
// Chamar um método privado para colocar a mensagem em outra fila
putMessage(messageID, text);
}
catch (Exception err)
{
err.printStackTrace();
}
return;
}