1.基础版本

import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.common.message.Message;
import com.alibaba.fastjson.JSON; public class MQProducer {
public static void main(String[] args) throws Exception {
DefaultMQProducer producer = new DefaultMQProducer("G-Group_REQ");
producer.setNamesrvAddr("localhost:9876");
producer.start(); String jsonStr = JSON.toJSONString("Your JSON content");
Message msg = new Message("T-Topic", jsonStr.getBytes()); producer.send(msg);
producer.shutdown();
}
}

2.添加写消息失败处理:登记日志、定时处理、参数配置化

import cn.com.*.support.MQLogSupport;
import cn.com.*.entity.MQLog;
import cn.com.*.repository.MQLogRepository;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import net.javacrumbs.shedlock.core.SchedulerLock;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.common.message.Message;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List; @Component
public class MQLogSupportImpl implements MQLogSupport{
private final Logger logger = LoggerFactory.getLogger(MQLogSupport.class);
@Autowired
private MQLogRepository mqLogRepository; @Value("${rocketmq.name-server}")
String namesrvAddr; // 写消息服务
public void sendMessageNoTag(MQLog mqLog) {
try {
DefaultMQProducer producer = new DefaultMQProducer(mqLog.getMqGroup());
producer.setNamesrvAddr(namesrvAddr);
// 设置发送消息的超时时间为30秒
producer.setSendMsgTimeout(30000);
producer.start();
Message msg = new Message(mqLog.getMqTopic(), mqLog.getMqMessage().getBytes());
producer.send(msg);
setMQlogSuccess(mqLog);
producer.shutdown();
} catch (Exception e) {
setMQlogError(mqLog, "9999", "初次:" + e.getMessage());
}
} // 定时任务,失败后重新写消息,每分钟执行一次
@Scheduled(cron = "0 0/1 * * * ?")
@SchedulerLock(name = "RocketMQ", lockAtLeastForString = "PT5M", lockAtMostForString = "PT30M")
public void readAndResendMessage() {
// 读取失败信息
List<MQLog> messageList = mqLogRepository.findByDealCodeNot("0000");
if(CollectionUtils.isEmpty(messageList)){
return;
}
// 重新写消息
for (MQLog message : messageList) {
try {
DefaultMQProducer producer = new DefaultMQProducer(message.getMqGroup());
producer.setNamesrvAddr(namesrvAddr);
producer.setSendMsgTimeout(30000);
producer.start();
Message msg = new Message(message.getMqTopic(), message.getMqMessage().getBytes());
producer.send(msg);
setMQlogSuccess(message);
producer.shutdown();
} catch (Exception e) {
setMQlogError(message, "定时任务:" + e.getMessage());
}
}
} public MQLog regMQlog(JSONObject mqLogJson){
logger.debug("登记 mq 消息......");
String topic = mqLogJson.getString("topic");
String tags = mqLogJson.getString("tags");
String msg = JSON.toJSONString(mqLogJson);
String key = mqLogJson.getString("key");
Boolean approveResult = mqLogJson.getBoolean("approved");
String approver = mqLogJson.getString("approver");
String comment = mqLogJson.getString("comment");
String finshTime = mqLogJson.getString("finshTime"); MQLog.MQLogBuilder mqLogBuilder = MQLog.builder();
mqLogBuilder.mqTopic(topic)
.mqTags(tags)
.key(key)
.mqMessage(msg)
.approveResult(approveResult)
.approver(approver)
.approveComment(comment)
.approveFinishTime(finshTime)
.regDateTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"))); MQLog savedMqLog = mqLogRepository.save(mqLogBuilder.build());
logger.debug("登记 mq 消息完成。");
return savedMqLog;
} public void setMQlogError(MQLog mqLog, String errorCode, String errorMsg){
mqLogRepository.save(mqLog.toBuilder().dealCode(errorCode).dealMsg(errorMsg).build());
} public void setMQlogError(MQLog mqLog, String errorMsg){
setMQlogError(mqLog,"Error",errorMsg);
} public void setMQlogSuccess(MQLog mqLog){
mqLogRepository.save(mqLog.toBuilder().dealCode("0000").dealMsg("success").build());
}
}

3.简化代码

import cn.com.*.support.MQLogSupport;
import cn.com.*.entity.MQLog;
import cn.com.*.repository.MQLogRepository;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import net.javacrumbs.shedlock.core.SchedulerLock;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List; @Component
public class MQLogSupportImpl implements MQLogSupport {
private final Logger logger = LoggerFactory.getLogger(MQLogSupport.class);
@Autowired
private RocketMQTemplate rocketMQTemplate;
@Autowired
private MQLogRepository mqLogRepository; // 写消息服务
public void sendMessageNoTag(MQLog mqLog) {
rocketMQTemplate.asyncSend(mqLog.getMqTopic(), mqLog.getMqMessage(), new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {
setMQlogSuccess(mqLog);
} @Override
public void onException(Throwable e) {
setMQlogError(mqLog, "初次:" + e.getMessage());
retrySendMessage(mqLog);
}
});
} // 重试发送消息
private void retrySendMessage(MQLog mqLog) {
int retryCount = mqLog.getRetryCount();
if (retryCount < 3) { // 最多重试3次
mqLog.setRetryCount(retryCount + 1);
mqLogRepository.save(mqLog);
sendMessageNoTag(mqLog);
} else {
setMQlogError(mqLog, "重试3次仍然失败");
}
} // 定时任务,失败后重新写消息,每分钟执行一次
@Scheduled(cron = "0 0/1 * * * ?")
@SchedulerLock(name = "RocketMQ", lockAtLeastForString = "PT5M", lockAtMostForString = "PT30M")
public void readAndResendMessage() {
// 读取失败信息
List<MQLog> messageList = mqLogRepository.findByDealCodeNot("0000");
if (CollectionUtils.isEmpty(messageList)) {
return;
}
// 重新写消息
for (MQLog message : messageList) {
rocketMQTemplate.asyncSend(message.getMqTopic(), message.getMqMessage(), new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {
setMQlogSuccess(message);
} @Override
public void onException(Throwable e) {
setMQlogError(message, "定时任务:" + e.getMessage());
retrySendMessage(message);
}
});
}
} // 设置消息发送成功
private void setMQlogSuccess(MQLog mqLog) {
mqLog.setDealCode("0000");
mqLog.setDealDesc("发送成功");
mqLogRepository.save(mqLog);
} // 设置消息发送失败
private void setMQlogError(MQLog mqLog, String errorMsg) {
mqLog.setDealCode("9999");
mqLog.setDealDesc(errorMsg);
mqLogRepository.save(mqLog);
}
}

注意:

1) 配置文件

rocketmq:
name-server: IP:端口
producer:
group: "G-Group_REQ"
send-msg-timeout: 30000

2) 根据需要实现:

MQLogSupport、MQLog、MQLogRepository

向mq写消息的更多相关文章

  1. 通过JAVA从MQ读取消息的时候报错及解决

    如果是通过JAVA将消息写入到MQ,再通过JAVA去读取消息,采用MQMessage读消息的方法readUTF()去读取的时候,就不会报错,可以正常读出来.如果采用在MQ资源管理器中插入测试消息或者是 ...

  2. springboot整合mq接收消息队列

    继上篇springboot整合mq发送消息队列 本篇主要在上篇基础上进行activiemq消息队列的接收springboot整合mq发送消息队列 第一步:新建marven项目,配置pom文件 < ...

  3. MQ(队列消息的入门)

    消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成,通过提供消息传递和消息排队模型,它可以在分布式环境下拓展进程间的通信,对于消息中间件,常见的角色大致也 ...

  4. 架构设计:系统间通信(20)——MQ:消息协议(下)

    (接上文<架构设计:系统间通信(19)--MQ:消息协议(上)>) 上篇文章中我们重点讨论了"协议"的重要性.并为各位读者介绍了Stomp协议和XMPP协议. 这两种协 ...

  5. MQ中将消息发送至远程队列的配置

    MQ中将消息发送至远程队列的配置 摘自MQ资源管理器帮助文档V7 在开始学习本教程之前,您需要从系统管理员处了解标识网络上接收机器的名称:IP地址.MQ的端口号.队列管理器.接收(远程机器)或者是发送 ...

  6. 聊聊mq中消息消费的几种方式

    mq系列文章 对mq了解不是很多的,可以看一下下面两篇文章: 聊聊mq的使用场景 聊聊业务系统中投递消息到mq的几种方式 聊聊消息消费的几种方式 如何确保消息至少消费一次 如何保证消息消费的幂等性 本 ...

  7. 【MQ】消息队列及常见MQ比较

    一.什么是消息队列 我们可以把消息队列比作是一个存放消息的容器,当我们需要使用消息的时候可以取出消息供自己使用.消息队列是分布式系统中重要的组件,使用消息队列主要是为了通过异步处理提高系统性能和削峰. ...

  8. 分布式事务解决方案(二)消息系统避免分布式事务 & MQ事务消息 & Sagas 事务模型

    参考文档: 如何用消息系统避免分布式事务:http://blog.jobbole.com/89140/ https://www.cnblogs.com/savorboard/p/distributed ...

  9. MQ解决消息重发--做到幂等性

    一.MQ消息发送 1.发送端MQ-client(消息生产者:Producer)将消息发送给MQ-server: 2.MQ-server将消息落地: 3.MQ-server回ACK给MQ-client( ...

  10. MQ & RPC 消息队列与RPC的区别与使用场景

    MQ:  区别:面向数据.生产者与消费者.有缓冲节点.异步.系统级/模块级通信 选型:RabbitMQ.ActiveMQ/Apollo.ZeroMQ.memcacheQ.Redis.MSMQ.kafk ...

随机推荐

  1. 使用 OpenTelemetry 构建 .NET 应用可观测性(1):什么是可观测性

    目录 什么是系统的可观测性(Observability) 为什么需要软件系统需要可观测性 可观测性的三大支柱 日志(Logging) 指标(Metrics) 分布式追踪(Distributed Tra ...

  2. QEMU tap数据接收流程

    QEMU直接从tap/tun取数据 QEMU tap数据接收步骤: qemu从tun取数据包 qemu将数据包放入virtio硬件网卡. qemu触发中断. 虚拟机收到中断,从virtio读取数据. ...

  3. IDEFICS 简介: 最先进视觉语言模型的开源复现

    引言 Code Llama 是为代码类任务而生的一组最先进的.开放的 Llama 2 模型,我们很高兴能将其集成入 Hugging Face 生态系统!Code Llama 使用与 Llama 2 相 ...

  4. Vue vs React:你需要知道的一切

    Vue 和 React 是创建 JavaScript 网络应用程序最常用的两种工具.但我们该如何在两者之间做出选择呢?在本篇 Vue 与 React 的对比中,我们将尝试找出答案.我们将回顾每种工具的 ...

  5. C中code关键字

    单片机C语言code是什么作用? code的作用是告诉单片机,我定义的数据要存储在ROM(程序存储区)里面,写入后就不能再更改,其实是相当与汇编里面的寻址MOVC(好像是),因为C语言中没办法详细描述 ...

  6. c语言代码练习12

    //计算1/1-1/2+1/3...-1/100的和#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() { in ...

  7. 其它——python操作kafka实践

    文章目录 1.先看最简单的场景,生产者生产消息,消费者接收消息,下面是生产者的简单代码. ------------------------------------------------------- ...

  8. chatgpt与搜索结合,百度会在这股浪潮下掘金吗?

    年末,在百度内部沟通会上,百度创始人李彦宏提到最近他的朋友们问他如何看待ChatGPT,包括他周围同行业中的同一领域和跨境人士. ​事实上,早在ChatGPT将他的对话能力和直观的互动方式展现给全世界 ...

  9. ERROR: <bits/stdc++.h>, 'cstdalign' file not found, running C++17

    Modified 1 year, 1 month ago Viewed 9k times 4 I'm trying to run a piece of code in Visual Studio Co ...

  10. FreeRTOS 操作系统

    FreeRTOS操作系统 01 FreeRTOS 的定义和概述 定义:FreeRTOS(Free-Real-Time Operating System)是一个开源的实时操作系统内核,专门为嵌入式系统设 ...