step1: 自动创建topic
autoCreateTopicEnable : 是否自动创建topic
true = 自动创建
false=手工创建(正式环境一般由应用管理员手工创建)
autoCreateTopicEnable=true无效原因:客户端版本和服务端版本不一致
客户端版本要和服务端版本保持一致
服务端安装版本
客户端版本
step2: 创建消费者
2.1 )引入依赖
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.6.1</version>
</dependency>
2.2 )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";
}
2.3 )创建PayConsumer消费者
package com.cn.java.base.jms;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageExt;
import org.springframework.stereotype.Component;
import java.io.UnsupportedEncodingException;
import java.util.List;
/**
* @author
* @desc 1.0 消费者订阅模式
* @date 2020/7/25 22:00
*/
@Slf4j
@Component
public class PayConsumer {
private DefaultMQPushConsumer consumer;
private String consumerGroup = "pay_consumer_group";
public PayConsumer() throws MQClientException {
/** 创建消费者 */
consumer = new DefaultMQPushConsumer(consumerGroup);
/** 连接 NAME_SERVER */
consumer.setNamesrvAddr(JmsConfig.NAME_SERVER);
/** 设置消费策略(可设置可不设置)
* 不设置:默认值为 CONSUME_FROM_LAST_OFFSET (从最后一个开始消费)
*
* */
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET);
/** 订阅主题 (*)监听哪些标签*/
consumer.subscribe(JmsConfig.TOPIC, "*");
/**
* 传统写法
* 注册消息监听器,有新的消息产生,该函数立马执行
*/
consumer.registerMessageListener(new MessageListenerConcurrently() {
/** 消费消息 */
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
try {
/** 取第一个,一条一条消费 */
Message msg = msgs.get(0);
System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), new String(msgs.get(0).getBody()));
String topic = msg.getTopic();
String body = new String(msg.getBody(), "utf-8");
String tags = msg.getTags();
String keys = msg.getKeys();
log.info("topic={},tags={},keys={},msg={}", topic, tags, keys, body);
/**
* 标记消费成功
* 返回CONSUME_SUCCESS告诉borker消费成功
* 消费成功后borker会删除该消息
* */
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
} catch (UnsupportedEncodingException e) {
/**
* 如果异常
* 消息不会被标记为成功
*
* 消费不成功解决方案
* 1.使用消息重试策略
* 比如消费3次还是失败,就把该消息记录到mysql,人工去审核,查看消费失败原因
* */
e.printStackTrace();
return ConsumeConcurrentlyStatus.RECONSUME_LATER;
}
}
});
consumer.start();
System.out.println("consumer start ...");
/** lambda表达式写法 */
// consumer.registerMessageListener((MessageListenerConcurrently) (msgs, context) -> {
// try {
// Message msg = msgs.get(0);
// System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), new String(msgs.get(0).getBody()));
// String topic = msg.getTopic();
// String body = new String(msg.getBody(), "utf-8");
// String tags = msg.getTags();
// String keys = msg.getKeys();
// System.out.println("topic=" + topic + ", tags=" + tags + ", keys=" + keys + ", msg=" + body);
// return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
// } catch (UnsupportedEncodingException e) {
// e.printStackTrace();
// return ConsumeConcurrentlyStatus.RECONSUME_LATER;
// }
// });
}
}
2.4 )使用生产者生产消息
2.5 )消费者 :消费日志
常见问题
1、 Caused by:
org.apache.rocketmq.remoting.exception.RemotingConnectException: connect to <172.17.42.1:10911> failed
2、 com.alibaba.rocketmq.client.exception.MQClientException: Send [1] times, still failed, cost [1647]ms, Topic: TopicTest1, BrokersSent: [broker-a, null, null]
3、 org.apache.rocketmq.client.exception.MQClientException: Send [3] times,
still failed, cost [497]ms, Topic: TopicTest, BrokersSent: [Book- Air.local, MacBook-Air.local, MacBook-Air.local]
解决:多网卡问题处理
1、 设置 producer: producer.setVipChannelEnabled(false);
2、 编辑ROCKETMQ配置文件:broker .conf (下列ip为自己的ip)
namesrvAddr = 192.168.0.101:9876 brokerIP1 = 192.168.0.101
4、 DESC: service not available now, maybe disk full, CL:
解决:修改启动脚本runbroker.sh,在里面增加一句话即可:
JAVA_OPT="${JAVA_OPT} -
Drocketmq.broker.diskSpaceWarningLevelRatio=0.98"
(磁盘保护的百分比设置成98%,只有磁盘空间使用率达到98%时才拒绝接收producer消 息)
常见问题处理
https://blog.csdn.net/sqzhao/article/details/54834761 https://blog.csdn.net/mayifan0/article/details/67633729 https://blog.csdn.net/a906423355/article/details/78192828