Java进阶(7)之mac 安装rocketmq以及与springboot结合使用

安装RocketMQ Server

下载bin压缩包

在 rocketmq官网中下载最新bin压缩文件(当前最新版本是4.7.0)

环境配置

.bash_profile文件中添加环境变量:

export ROCKETMQ_HOME=/yourPath/rocketmq-all-4.7.0-bin-release

启动路由

cdrocketmq-all-4.7.0-bin-release目录下执行命令:

  • 启动路由:
nohup sh bin/mqnamesrv &
  • 查看nameserver日志
tail -f ~/logs/rocketmqlogs/namesrv.log
  • 启动成功有如下日志
INFO main - The Name Server boot success

启动broker

cd到cd到rocketmq-all-4.7.0-bin-release目录下执行命令:

  • 启动(IP和端口可自行更改)
nohup sh bin/mqbroker -n localhost:9876 & 
  • 查看日志
tail -f ~/logs/rocketmqlogs/broker.log
  • 启动成功日志
 boot success

安装RocketMQ可视化工具

  • github官网搜索rocketmq external,克隆到本地
  • 使用idea打开rocketmq-console项目,下载相关依赖
  • application.properties中配置namesrvAddr,这里的ip:portrocketmq server是一一对应的:
rocketmq.config.namesrvAddr=localhost:9876
  • 启动之后可看到如图所示UI
  • Java进阶(7)之mac 安装rocketmq以及与springboot结合使用_第1张图片

SpringBoot配置RocketMQ

添加依赖

<dependency>
    <groupId>org.apache.rocketmqgroupId>
    <artifactId>rocketmq-clientartifactId>
    <version>4.7.0version>
dependency>
<dependency>
    <groupId>org.apache.rocketmqgroupId>
    <artifactId>rocketmq-remotingartifactId>
    <version>4.7.0version>
dependency>
<dependency>
    <groupId>org.apache.rocketmqgroupId>
    <artifactId>rocketmq-commonartifactId>
    <version>4.7.0version>
dependency>

生产者代码

@Slf4j
@Component
public class Producer {
    private String producerGroup = "test_producer";
    private DefaultMQProducer producer;

    public Producer(){
        //示例生产者
        producer = new DefaultMQProducer(producerGroup);
        //不开启vip通道 开通口端口会减2
        producer.setVipChannelEnabled(false);
        //绑定name server
        producer.setNamesrvAddr("localhost:9876");
        start();
    }
    /**
     * 对象在使用之前必须要调用一次,只能初始化一次
     */
    private void start(){
        try {
            this.producer.start();
        } catch (MQClientException e) {
            e.printStackTrace();
        }
    }

    public DefaultMQProducer getProducer(){
        return this.producer;
    }
    /**
     * 一般在应用上下文,使用上下文监听器,进行关闭
     */
    public void shutdown(){
        this.producer.shutdown();
    }
}

消费者代码

@Slf4j
@Component
public class Consumer {

    @Resource
    private RocketMQProperties rocketMQProperties;

    /**
     * 消费者实体对象
     */
    private DefaultMQPushConsumer consumer;
    /**
     * 消费者组
     */
    public static final String CONSUMER_GROUP = "test_consumer";
    /**
     * 通过构造函数 实例化对象
     */
    public Consumer() throws MQClientException {

        consumer = new DefaultMQPushConsumer(CONSUMER_GROUP);
        consumer.setNamesrvAddr("localhost:9876");
        // 订阅PushTopic下Tag为push的消息,都订阅消息
        consumer.subscribe("firstPushTopic", "push");
        // 程序第一次启动从消息队列头获取数据
        consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
        //可以修改每次消费消息的数量,默认设置是每次消费一条
        consumer.setConsumeMessageBatchMaxSize(1);
        // //注册消费的监听 并在此监听中消费信息,并返回消费的状态信息
        consumer.registerMessageListener((MessageListenerConcurrently) (msgs, context) -> {
            // msgs中只收集同一个topic,同一个tag,并且key相同的message
            // 会把不同的消息分别放置到不同的队列中
            try {
                for (Message msg : msgs) {

                    //消费者获取消息 这里只输出 不做后面逻辑处理
                    String body = new String(msg.getBody(), "utf-8");
                    log.info("Consumer-获取消息-主题topic为={}, 消费消息为={}", msg.getTopic(), body);
                }
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
                return ConsumeConcurrentlyStatus.RECONSUME_LATER;
            }
            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
        });

        consumer.start();
        System.out.println("消费者 启动成功=======");
    }
}

测试

public static void main(String[] args) throws MQClientException {

        new Consumer();

        Producer producer = new Producer();
        Message message = new Message();
        message.setTopic("firstPushTopic");
        message.setTags("push");
        message.setBody("hello".getBytes());
        try {
            producer.getProducer().send(message);
        } catch (RemotingException e) {
            e.printStackTrace();
        } catch (MQBrokerException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

注意:其中的topictags必须一一对应!

遇到的问题

github下载很慢

尝试命令行克隆或者下载zip包,或者添加阿里云的镜像

service not available now, maybe disk full, CL: 0.92 CQ: 0.92 INDEX: 0.92

我mac内存全盘250G,然而只剩下10几个G,确实不太够,但为了能继续使用rocketmq server,需要做下配置:

  • rocketmq-all-4.7.0-bin-release/bin下找到runbroker.cmd,添加代码:
set "JAVA_OPT=%JAVA_OPT% -Drocketmq.broker.diskSpaceWarningLevelRatio=0.98"
  • rocketmq-all-4.7.0-bin-release/bin下找到runserver.cmd,将内存改大一些:
set "JAVA_OPT=%JAVA_OPT% -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1024m"

修改配置之后,重启rocketmq的路由和broker,即可解决问题!

你可能感兴趣的:(java进阶)