Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Receber redelivery na mesma conexão

Bom dia

No meu sistema estou estou mantendo uma conexão aberta em um singleton para consumir as mensagens. Porém ele não recebe redelivery, se uma mensagem não é entregue ele pula pra próxima e a anterior continua aparecendo como não consumida.

Tem alguma maneira de receber redelivery na mesma conexão?

Segue o codigo

@Startup

@Singleton

public class MensageriaInit {

Connection connection;
Session session;
MessageConsumer consumer;

@PostConstruct
public void inicializaActiveMQ() {
    InitialContext context;
    ConsumerMessageListener c = new ConsumerMessageListener();
    c.injetarEM(em);
    try {
        context = new InitialContext();

        ConnectionFactory factory = (ConnectionFactory) context.lookup("ConnectionFactory");
        connection = factory.createConnection();
        connection.start();
        Destination fila = (Destination) context.lookup("teste");
        session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);

        consumer = session.createConsumer(fila);

        consumer.setMessageListener(new MessageListener() {
            @Override
            public void onMessage(Message message) {
                TextMessage textMessage = (TextMessage) message;
                try {
                    System.out.println(textMessage.getText() + " +++++++++++++++++++++++++++++++++++++++++++++++");
                } catch (JMSException ex) {
                    Logger.getLogger(MensageriaInit.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });
    } catch (NamingException ex) {
        Logger.getLogger(MensageriaInit.class.getName()).log(Level.SEVERE, null, ex);
        throw new EJBException(ex);
    } catch (JMSException ex) {
        Logger.getLogger(MensageriaInit.class.getName()).log(Level.SEVERE, null, ex);
        throw new EJBException(ex);
    }
}

@PreDestroy
public void preDestroy() {
    try {
        consumer.close();
        session.close();
        connection.close();
    } catch (JMSException ex) {
        Logger.getLogger(MensageriaInit.class.getName()).log(Level.SEVERE, null, ex);
    }
}

}

1 resposta

Sim, é possível. Basta configurar o RedeliveryPolicy:

RedeliveryPolicy policy = connection.getRedeliveryPolicy();
policy.setInitialRedeliveryDelay(500);
policy.setBackOffMultiplier(2);
policy.setUseExponentialBackOff(true);
policy.setMaximumRedeliveries(2);