RocketMq的简单案例,帮助理解RocketMq~

案例

1 环境:idea+maven
2 前提 :确保你的RocketMq软件安装并运行成功,安装过程请戳这:https://blog.csdn.net/duduyingya/article/details/105706391
3 流程:生产者发送消息,消费者进行消费
4 开始
4-1:配置文件:pom.xml 中依赖如下

	   <dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-client</artifactId>
            <version>4.4.0</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba.rocketmq</groupId>
            <artifactId>rocketmq-common</artifactId>
            <version>3.5.4</version>
        </dependency>

        <!-- 这个包不是必需品,是用来在控制台输出查看消息转换格式的 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.58</version>
        </dependency>

4-2:创建一个生产者class

package com.pro;

import com.alibaba.fastjson.JSON;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;


/**
 * 生产者
 */
public class producer0415 {
  //声明消息主题名称
  private static final String TOPICNAME="tx-mq-TOPIC";

	public static void main(String[] args) {
	
		//1.创建一个生产者,需要指定Producer的分组,
		DefaultMQProducer defaultMQProducer = new DefaultMQProducer("MY-meme");
		//2.设置命名服务的地址,和配置文件中的 rocketmq.namesrv.addr一致
		defaultMQProducer.setNamesrvAddr("localhost:9876");
		try{
			//3.启动生产者
			defaultMQProducer.start();
			for(int i=0;i<10;i++) {
				String text = "加油吖,MAYINGMEMEDA----"+i;
				//4. topic+标签+具体信息,消费者会消费指定的标签
				Message msg = new Message(TOPICNAME, "Tag-B", text.getBytes());
				//5.开始发送,并在下面测试输出
				SendResult sendResult = defaultMQProducer.send(msg);
				System.out.println("###发送结果 result:" + JSON.toJSONString(sendResult));
			}

		}catch (Exception e){
			e.printStackTrace();
		}finally {
			//6.关闭生产者
			defaultMQProducer.shutdown();
		}
	}
}

4-3:创建一个消费者class

package com.consu;

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.MessageExt;
import java.util.Date;
import java.util.List;

/**
 * 消费者
 */
public class Consumer0415 {
	//声明消息主题名称
	private static final String TOPICNAME="tx-mq-TOPIC";

	public static void main(String[] args) {
		//创建消费者属于哪个消费者组,一个组里可以有多个消费者
		DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("Consumer-g");
		//设置Name server地址
		consumer.setNamesrvAddr("localhost:9876");
		//设置消费者从第一个偏移量开始消费,消息的偏移量相当于数组的下标,也是从0开始
		consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
		try {
			//第二个参数表示消费匹配的tag,与生产者发送的消费标签一致,* 表示topic所有的tag
			consumer.subscribe(TOPICNAME,"Tag-B");

			//2. 注册消费者监听
			consumer.registerMessageListener(new MessageListenerConcurrently() {
				/**
				 * @param msgs msgs 表示消息体
				 * @param context
				 * @return 如果成功,返回一个成功状态码
				 */
				public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
					for(MessageExt messageExt:msgs){
						try {
							System.out.println(new Date()+new String(messageExt.getBody(),"UTF-8"));
						}catch (Exception e){
							e.printStackTrace();
						}
					}
					return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
				}
			});
			//3.consumer 启动
			consumer.start();
			System.out.println(".........消费端.........");
		} catch (MQClientException e) {
			e.printStackTrace();
		}
	}
}

4-4:依次启动生产者和消费者:会发现~出错了。。。。
控制台报错:org.apache.rocketmq.client.exception.MQClientException: No route info of this topic, TopicTest 这是为什么呢?

原因1:Broker没有正确连接到Name Server

查看是否正确连接到 Name Server 命令: 打开cmd框框:进入到 RocketMq(不是插件,是RocketMq软件) 的 bin 文件夹下: 输入 mqadmin clusterList -n localhost:9876,有的版本很可能输入 sh mqadmin clusterList -n localhost:9876,无论输入哪个,出现下面这个窗口,并且信息都有,证明已经连接到了:如果没有出现以下信息,那么检查插件下的application.properties中是否设置了Name server

在这里插入图片描述

原因二:用户没有通过手工方式创建Topic

打开cmd框框:进入到 RocketMq(不是插件,是RocketMq软件) 的 bin 文件夹下,输入mqadmin updateTopic -n localhost:9876 -b localhost:10911 -t tx-mq-TOPIC 即可创建主题名字为 tx-mq-TOPIC 的主题。

在这里插入图片描述
出现success代表创建成功,这时候你在运行程序,就好用了~

原因三:Producer没有正确连接到Name Server

是因为你的防火墙没有关
进入到cmd框框中:输入netsh advfirewall set allprofiles state off 关闭防火墙就可以了~

5 启动效果:

生产者

在这里插入图片描述

消费者

在这里插入图片描述

大神链接:

https://blog.csdn.net/jiangyu1013/article/details/81478754
https://www.cnblogs.com/eyesfree/p/10032470.html
https://www.cnblogs.com/coder-zyc/p/12115317.html
https://blog.csdn.net/zixiao217/article/details/89844003

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值