【MQ】Eclipse向RocketMQ中发送和接收消息

一、前言

      在前几篇博客中简单的向大家介绍了一下搭建RocketMQ的环境,搭建的过程也是由套路可寻的。既然是mq,就避免不了消息的发送和接收。所以在这篇博客中小编就向大家介绍一下mq的发送和接收。

二、关于RocketMQ的一些术语

      小编认为,只要是接触过MQ的朋友,基本不会对下面的术语陌生,其中,

  • Producer
          消息生产者,负责产生消息,一般由业务系统负责产生消息。

  • Consumer
          消息消费者,负责消费消息,一般是后台系统负责异步消费。

  • Push Consumer
          Consumer 的一种,应用通常向 Consumer 对象注册一个 Listener 接口,一旦收到消息,Consumer 对象立刻回调 Listener 接口方法。

  • Pull Consumer
          Consumer 的一种,应用通常主劢调用 Consumer 的拉消息方法从 Broker 拉消息,主动权由应用控制。

  • Producer Group
          一类 Producer 的集合名称,返类 Producer 通常収送一类消息,且发送逻辑一致。

  • Consumer Group
          一类 Consumer 的集合名称,返类 Consumer 通常消费一类消息,且消费逻辑一致。

  • Broker
          消息中转角色,负责存储消息,转发消息,一般也称为 Server。在 JMS 规范中称为 Provider。

三 、RocketMQ的Message数据结构

这里写图片描述

      这张图片是来自官方文档。

      在message中可以包含上面的几个属性,可以通过get、set的方式进行赋值:

msg.getTopic();
msg.setTopic("Ares");

四、操作

      当我们有了已经可以正常运行的RocketMQ服务器后,我们就可以开始建立自己的项目,进行数据的操作了。

4.1 建立Maven项目

这里写图片描述

      在pom.xml文件中添加依赖:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>groupId</groupId>
  <artifactId>RocketMQ</artifactId>
  <version>0.0.1-SNAPSHOT</version>

  <dependencies>
        <dependency>
            <groupId>com.alibaba.rocketmq</groupId>
            <artifactId>rocketmq-client</artifactId>
            <version>3.0.10</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.rocketmq</groupId>
            <artifactId>rocketmq-all</artifactId>
            <version>3.0.10</version>
            <type>pom</type>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.1.1</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.1.1</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

4.2 Producer

      建立Producer类,主要是负责发送消息:

public class Producer {

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

        DefaultMQProducer producer = new DefaultMQProducer("producerGroupName2");
        producer.setNamesrvAddr("192.168.137.4:9876");
        producer.start();
        try {
            {
                //实例化一个消息
                Message msg = new Message("testTopic","tagA","keyA",("Hello World tagA!").getBytes("UTF-8"));
                for(int i=50;i>0;i--){
                    if(i%2==0){
                        SendResult sendResult = producer.send(msg);
                        Thread.sleep(1000);
                        System.out.println("tagA send result:"+sendResult);
                    }else{
                        msg = new Message("testTopic","tagB","keyB",("Hello World tagB!").getBytes("UTF-8"));
                        SendResult sendResult = producer.send(msg);
                        Thread.sleep(1000);
                        System.out.println("tagB send result:"+sendResult);
                    }
                }
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }

        Runtime.getRuntime().addShutdownHook(new Thread(() -> producer.shutdown()));
        System.exit(0);
    }
}

注:
      在这里我们通过“Message msg = new Message(“testTopic”,”tagA”,”keyA”,(“Hello World tagA!”).getBytes(“UTF-8”));”来实例化一个message,这个这里面的参数就如在第三点中介绍的那样。

4.3 consumer

      建立Consumer类,主要负责发送消息:

public class Consumer {

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

        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(
                "producerGroupName2");
        consumer.setNamesrvAddr("192.168.137.5:9876");

        consumer.subscribe("testTopic", "tagA || tagB");
        consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
        consumer.registerMessageListener(new MessageListenerConcurrently() {

            public ConsumeConcurrentlyStatus consumeMessage(
                    List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
                System.out.println(Thread.currentThread().getName()
                        + " Receive New Messages: " + msgs);
                MessageExt msg = msgs.get(0);
                if (msg.getTopic().equals("testTopic")) {
                    if (msg.getTags() != null && msg.getTags().equals("tagA")) {
                        // 获取消息体
                        String message = new String(msg.getBody());
                        System.out.println("receive tagA message:" + message);
                    } else if (msg.getTags() != null
                            && msg.getTags().equals("tagB")) {
                        // 获取消息体
                        String message = new String(msg.getBody());
                        System.out.println("receive tagB message:" + message);
                    }

                }
                // 成功
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });
        consumer.start();
        System.out.println("Consumer Started.");
    }

}

4.4 附加

      发送的消息都要序列化为二进制的消息体,可以通过gson完成这个操作。而且消息体可以为对象,也可以为集合,也可以为字符串,很多类型都可以使用。都可以解析。

msgBody = gson.toJson(msg).getBytes("UTF-8");

五、小结

      通过这次的学习,小编亲手把各种类型的消息体都发送到了mq,然后在获取都可以正常解析,所以可以看出mq的效率还是很高的,操作性也很不错,所以大家可以尽情使用。最重要的是,他的承载数量很大,可以持久化上亿条数据。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 61
    评论
评论 61
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你个佬六

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值