rocketmq使用记录(五)

消息类型

普通消息 顺序消息 分布式事务消息

普通消息

   Message msg = new Message("TopicTest" /* Topic */,
                    "TagA" /* Tag */,
                    ("Hello RocketMQbroker-b " + i).getBytes(RemotingHelper.DEFAULT_CHARSET) /* Message body */
                );
  SendResult sendResult = producer.send(msg);

启动2个一样的消费者,普通消息会被分配到2个消费者上面去消费

顺序消息

 String[] tags = new String[]{"createTag","payTag","sendTag"};
                for(int order=0;order<5;order++){
                    for(int type=0;type<3;type++){
                        Message msg = new Message("TopicTest",tags[type % tags.length],order+":" +type,(order+":" +type).getBytes());
                        SendResult sendResult = producer.send(msg, new MessageQueueSelector() {
                            @Override
                            public MessageQueue select(List<MessageQueue> list, Message message, Object o) {

                                Integer id = (Integer)o;

                                int index = id % list.size();

                                return list.get(index);
                            }
                        },order);
                        System.out.printf("%s%n", sendResult);

                    }
                }

接收到的消息: 4:0 ConsumeMessageThread_1 接收到的消息: 4:0 [MessageExt [queueId=0, storeSize=179, queueOffset=1867, sysFlag=0, b 接收到的消息: 4:1 ConsumeMessageThread_1 接收到的消息: 4:1 接收到的消息: 4:2 ConsumeMessageThread_1 接收到的消息: 4:2

事务消息

 TransactionCheckListener checkListener = new TransactionCheckListenerImpl();
        TransactionMQProducer producer = new TransactionMQProducer("transactionProducerGroup");
        producer.setNamesrvAddr("10.10.10.108:9876;10.10.10.190:9876");
        producer.setTransactionCheckListener(checkListener);
        producer.start();


        TransactionExecuterImpl transactionExecuter = new TransactionExecuterImpl();

        try{

            Message msg1 = new Message("TopicTest", "TagA" ,"key1",("Hello RocketMQ1 " ).getBytes(RemotingHelper.DEFAULT_CHARSET) );

            Message msg2 = new Message("TopicTest", "TagA" ,"key2",("Hello RocketMQ1 " ).getBytes(RemotingHelper.DEFAULT_CHARSET) );


            SendResult sendResult1 = producer.sendMessageInTransaction(msg1,transactionExecuter,null);

            logger.info("{} mesg1: {}",new Date(),sendResult1);

             sendResult1 = producer.sendMessageInTransaction(msg2,transactionExecuter,null);
            logger.info("{} mesg2: {}",new Date(),sendResult1);


        }catch(Exception e){
            e.printStackTrace();
        }

        producer.shutdown();


public class TransactionExecuterImpl implements LocalTransactionExecuter{

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Override
    //事务消息是否对消费者可见,完全由事务返回给RMQ的状态码决定(状态码的本质也是一条消息)。
    public LocalTransactionState executeLocalTransactionBranch(Message message, Object o) {

       try{

           logger.info("{} 本地事务执行成功",new Date());
       }catch(Exception e){
           e.printStackTrace();
           logger.info("{} 事务执行失败"+e,new Date());
           return LocalTransactionState.ROLLBACK_MESSAGE;
       }
        return LocalTransactionState.COMMIT_MESSAGE;
    }
}
public class TransactionCheckListenerImpl implements TransactionCheckListener {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Override
    //如果某条消息没有返回,那么此事件会主动询问查询数据库等渠道 获取消息是否正常
    public LocalTransactionState checkLocalTransactionState(MessageExt messageExt) {

        logger.info("server checking Msg {}",messageExt.toString());

        return LocalTransactionState.COMMIT_MESSAGE;
    }
}

}



猜你喜欢

转载自my.oschina.net/u/3277181/blog/1632139
今日推荐