Um Bean controlado por mensagem é um Enterprise Bean que permite aos aplicativos J2EE processarem mensagens de forma assíncrona. O Bean age como um ouvinte de mensagens Java Message Service (JMS), que é semelhante a um ouvinte de eventos, exceto pelo fato de que o Bean controlado por mensagem recebe mensagens em vez de eventos. As mensagens podem ser enviadas por qualquer componente J2EE: um cliente de aplicativo, outro Enterprise Bean ou um componente da Web.
Você pode usar Beans controlados por mensagem em vez dos Beans de sessão ou de entidade se não quiser restringir os recursos do servidor. Os Beans de sessão e de entidade também permitem enviar e receber mensagens JMS, mas eles operam de forma síncrona, e de forma assíncrona, como fazem os Beans de controlados por mensagem.
Ao contrário dos Beans de sessão e dos Beans de entidade, os clientes dos Beans controlados por mensagem não pode acessá-los através de interfaces. O Bean controlado por mensagem apresenta apenas uma classe de Bean.
Um Bean controlado por mensagem se parece em muitos aspectos a um Bean de sessão sem estado:
As variáveis de instância da instância do Bean controlado por mensagem podem manter algumas informações de estado através da manipulação de mensagens de clientes, como uma referência a objeto para um objeto do Enterprise Bean.
Quando uma mensagem chega, o recipiente chama o método onMessage do Bean controlado por mensagem para processar a mensagem. O método onMessage normalmente envia a mensagem a um dos cinco tipos de mensagem JMS e manipula a mensagem de acordo com a lógica empresarial do aplicativo. O método onMessage pode chamar métodos de ajuda ou chamar um Bean de sessão ou de entidade para processar a informação da mensagem e possivelmente armazenar os resultados em um banco de dados.
Muitas instâncias de uma classe de Bean controlado por mensagem podem ser executadas simultaneamente, permitindo que um fluxo de mensagens seja processado simultaneamente. Devido ao fato de não haver garantias em relação à ordem exata na qual as mensagens são entregues a estas instâncias, os Beans controlados por mensagem devem estar preparados para manipular as mensagens que estão fora de seqüência. Por exemplo, a mensagem de cancelamento de uma reserva pode ser entregue antes da mensagem de solicitação da reserva.
O recipiente fornece a instância do Bean controlado por mensagem com MessageDrivenContext, que dá à instância do Bean acesso ao contexto mantido pelo recipiente. Dependendo se o Bean gerenciar suas próprias transações ou contar com o gerenciamento de transação do recipiente, poderá acessar diferentes métodos de MessageDrivenContext para manipular transações.
Se o Bean usar esta interface para demarcar as transações, o recebimento da mensagem que faz com que o Bean seja chamado não fará parte da transação. Se desejar que o recebimento da mensagem faça parte da transação, você deve usar as transações gerenciadas por recipiente.
Os métodos newInstance, setMessageDrivenContext, ejbCreate e ejbRemove de um Bean controlado por mensagem são chamados em contextos de transação não especificados. Nunca há um contexto de transação de cliente disponível quando um Bean controlado por mensagem é chamado porque um contexto de transação não flui com uma mensagem JSM.
O Bean pode usar os seguintes métodos MessageDrivenContext: