rocketmq常用应用场景
解耦
流量削峰
大数据处理
系统异构
消息发送
连接过程
同步消息
事务
两阶段提交(RocketMQ使用)
三阶段提交(RocketMQ没有使用)
事务执行大致流程
事务实例代码,发送端
package com.rocketmq;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.LocalTransactionState;
import org.apache.rocketmq.client.producer.TransactionListener;
import org.apache.rocketmq.client.producer.TransactionMQProducer;
import org.apache.rocketmq.client.producer.TransactionSendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageExt;
public class TransactionProducer {
public static void main(String[] args) throws MQClientException {
TransactionMQProducer producer = new TransactionMQProducer("xoxogp");
producer.setNamesrvAddr("192.168.0.104:9876");
//回调
producer.setTransactionListener(new TransactionListener() {
public LocalTransactionState executeLocalTransaction(Message msg, Object arg) {
//执行本地事务
System.out.println("******executeLocalTransaction******");
System.out.println("msg = " + new String(msg.getBody()));
System.out.println("msg = " + msg.getTransactionId());
/**
* 事务方法写这里,同步执行
* a()
* b()
* c()
* d()
*/
try {
// 业务
} catch (Exception e) {
return LocalTransactionState.ROLLBACK_MESSAGE;
}
//真正发出去的数据 可用
return LocalTransactionState.COMMIT_MESSAGE;
}
public LocalTransactionState checkLocalTransaction(MessageExt msg) {
//Broker 端回调,检察事务
System.out.println("******checkLocalTransaction******");
System.out.println("msg = " + new String(msg.getBody()));
System.out.println("msg = " + msg.getTransactionId());
return LocalTransactionState.COMMIT_MESSAGE;
}
});
producer.start();
TransactionSendResult sendResult = producer.sendMessageInTransaction(
new Message("xxxooo001", "测试!这是事务消息".getBytes()), null);
System.out.println("sendResult = " + sendResult);
System.out.println("已经停机");
}
}
RocketMQ消费流程
RocketMQ顺序消费
示例代码发送端
package com.rocketmq;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.MessageQueueSelector;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageQueue;
import java.util.List;
public class Producer02 {
public static void main(String[] args) throws Exception {
DefaultMQProducer producer = new DefaultMQProducer("mq02");
producer.setNamesrvAddr("192.168.1.9:9876");
producer.start();
for (int i = 0; i < 20; i++) {
Message message = new Message("myTopic02", ("hi! " + i).getBytes());
//实现的消息队列选择器有三种: SelectMessageQueueByRandom, SelectMessageQueueByHash, SelectMessageQueueByMachineRoom
producer.send(message, new MessageQueueSelector() {
public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {
MessageQueue messageQueue = mqs.get((Integer) arg);
return messageQueue;
}
}, 1, 5000);
}
}
}
示例代码接收端
package com.rocketmq;
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.*;
import org.apache.rocketmq.common.message.MessageExt;
import java.util.List;
public class Consumer02 {
public static void main(String[] args) throws Exception {
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("mq02");
consumer.setNamesrvAddr("192.168.1.9:9876");
consumer.subscribe("myTopic02", "*");
//设置最大和最小消费线程数为1
consumer.setConsumeThreadMax(1);//默认大小为20
consumer.setConsumeThreadMin(1);//默认大小为20
//两种消费模式
/*consumer.registerMessageListener(new MessageListenerConcurrently() {//并发消费
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
//默认状态有两种: RECONSUME_LATER 和 CONSUME_SUCCESS
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});*/
consumer.registerMessageListener(new MessageListenerOrderly() {//顺序消费
public ConsumeOrderlyStatus consumeMessage(List<MessageExt> msgs, ConsumeOrderlyContext context) {
for (MessageExt msg : msgs) {
System.out.println("msg = " + new String(msg.getBody()));
}
//默认状态有四种 SUCCESS, ROLLBACK, COMMIT, SUSPEND_CURRENT_QUEUE_A_MOMENT;
return ConsumeOrderlyStatus.SUCCESS;
}
});
consumer.start();
}
}
consumer的启动过程(简述,源码)
Client和Server的交互方式
长连接和轮询(RocketMQ未使用)
长轮询(RocketMQ使用的这种)
交互过程:
1. Client->Server,有没有消息,有,返回,一次长轮询结束
2. Client->Server,有没有消息,没有,挂起,
Server有消息了,推给Client,一次长轮询结束