1 先导入依赖
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.4.0</version>
</dependency>
2 recketMQ分很多种消息的发送与接收方式,用的比较多的发送消息的方式有4中
/*
1 同步
2 异步
3 单项发送
4 死信
*/
3 (1)同步 我只写了三种
// 一 同步发送 ,发送成功之后,在收到服务端的响应后,才会继续发下一条
//适用场景:短信发送
public static void main(String[] args) {
try {
// 1 创建一个提供消息的对象,准备发送消息
DefaultMQProducer mq=new DefaultMQProducer("xxt-producer");
// 2通过nameServer对象,找到我们要往哪里发送消息(IP,端口)
mq.setNamesrvAddr("192.168.138.128:9876");
// 3 启动mq对象
mq.start();
// 4 写一条数据
String a="{name:'张三',age:12}";
// 5 创建消息(Topic,messageKey,Tag)
Message msg=new Message("tm-user","tm_tags","tm_keys",a.getBytes());
// 6 通过nameServer找到broker后发送消息
SendResult send = mq.send(msg);
//返回发送结果进行查看
System.out.println(send);
// 7 关闭连接
mq.shutdown();
}catch (Exception e){
e.printStackTrace();
}
}
(2)异步发送消息
//异步发送消息
//一般用在发送方不用等待服务器第一时间的响应,可以直接发送下一条消息
//应用场景:用户上传身份证进行验证信息
//等待到什么时候服务器审核到了用户发送过来的身份信息
//再进行回调
public static void main(String[] args) throws MQClientException, RemotingException, InterruptedException {
//前两步不变
DefaultMQProducer producer = new DefaultMQProducer("tm_producer");
producer.setNamesrvAddr("192.168.3.128:9876");
//需要将producer对象启动起来
producer.start();
//编辑消息
String aa = "{name:'佳佳王',age:50}";
//创建消息
Message msg = new Message("topicTmTest",
"tagsTmTest","keyTmTest",aa.getBytes());
//异步消息发送,通过SendCallback来进行设置发送成功和失败的回调
producer.send(msg, new SendCallback() {
//这里的成功/失败不会影响后续代码的执行
@Override
public void onSuccess(SendResult sendResult) {
//成功
System.out.println("成功回调了");
producer.shutdown();
}
@Override
public void onException(Throwable throwable) {
//失败
System.out.println("失败回调了");
producer.shutdown();
}
});
//执行一个代码试试看情况
System.out.println("这是写在回调函数之后的代码");
//不能关闭producer对象
//因为producer要在后续代码执行的同时,同时监控成功/失败回调
}
3 单线发送
// 单线发送
//只管发,不管早晚,也不管成败
//应用场景:用于耗时短、且有可靠性,回调要求不高,例如 日志记录
public static void main(String[] args) {
try {
//1 还是创建一个提供消息的对象,准备发送
DefaultMQProducer mq=new DefaultMQProducer("xxt-producer");
//2 通过nameServer对象,找到我们要往哪里发送消息(IP,端口)
mq.setNamesrvAddr("192.168.138.128:9876");
//3 需要将producer对象启动起来
mq.start();
// 4 编辑消息
String a = "{name:'这是2笔订单',price:400.00}";
// 5 创建消息
Message msg=new Message("tm-hn-topic","tm-hn-tag",
"tm-hn-messhageKey",a.getBytes());
// 6 发送消息
mq.sendOneway(msg);
//7 关闭连接
mq.shutdown();
}catch (Exception e){
e.printStackTrace();
}
}
4 消费信息
//消费信息
//注意,同一个消息可以被不同组的消费者消费
//不能被同一组消费者重复消费
public static void main(String[] args) {
try {
//1 创建消费者对象
//Push 是在消费者消费消息后可以返回告诉MQ消费状态的对象
//Pull 是只管消费的对象,后续可能没什么处理
DefaultMQPushConsumer mq=new DefaultMQPushConsumer("tm_consumer");
//2 通过NameSrv设置IP+端口
mq.setNamesrvAddr("192.168.138.128:9876");
//3 设置一些消息的参数
//是否顺序消费(先进先出/先进后出)
//CONSUME_FROM_FIRST_OFFSET先进先出
mq.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
// 4 设定要消费的哪类信息
mq.subscribe("tm-user","tm_tags");
// 5 进行消费
mq.registerMessageListener(new MessageListenerOrderly() {
@Override
public ConsumeOrderlyStatus consumeMessage(List<MessageExt> list, ConsumeOrderlyContext consumeOrderlyContext) {
//list就是根据条件得到的数据
//consumeOrderlyContext就是设置各种属性的上下文对象
//是否设置消费的消息在 被消费后被标记为以消费,相当于是删除的意思
consumeOrderlyContext.setAutoCommit(true);
for (MessageExt messageExt : list) {
byte[] body = messageExt.getBody();
String str = new String(body);
//转JSON
JSONObject jsonObj = JSONObject.parseObject(str);
String msgId = messageExt.getMsgId();
String topic = messageExt.getTopic();
String tags = messageExt.getTags();
System.out.print("姓名:"+jsonObj.get("name")+",年龄:"+jsonObj.get("age")+",");
System.out.println(msgId+","+topic+","+tags);
}
return ConsumeOrderlyStatus.SUCCESS;
}
});
//启动
mq.start();
}catch (Exception e){
e.printStackTrace();
}
}