JMS - Processamento concorrente dentro do container?

7 respostas
P

Pessoal, estou com o seguinte problema:

Estou usando Message Driven Beans do tipo Queue, mas aparentemente as mensgens desta fila estão sendo processadas concorrentemente, pois tenho um gerador de IDs dentro do onMessage gerando o mesmo ID e assim dá erro, ou seja estão sendo processados quase ao mesmo tempo.
Seguem meus metodos:

//Envia a mensagem
private void sendMessage(MyDTO myDTO) throws EJBException {
        System.out.println("Looking up the factory ");
        
        InitialContext ctx = getContext();
        
        QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup("ConnectionFactory");
        
        
        System.out.println("Looking up the queue ");            
        Queue queue = (Queue) ctx.lookup("queue/myDestination");
        
        System.out.println("Creating the connection ");         
        
        QueueConnection connection = factory.createQueueConnection();
        
        System.out.println("Creating the session ");            
        QueueSession session = connection.createQueueSession(true, QueueSession.CLIENT_ACKNOWLEDGE);
        
        
        System.out.println("Creating the sender ");         
        QueueSender sender = session.createSender(queue);           
        ObjectMessage message = session.createObjectMessage();
        
        System.out.println ("Setting the object in message ");
        
        message.setObject(myDTO);
        
        
        
        System.out.println ("Sending the message ");
        
        sender.send(message);
        System.out.println ("Shuting down");
        session.commit();
        session.close();
        connection.close();
        
        System.out.println ("Done ! ");                                                         

}
//recebe a mensagem

public void onMessage(javax.jms.Message message) {

System.out.println("Message Driven Bean got message " + message);
if (message instanceof ObjectMessage) {

int id = generateID();

addRegister(id, message);

}

}

Desta maneira meu gerador gera o mesmo ID e dá erro de inserção (PK) na base.

Assim gostaria que a meu metodo onMessage processasse uma mensagm de cada vez, uma após o termino da outra.

Se alguem puder me ajudar eu agradeço.

Obrigado

7 Respostas

A

Configure o container para criar apenas uma instância do MDB… embora eu ache que nesse caso vc precisaria rever o seu generateID para suportar processamento concorrente, pois o pool de beans do container é uma facilidade, não um problema…

S

Cara, no JBOSS 3.2.3 vc. configura um pool de MDB´s para processar queues do JMS por padrão o número máximo é 15 e o minimo 1.
muda a configuração pool e testa essa config tá no conf/standardjboss.xml

veja se isso te ajuda.

Falow
Stay

P

Obrigado cara, mas desculpe minha ignorancia sou novato com JMS, como posso configurar o container para receber apenas uma instancia do MDB?

Obrigado!

A

Depende… qual app server vc está usando??

P

Uso JBOSS, consegui resolver meu problema setando apenas uma instancia do meu MDB (standardjboss.xml), assim não há processamento concorrente das minhas mensagens, porém ficou muito mais lento…
será que tornar meus metodos synchronized, poderia resolver o problema?

A

Sincronizar o método que gera o ID é uma solução… mande o fonte do generateID, de repente a gente vê outras alternativas…

cv1

Voce nao acha que eh um pouquiiiiiiiiiiinho pesado demais usar um MDB pra gerar um ID? Se voce esta usando um banco de dados, pq nao usar ele?

Criado 14 de janeiro de 2005
Ultima resposta 14 de jan. de 2005
Respostas 7
Participantes 4