ActiveMQ Topic消息失败重发

       消息失败重发指的是当消息的接收方没有成功的消费消息,我们需要重发消息,让消息的接收方成功消费这个消息,保证事务的完整性和消息的一致性。

一、JMS消息确认机制

    在session接口中定义的几个常量:

   AUTO_ACKNOWLEDGE =  1    自动确认

  CLIENT_ACKNOWEDGE =  2    客户端手动确认

  DUPS_OK_ACKNOWLEDGE = 3  自动批量确认

  SESSION_TRANSACTED  =  0    事务提交并确认

二、 代码实现  

      消息消费端在创建session对象时需要制定应答模式为客户端手动应答,当消费者获取到消息并成功处理后。需要调用message.acknowledge()方法进行应答,通知Broker消费成功。如果处理过程中出现异常,需要调用session.recover()通知Broker重复消息,默认最多重复六次。

public class ActiveMQTest {
    //编写消息的发送方---消息的生产者
    @Test
    public void test1() throws Exception {
        //创建连接工厂对象
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
        //从工厂中获取连接对象
        Connection connection = connectionFactory.createConnection();
        //连接MQ服务
        connection.start();
        //获得回话(session)对象
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //通过session对象创建Topic
        Topic topic = session.createTopic("itheimaTopic");
        //通过session对象创建消息的发送者
        MessageProducer producer = session.createProducer(topic);
        //通过session创建消息对象
        TextMessage message = session.createTextMessage("ping111");
        //发送消息
        producer.send(message);
        //关闭相关资源
        producer.close();
        session.close();
        connection.close();
    }

    //编写消息的接收方---消息的消费者
    @Test
    public void test2() throws Exception {
        //创建连接工厂对象
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
        //从工厂中获取连接对象
        Connection connection = connectionFactory.createConnection();
        //连接MQ服务
        connection.start();
        //获得回话(session)对象
        final Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
        //通过session对象创建Topic
        Topic topic = session.createTopic("itheimaTopic");
        //通过session对象创建消息的发送者
        MessageConsumer consumer = session.createConsumer(topic);
        //指定消息监听器
        consumer.setMessageListener(new MessageListener() {
            //当我们监听的topic 中存在消息 这个方法自动执行
            public void onMessage(Message message) {
                TextMessage textMessage = (TextMessage) message;
                try {
                    if("ping".equals(textMessage.getText())){
                        System.out.println("消费者接收到了消息:" + textMessage.getText());
                        //客户端手动确认 通知mq这个消息 我消费了
                        message.acknowledge();
                    }else{
                        //模拟消息发送失败
                         System.out.println("消息处理失败了,进行重发。。。。。");
                        //通知mq进行重发  最多重发六次
                        session.recover();
                        int i = 1/0;
                    }
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        });
        //消息消费者 要时刻在线 连接对象 会话对象均不需要关闭
        //模拟web场景当执行结束后不能让线程结束
        while (true) {
            //死循环  不让消费者线程停掉
        }
    }
}

 

你可能感兴趣的:(消息队列)