1: RocketMq实战 (生产者与消费者)(文末有项目连接)

1:servername producer consumer group topic 简单说明
servername 也就是服务器地址:localhost:9876
producer 生产者 在JAVA代码创建
consumer 消费者 在JAVA代码创建
group (仅用于方便分组管理)
    1:producer_group  在JAVA代码创建   producer存放在这里
    2:comsumer_group  在JAVA代码创建   consumer存放在这里
    
topic:主题 最好在管理界面中创建 (也可以Java代码自动创建)
producer     生产的消息发到这里
consumer    消费这里面的消息
2:RocketMq的Maven包
//注意和服务端的版本号一致

    org.apache.rocketmq
    rocketmq-client
    4.3.0

3:RocketMq的producer 说明与核心代码
//消息体
public class RocketEvent {
    /**
     * 事件
     */
    private String event;
    /**
     * 信息
     */
    private T data;
    /**
     * 二级主题
     */
    private String tag;

    public RocketEvent(String event, T data,String tag) {
        this.event = event;
        this.data = data;
        this.tag = tag;
    }

    public RocketEvent(String event, T data) {
        this.event = event;
        this.data = data;
    }
}
@Slf4j
@Configuration
public class RocketMqConfiguration {
     //注意 defaultMQProducer可以在配置类里面获取配置文件参数

    @Value("${rocketmq.name-srv-addr}")
    //localhost:9876
    private String nameSrvAddr;
    @Value("${rocketmq.producer-group}")
    //"pay_test_topic"
    private String producerGroup;

    /**
     * @return 返回普通消息发送者实例
     * @throws MQClientException MQ客户端异常
     */
    @Bean
    public DefaultMQProducer defaultProducer() throws MQClientException {
        log.info("初始化RocketMQ");  
        DefaultMQProducer defaultMQProducer = new DefaultMQProducer();
        
        //该生产者所在group
        groupdefaultMQProducer.setProducerGroup(producerGroup);
        //如果是 namesrvAddr形成集群模式 以 ; 分开   "IP1:9876;IP2:9876;"
        defaultMQProducer.setNamesrvAddr(nameSrvAddr);
        //是否走Vip通道
        defaultMQProducer.setVipChannelEnabled(false);
         //消息同步发送失败重试次数
        defaultMQProducer.setRetryTimesWhenSendFailed(3);
        //消息异步发送失败重试次数
        defaultMQProducer.setRetryTimesWhenSendAsyncFailed(3);
        
//        消息超过默认字节4096后进行压缩
//        defaultMQProducer.setCompressMsgBodyOverHowmuch(4096);
//        最大消息配置,默认128k
//        defaultMQProducer.setMaxMessageSize(12);
//        自动创建服务器不存在的Topic,默认创建的队列数
//        defaultMQProducer.setDefaultTopicQueueNums(4);
        
        //开启线程
        defaultMQProducer.start();
        return defaultMQProducer;
    }
}

    private DefaultMQProducer defaultMQProducer;
    //设置消息  发送到哪个topic中  内容以二进制的方式发送
    message = new Message(topic, JSON.toJSONString(rocketEvent).getBytes());
    //tog为topic下的二级分类
    //message = new Message(topic,rocketEvent.getTag(), JSON.toJSONString(rocketEvent).getBytes());
    
    //发送消息
    SendResult sendResult = defaultMQProducer.send(message);

    //开启生产者
    defaultMQProducer.start();
4:RocketMq的comsumer 说明与核心代码
    //特别注意  因为需要使用@Component注解
    //因此在项目启动时 就会执行
    //所以没有办法通过配置文件直接获取配置参数(待确认)
    
@Slf4j
@Component
public class RocketMqConsumerListener {

    private String pay_consumer_group = "pay_consumer_group";

    private String nameSrvAddr = "47.113.101.241:9876";

    private String topic = "pay_test_topic";


    public RocketMqConsumerListener() throws MQClientException {

        //创建DefaultMQPushConsumer 
        DefaultMQPushConsumer  defaultMQPushConsumer = creatDefaultMQPushConsumer();

        //监听器
        defaultMQPushConsumer.registerMessageListener((MessageListenerConcurrently) (messages, context) -> {
            
                Message msg = messages.get(0);
           try {    
                log.info(" Receive New Messages: {},{} ",Thread.currentThread().getName(), new String(messages.get(0).getBody()));
                String topic = msg.getTopic();
                String tags = msg.getTags();
                String keys = msg.getKeys();
                String body = new String(msg.getBody(), "utf-8");
                log.info("topic=" + topic + ", tags=" + tags + ", keys = " + keys + ", msg = " + body);
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            } catch (UnsupportedEncodingException e) {
                log.info("rocket消费者异常:{}",e.getMessage(),e);
                return ConsumeConcurrentlyStatus.RECONSUME_LATER;
            }
        });
        log.info("consumer  start");
        defaultMQPushConsumer.start();
    }

    /**
     * 配置DefaultMQPushConsumer参数
     * @throws MQClientException
     */
    private DefaultMQPushConsumer creatDefaultMQPushConsumer() throws MQClientException {
        DefaultMQPushConsumer  defaultMQPushConsumer = new DefaultMQPushConsumer();
        //如果是 namesrvAddr形成集群模式 以 ; 分开   "IP1:9876;IP2:9876;"
        defaultMQPushConsumer.setNamesrvAddr(nameSrvAddr);
        //设置消费者存放的组
        defaultMQPushConsumer.setConsumerGroup(pay_consumer_group);
        //订阅的主题 topic
        defaultMQPushConsumer.subscribe(topic, "*");

//        消费者消费模式
//        defaultMQPushConsumer.setMessageModel(CLUSTERING);
//        offsetStore:消息消费进度存储器 (现在已经不允许设置)
//        defaultMQPushConsumer.setOffsetStore(RemoteBrokerOffsetStore);
//
//        队列初次创建时候 从哪里开始消费
//        defaultMQPushConsumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
//        
//        负载均衡策略算法  消费者分配队列的算法  默认就是AllocateMessageQueueAveragely 即取模平均分配
//        defaultMQPushConsumer.setAllocateMessageQueueStrategy(new AllocateMessageQueueAveragely());
//       
//        最小消费线程池数量
//        defaultMQPushConsumer.setConsumeThreadMin(20);
//        最大消费线程池数量
//        defaultMQPushConsumer.setConsumeThreadMax(20);
//       
//       一次性拉取数据的数量
//        defaultMQPushConsumer.setPullBatchSize(32);

        return defaultMQPushConsumer;
    }
}


5:连接RocketMq遇上的问题
1:MQClientException: No route info of this topic:
    
    解决方法1:
    broker.conf文件 (设置为自动创建topic)
    autoCreateTopicEnable=true 
    注意  服务端和客户端的RocketMq版本号要一致 (否则无效)

    解决方法2:
    在Console控制台上创建一个topic
    
2:控制台查看不了数据 提示连接10909错误
    Rocket的broker默认开启VIP通道
    阿里云安全组开启该端口

项目连接

请配合项目代码食用效果更佳:
项目地址:
https://github.com/hesuijin/hesuijin-study-project
Git下载地址:
https://github.com.cnpmjs.org/hesuijin/hesuijin-study-project.git

rocketmq-module项目模块下  

你可能感兴趣的:(1: RocketMq实战 (生产者与消费者)(文末有项目连接))