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. word2010中统一调整表格格式

    word中统一调整表格格式基本思路是: 1.选中所有的表格. 2.再对表格格式调整.    选中所有表格需要用到宏,操作很简单,具体操作如下: (1)工具栏"视图"下右下角&quo ...

  2. Codeforces Round 882 div.2 B

    Smiling & Weeping ----玫瑰花你拿才好看,风景要和你看才浪漫--<-<-<@ B. Hamon Odyssey time limit per test 1 ...

  3. 分布式事务 —— SpringCloud Alibaba Seata

    Seata 简介 传统的单体应用中,业务操作使用同一条连接操作不同的数据表,一旦出现异常就可以整体回滚.随着公司的快速发展.业务需求的变化,单体应用被拆分成微服务应用,原来的单体应用被拆分成多个独立的 ...

  4. 前端三件套系例之BootStrap—— BootStrap组件、BootStrap插件

    文章目录 1 BootStrap组件 1 Glyphicons 字体图标 2 下拉菜单 2.1 基本使用 2.2 对齐 2.3 标题 2.4 分割线 2.5 禁用的菜单项 3 按钮组 3.1 基本使用 ...

  5. RPM软件包:Red HatPackage Manager,RPM

    RPM软件包是按照GPL条款发行在各个linux版本上使用. 用途 可以安装.删除.升级.刷新和管理RPM软件包 通过RPM软件包管理能知道软件包包含哪些文件,也能知道系统中的某个文件属于哪个RPM软 ...

  6. studio

  7. Mysql数据库、表设计规范指南

    结合网上资料与项目实际情况,总结下列MYSQL数据库设计规范. 一.MYSQL数据库设计规范1.数据库命名规范采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线'_'组成,禁止使 ...

  8. Java 魔法值处理的四种方法

    Java 魔法值处理方案 魔法值的定义 方法一 静态常量(不推荐) 方法二 接口中定义 方法三 定义在实体类 方法四 使用枚举类 enum 总结 魔法值的定义 魔法值是Java中突兀出现在代码中的常量 ...

  9. 打造炫酷效果:用Java优雅地制作Excel迷你图

    摘要:本文由葡萄城技术团队原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 迷你图是一种简洁而有效的数据可视化方式,常用于展示趋势和变化.它 ...

  10. 记一次有趣的 buffer overflow detected 问题分析

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 环境说明   无 前言   在我开发的一个实验和学习库中,在很久 ...