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. Nomad 系列-Nomad+Traefik+Tailscale 集成实现零信任安全

    系列文章 Nomad 系列文章 Traefik 系列文章 Tailscale 系列文章 概述 终于到了令人启动的环节了:Nomad+Traefik+Tailscale 集成实现零信任安全. 在这里: ...

  2. Linux安装达梦数据库DM8

    1.简介描述 DM8是达梦公司在总结DM系列产品研发与应用经验的基础上,坚持开放创新.简洁实用的理念,推出的新一代自研数据库.DM8吸收借鉴当前先进新技术思想与主流数据库产品的优点,融合了分布式.弹性 ...

  3. Electron包装网站的问题

    原文链接 原文链接 Preface 最近尝试了很多不错的在线工具,只是每次都要进入网站,有点麻烦,于是想到之前了解过的electron,尝试一下打包成本地应用. Contents 1.下载所有源文件 ...

  4. 开源.NetCore通用工具库Xmtool使用连载 - 扩展动态对象篇

    [Github源码] <上一篇> 介绍了Xmtool工具库中的图形验证码类库,今天我们继续为大家介绍其中的扩展动态对象类库. 扩展动态对象是整个工具库中最重要的一个设计.在软件开发过程中, ...

  5. Linux系列教程——Linux文件查找、Linux压缩打包、Linux软件管理

    @ 目录 1 Linux文件查找 1.find查找概述 2.find查找示例 1.find名称查找 2.find大小查找 3.find类型查找 4.find时间查找 5.find用户查找 6.find ...

  6. Nginx-多功能脚本

    #!/bin/bash #2020年2月16日 #auto_install_nginx_web.v3 #by fly ################################ #NGX_VER ...

  7. 一个Unity富文本插件的实现思路

    项目中原来的富文本组件不太好用,做了一些修改,记述主要思路.缺陷很多. 仅适用于没用TextMeshPro,且不打算用的项目,否则请直接用TextMeshPro 原组件特点: 使用占位符模式,创建新的 ...

  8. 程序是如何在计算机上被执行的?(下篇:cpu工作原理)

    本文接上文程序是如何在计算机上被执行的?(上篇:软件部分),主要内容是机器语言如何在计算机硬件上运行,关于逻辑门,加法器,布尔运算,亦即,cpu的工作原理. 1.逻辑门 以下图片是<三体> ...

  9. DO、DTO、BO、AO、VO、POJO定义和转换的正确姿势

    一.引言DO.DTO.BO.AO.VO.POJO的概念看似简单,但是想区分好或者理解好也不容易,本文简单梳理一下. 通过各层POJO的使用,有助于提高代码的可读性和可维护性. ------------ ...

  10. [Python急救站课程]同切圆的绘制

    绘制同切圆 import turtle # 引用turtle 库 turtle.pensize(2) # 设置画笔宽度为2 像素 turtle.circle(10) # 绘制半径为10 像素的圆 tu ...