说明:
本例为单节点案例演示
并总结出常见错误和解决方案
step1: 引入依赖包
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.6.1</version>
</dependency>
step2: 创建JmsConfig
package com.cn.java.base.jms;
public class JmsConfig {
public static final String NAME_SERVER = "192.168.128.35:9876";
public static final String TOPIC = "xd_class_pay_test_topic";
}
step2: 创建生产者类 PayProducer
package com.cn.java.base.jms;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class PayProducer {
private String producerGroup = "pay_producer_group";
//指定NameServer地址,多个地址以 ; 隔开
//如 producer.setNamesrvAddr("192.168.100.141:9876;192.168.100.142:9876;192.168.100.149:9876");
//此ip和端口写自己mq部署的即可
private String NAME_SERVER = JmsConfig.NAME_SERVER;
//生产者对象
private DefaultMQProducer producer;
/**
* 初始化mq
*/
public PayProducer(){
producer = new DefaultMQProducer(producerGroup);
producer.setNamesrvAddr(NAME_SERVER);
start();
}
public DefaultMQProducer getProducer(){
return this.producer;
}
/**
* 对象在使用之前必须要调用一次,只能初始化一次
*/
public void start(){
try {
this.producer.start();
} catch (MQClientException e) {
log.info(e.getErrorMessage());
}
}
/**
* 一般在应用上下文,使用上下文监听器,进行关闭
*/
public void shutdown(){
this.producer.shutdown();
}
}
step3: controller业务方调用
@Autowired
private PayProducer payProducer;
@RequestMapping("/api/v1/pay_cb")
public Object callback(@RequestParam("text") String text) throws InterruptedException, RemotingException, MQClientException, MQBrokerException {
Map<String,String> params = new HashMap<>();
params.put("userName","zhangsan");
params.put("userId","88888888");
params.put("text",text);
Message message = new Message(JmsConfig.TOPIC,"tags_1","pay-v1", JSON.toJSONString(params).getBytes());
SendResult sendResult = payProducer.getProducer().send(message);
log.info("result = {}", JSON.toJSONString(sendResult));
return sendResult;
}
- Message 对象
topic:主题名称
tag:标签,用于过滤
key:消息唯一标示,可以是业务字段组合
body:消息体,字节数组
响应结果:
可在mq控制台查看生产者消息
mq安装及控制台:https://blog.csdn.net/nameIsHG/article/details/107305262
注意
• 发送消息到Broker,需要判断是否有此topic启动broker的时候,本地环境建议开启自动创建topic,生产环境建议关闭自动化 创建topic建议先手工创建Topic,如果靠程序自动创建,然后再投递消息,会出现延迟情况
• 概念模型: 一个topic下面对应多个queue,可以在创建Topic时指定,如订单类topic
• 通过可视化管理后台查看消息
常见错误一
org.apache.rocketmq.remoting.exception.RemotingTooMuchRequestException: sendDefaultImpl call timeout
原因:阿里云存在多网卡,rocketmq都会根据当前网卡选择一个IP使用,当你的机器有多块网卡时,很 有可能会有问题。比如,我遇到的问题是我机器上有两个IP,—个公网IP,-个私网IP,因此需要配置 broker.conf指定当前的公网ip,然后重新启动broker
新增配置:conf/broker.conf (属性名称brokerIP1=broker所在的公网ip地址)
新增这个配置:brokerIP1 = 120・76・62・13
启动命令:nohup sh bin/mqbroker -n localhost:9876 -c ./conf/broker.conf &
常见错误二
MQClientException: No route info of this topic, TopicTest1
原因:Broker禁止自动创建Topic,且用户没有通过手工方式创建 此Topic,或者broker和 Nameserver网络不通
解决:
通过sh bin/mqbroker -m 查看配置
autoCreateTopicEnable=true 贝U自动创建 topic
Centos7 关闭防火墙 systemctl stop firewalld
常见错误三
控制台查看不了数据,提示连接10909错误
原因:Rocket默认开启了VIP通道,VIP通道端口为10911-2 = 10909
解决:阿里云安全组需要增加一个端口 10909
其他错误:
https://blog.csdn.net/qq_14853889/article/details/81053145
https://blog.csdn.net/wangmx1993328/article/details/81588217#%E5%BC%82%E5%B8 %B8%E8%AF%B4%E6%98%8E
https://www.jianshu.com/p/bfd6d849f156 https://blog.csdn.net/wangmx1993328/article/details/81588217