RocketMq - Springboot2.x整合RocketMQ4.x - 消费消息(八)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值