Duvida em JMS MessageListener no Glassfish

8 respostas
kleins

Boa noite pessoal,

Estamos desenvolvendo uma aplicação que usa EJB e JMS.
Criamos um Pool de conexões, uma fila JMS e um MessageListener… até ai tudo funcionando beleza, enviando mensagens para a fila e o MessageListener consumindo normalmente.

Quando criamos uma segunda estrutura como esta (Pool, Fila e MessageListener), notei que ambos os MessageListener estavam consumindo mensagens de ambas as filas.

A minha pergunta é:
O comportamento padrão é este mesmo?

O mais estranho, é que em cada MessageListener, eu coloco no MappedName qual é a fila que ele deve consumir, e mesmo assim, ele consome as duas.

@MessageDriven(mappedName = "jms/log", activationConfig =  {
        @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
    })
public class DatalogEJB implements MessageListener {
@MessageDriven(mappedName = "jms/task", activationConfig =  {
        @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
    })
public class TaskJmsEJB implements MessageListener {

Não encontrei nada nos exemplos que usei pois todos eles criam apenas uma fila e não duas ou mais…

Caso este comportamento seja normal, fica outra pergunta :
Se um mesmo MessageListener vai poder consumir varias filas, tenho como ter varias instâncias dele (thread-pool) monitorando varias filas para que eu tenha processamento concorrente?

Um abraço e valeu!

8 Respostas

sapobomba

Olá kleins,

Alguma solução para o seu problema?

Também estou tendo problemas, mas no meu caso acho que tem algo de errado com meu MessageListener.

As mensagens aparentemente estão sendo enviadas corretamente, mas o MessageListener não está consumindo elas.

Mas conforme o trecho de código que vc postou, eu não havia colocado o mappedName na declaração da classe.

Vou fazer um teste para ver se é este o problema.

kleins

Fala sapobomba

Então, ainda não cheguei a uma solução, e acho que vou acabar alterando a minha arquitetura inicial.

Eu ia usar um MessageListener para cada fila, mas se continuar assim, vou usar um unico MessageListener para varias filas e dentro do MessageListener, faço uma checagem de qual é o tipo de mensagem e ai faço o processamento correto a cada uma delas…

Estou tentando aumentar o numero de threads do MDB container do Glassfish pra teste.

Vc tem certeza de que a mensagem esta indo pra fila mesmo?

Se te ajudar eu posso postar o código inteiro das classes.

Um abs

sapobomba

Fala kleins,

Cara, está indo sim.

Configurei para gravar no banco de dados, no meu caso oracle, ele cria as tabelas todas.

Quando eu envio uma mensgam, ele insere os registros lá.

Na realidade é o seguinte, estou precisando fazer o seguinte:

Tenho 2 instancias do jboss em cluster, rodando em baixo de um apache mod_jk para fazer o balanceamento, tenho alguns objetos em memória, quando um deles é alterado, quero enviar uma mensagem pros demais nodos do cluster para eles recarregarem isto.

Não tenho (e nem quero) configurar, fixar quem é quem nas minhas instalações, ou seja, quero jogar a mensagem na rede e quem for de interesse, fazer a operação.

Eu coloquei o mappedName, mas deu erro dizendo que o recurso já estava registrado, algo assim.

To tentando descobrir uma solução mas ate agora nada.

Abraço

johnny_quest

Para resolver o seu problema você deve utilizar o atributo messageSelector nas anotações. Com isso você defini
no producer e o consumer qual mensagens deve receber.

http://publib.boulder.ibm.com/infocenter/wmbhelp/v6r1m0/index.jsp?topic=%2Fcom.ibm.etools.mft.doc%2Fac24876_.htm

kleins

Opa.
Valeu, vou tentar.
Abs

kleins

Entendi…

Esta usando qual Broker?
Esta usando o Broker Embedded ou stand alone?

Abs

sapobomba:
Fala kleins,

Cara, está indo sim.

Configurei para gravar no banco de dados, no meu caso oracle, ele cria as tabelas todas.

Quando eu envio uma mensgam, ele insere os registros lá.

Na realidade é o seguinte, estou precisando fazer o seguinte:

Tenho 2 instancias do jboss em cluster, rodando em baixo de um apache mod_jk para fazer o balanceamento, tenho alguns objetos em memória, quando um deles é alterado, quero enviar uma mensagem pros demais nodos do cluster para eles recarregarem isto.

Não tenho (e nem quero) configurar, fixar quem é quem nas minhas instalações, ou seja, quero jogar a mensagem na rede e quem for de interesse, fazer a operação.

Eu coloquei o mappedName, mas deu erro dizendo que o recurso já estava registrado, algo assim.

To tentando descobrir uma solução mas ate agora nada.

Abraço

sapobomba

Então, não fiz nenhuma configuração específica quanto a isto. Na realidade estou “brincando” com o JMS pela primeira vez, então talvez seja algo bem básico.

Meus JBoss devem estar com a configuração padrão quanto a isto.

Bem, fiz um teste conforme um tutorial que achei agora: http://www.mastertheboss.com/jboss-application-server/198-jboss-jms-topic-example.html

O nodo X enviou a mensagem e ele mesmo consumiu, no exemplo, pelo que entendi, era só isto mesmo. Bem, pelo menos sei que não é algum problema relacionado à rede ou firewall.

Na realidade o que eu preciso fazer agora é “propagar” as mensagem para os demais JBoss.

Se vc puder postar uns trechos das suas classes aqui, quem sabe me ajude.

Abraço

kleins

É…
Se o exemplo funcionou ta certo…

Acho que quando vc usa uma fila do tipo TOPIC, vc deve idetificar o nó na hora de consumir a mensagem.

Se vc não fizer isso, o primeiro que consumir a mensagem vai fazer com que o broker descarte esta e os demais não vão conseguir consumi-la…

Acho que é isso…

Criado 5 de agosto de 2011
Ultima resposta 10 de ago. de 2011
Respostas 8
Participantes 3