RocketMq(四、顺序消息)
rocketMQ通过将消息发送给指定的队列来实现顺序发送
Producer
package com.wk.test.rocketmqTest.shunxu; import org.apache.rocketmq.client.exception.MQBrokerException; import org.apache.rocketmq.client.exception.MQClientException; import org.apache.rocketmq.client.producer.DefaultMQProducer; import org.apache.rocketmq.client.producer.SendResult; import org.apache.rocketmq.common.message.Message; import org.apache.rocketmq.remoting.exception.RemotingException; import java.util.ArrayList; import java.util.List; import java.util.UUID; public class Producer { public static void main(String[] args) { DefaultMQProducer producer = new DefaultMQProducer("shunxu_producer"); producer.setNamesrvAddr("10.32.16.179:9876"); try { producer.start(); List<Order> orders = getOrders(); for(Order order:orders){ String uuid = UUID.randomUUID().toString(); Message message = new Message("shunxuTopic", "order",uuid,("顺序消费:订单号_"+order.getOrderId()+" 订单状态_"+order.getOrderStatus()).getBytes()); SendResult sendResult = producer.send(message, (list, message1, obj) -> { int value = obj.hashCode(); if(value < 0){ value = Math.abs(value); } //取obj的hashCode的绝对值,然后对list.size()进行取余,得到目标队列在list的下标 value = value % list.size(); return list.get(value); },order.getOrderId(),10000);//通过订单ID来获取对应的队列,保证每个订单的顺序是创建-支付-完成 System.out.println(sendResult); } } catch (MQClientException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } catch (RemotingException e) { e.printStackTrace(); } catch (MQBrokerException e) { e.printStackTrace(); }finally { producer.shutdown(); } } public static List<Order> getOrders(){ List<Order> orders = new ArrayList<>(); Order order = new Order(); order.setOrderId("111"); order.setOrderStatus("创建"); orders.add(order); order = new Order(); order.setOrderId("111"); order.setOrderStatus("支付"); orders.add(order); order = new Order(); order.setOrderId("222"); order.setOrderStatus("创建"); orders.add(order); order = new Order(); order.setOrderId("333"); order.setOrderStatus("创建"); orders.add(order); order = new Order(); order.setOrderId("111"); order.setOrderStatus("完成"); orders.add(order); order = new Order(); order.setOrderId("333"); order.setOrderStatus("支付"); orders.add(order); order = new Order(); order.setOrderId("222"); order.setOrderStatus("支付"); orders.add(order); order = new Order(); order.setOrderId("333"); order.setOrderStatus("完成"); orders.add(order); order = new Order(); order.setOrderId("222"); order.setOrderStatus("完成"); orders.add(order); return orders; } }
Consumer
package com.wk.test.rocketmqTest.shunxu; import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer; import org.apache.rocketmq.client.consumer.listener.ConsumeOrderlyContext; import org.apache.rocketmq.client.consumer.listener.ConsumeOrderlyStatus; import org.apache.rocketmq.client.consumer.listener.MessageListenerOrderly; import org.apache.rocketmq.client.exception.MQClientException; import org.apache.rocketmq.common.consumer.ConsumeFromWhere; import org.apache.rocketmq.common.message.MessageExt; import java.io.UnsupportedEncodingException; import java.util.List; public class Consumer { public static void main(String[] args) { DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("shunxuConsumer"); consumer.setNamesrvAddr("10.32.16.179:9876"); consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET); try { consumer.subscribe("shunxuTopic","*"); consumer.registerMessageListener(new MessageListenerOrderly() { @Override public ConsumeOrderlyStatus consumeMessage(List<MessageExt> list, ConsumeOrderlyContext consumeOrderlyContext) { consumeOrderlyContext.setAutoCommit(true); for(MessageExt messageExt:list){ try { System.out.println(new String(messageExt.getBody(),"UTF-8")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } return ConsumeOrderlyStatus.SUCCESS; } }); consumer.start(); } catch (MQClientException e) { e.printStackTrace(); } } }
Order
package com.wk.test.rocketmqTest.shunxu; public class Order { private String orderId; private String orderStatus; public String getOrderId() { return orderId; } public void setOrderId(String orderId) { this.orderId = orderId; } public String getOrderStatus() { return orderStatus; } public void setOrderStatus(String orderStatus) { this.orderStatus = orderStatus; } }