流程
使用限制
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.4.0</version>
</dependency>
生产者
public class Producer {
public static void main(String[] args) throws Exception {
// 1.创建消息生产者producer,并制定生产者组名 事务生产者
TransactionMQProducer producer = new TransactionMQProducer("group5");
// 2.指定NameServer地址
producer.setNamesrvAddr("localhost:9876");
// 生产者监听器
producer.setTransactionListener(new TransactionListener() {
/**
* 在该方法中执行本地事务 第二步
* @param message
* @param o
* @return
*/
public LocalTransactionState executeLocalTransaction(Message message, Object o) {
if (StringUtils.equals("taga",message.getTags())){
return LocalTransactionState.COMMIT_MESSAGE;
} else if (StringUtils.equals("tagb",message.getTags())){
return LocalTransactionState.ROLLBACK_MESSAGE;
} else if (StringUtils.equals("tagc",message.getTags())){
return LocalTransactionState.UNKNOW;
}
return LocalTransactionState.UNKNOW;
}
/**
* 该方法是mq进行消息事务状态回查 第三步
* @param messageExt
* @return
*/
public LocalTransactionState checkLocalTransaction(MessageExt messageExt) {
System.out.println("消息的tag:"+messageExt.getTags());
return LocalTransactionState.COMMIT_MESSAGE;
}
});
// 3.启动producer
producer.start();
String[] tags = {"taga","tagb","tagc"};
for (int i = 0; i < 3; i++) {
// 4.创建消息对象,指定主题Topic、Tag和消息体
/*
参数1:消息主题Topic
参数2:消息Tagf
参数3:消息内容
*/
Message msg = new Message("transactionTopic",tags[i],("hello world"+i).getBytes());
// 5.发送消息结果包含 发送状态 消息id 消息接收队列id等 第一步
SendResult result = producer.sendMessageInTransaction(msg,null);
System.out.println("发送结果"+result);
// 线程睡眠1秒
TimeUnit.SECONDS.sleep(3);
}
// 6关闭生产者producer
// producer.shutdown();
}
}
消费者
public class Consumer {
public static void main(String[] args) throws MQClientException {
// 1.创建消费者Consumer,制定消费者组名
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("group5");
// 2.指定Nameserver地址
consumer.setNamesrvAddr("localhost:9876");
// 3.订阅主题Topic和Tag
consumer.subscribe("transactionTopic","*");
// 4.设置回调函数,处理消息
consumer.registerMessageListener(new MessageListenerConcurrently() {
//接收消息内容
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> list, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
for (MessageExt messageExt : list) {
System.out.println(new String(messageExt.getBody()));
}
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
// 5.启动消费者consumer
consumer.start();
System.out.println("消费者启动");
}
}