三分钟学会spring boot整合rocketmq

RocketMQ部署

1.下载

1.1地址:http://rocketmq.apache.org/release_notes/release-notes-4.2.0/

1.2选择‘Binary’进行下载

1.3解压已下载工程

三分钟学会spring boot整合rocketmq_第1张图片

 


配置

 

2.1 系统环境变量配置

变量名:ROCKETMQ_HOME
变量值:MQ解压路径\MQ文件夹名

三分钟学会spring boot整合rocketmq_第2张图片

 

重启服务器

  1. 启动

3.1 启动NAMESERVER

Cmd命令框执行进入至‘MQ文件夹\bin’下,然后执行‘start mqnamesrv.cmd’,启动NAMESERVER。成功后会弹出提示框,此框勿关闭。

三分钟学会spring boot整合rocketmq_第3张图片

 


3.2 启动BROKER

 

Cmd命令框执行进入至‘MQ文件夹\bin’下,然后执行‘start mqbroker.cmd -n 127.0.0.1:9876 autoCreateTopicEnable=true’,启动BROKER。成功后会弹出提示框,此框勿关闭。

三分钟学会spring boot整合rocketmq_第4张图片

 


假如弹出提示框提示‘错误: 找不到或无法加载主类 xxxxxx’。打开runbroker.cmd,然后将‘%CLASSPATH%’加上英文双引号。保存并重新执行start语句。
三分钟学会spring boot整合rocketmq_第5张图片

 

看一下整体项目结构,主要实现的部分是红色标注的

 


看一下pom.xml的文件内容

 



    
        spring_boot
        com.suning.springboot
        1.0-SNAPSHOT
    
    4.0.0

    spring_boot_rocketmq
    

    


        
        
            org.projectlombok
            lombok
            provided
        


        
            org.apache.rocketmq
            rocketmq-client
            4.1.0-incubating
        

    


在这里为了简化javabean的操作,引入了lombok组件.定义一个javabean用来承载消息

package com.springboot.rocketmq.content;

import lombok.*;
import lombok.experimental.Accessors;

/**
* @Author 18011618
* @Date 19:28 2018/7/17
* @Function 发送消息体
*/
@ToString
@AllArgsConstructor
@EqualsAndHashCode
@Accessors(chain = true)
@Getter
@Setter
public class UserContent {
    private String username;
    private String pwd;

}

定义生产者:

@Component
public class UserProducer {
    /**
     * 生产者的组名
     */
    @Value("${suning.rocketmq.producerGroup}")
    private String producerGroup;

    /**
     * NameServer 地址
     */
    @Value("${suning.rocketmq.namesrvaddr}")
    private String namesrvAddr;

    @PostConstruct
    public void produder() {
         DefaultMQProducer producer = new DefaultMQProducer(producerGroup);
         producer.setNamesrvAddr(namesrvAddr);
        try {
            producer.start();
            for (int i = 0; i < 100; i++) {
                UserContent userContent = new UserContent(String.valueOf(i),"abc"+i);
                String jsonstr = JSON.toJSONString(userContent);
                System.out.println("发送消息:"+jsonstr);
                Message message = new Message("user-topic", "user-tag", jsonstr.getBytes(RemotingHelper.DEFAULT_CHARSET));
                SendResult result = producer.send(message);
                System.err.println("发送响应:MsgId:" + result.getMsgId() + ",发送状态:" + result.getSendStatus());
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            producer.shutdown();
        }
    }
}

这里使用了两个新注解:

@PostConstruct:它的作用是相当于servlet的Init功能,在对象的构造器执行完了,就会立马调用该方法
@Value:注入classpath下面的配置文件中的值到变量中

定义消费者:

@Component
public class UserConsumer {
    /**
     * 消费者的组名
     */
    @Value("${suning.rocketmq.conumerGroup}")
    private String consumerGroup;

    /**
     * NameServer 地址
     */
    @Value("${suning.rocketmq.namesrvaddr}")
    private String namesrvAddr;

    @PostConstruct
    public void consumer() {
        System.err.println("init defaultMQPushConsumer");
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(consumerGroup);
        consumer.setNamesrvAddr(namesrvAddr);
        try {
            consumer.subscribe("user-topic", "user-tag");
            consumer.registerMessageListener((MessageListenerConcurrently) (list, context) -> {
                try {
                    for (MessageExt messageExt : list) {

                        System.err.println("消费消息: " + new String(messageExt.getBody()));//输出消息内容
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    return ConsumeConcurrentlyStatus.RECONSUME_LATER; //稍后再试
                }
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; //消费成功
            });
            consumer.start();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

最后再看一下配置文件:

server.port=8080

# 生产者的组名
suning.rocketmq.producerGroup=user-group
# 消费者的组名
suning.rocketmq.conumerGroup=user-group
# NameServer地址
suning.rocketmq.namesrvaddr=localhost:9876

写一个启动类

@SpringBootApplication
public class RocketmqApplication {
    public static void main(String[] args) {
        SpringApplication.run(RocketmqApplication.class,args);
    }
}

这个时候直接启动该应用就能看到消息的发送和消费的情况:

 

 

 

喜欢本文的朋友们,欢迎关注微信公众号“Java面试达人”,收看更多精彩内容

 

你可能感兴趣的:(三分钟学会spring boot整合rocketmq)