1.  添加依赖

  pom.xml如下:

 <dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.3.1</version>
</dependency>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-srvutil</artifactId>
<version>4.3.1</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.23.1-GA</version>
</dependency>
<dependency>
<groupId>io.openmessaging</groupId>
<artifactId>openmessaging-api</artifactId>
<version>0.3.0-alpha</version>
</dependency>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-openmessaging</artifactId>
<version>4.3.1</version>
</dependency>

2. Producer 的开发步骤

  1. 实例化Producer Group,如下:

  DefaultMQProducer producer = new DefaultMQProducer("my-producer-group");

  2. 设置namesrvAddr,集群环境多个nameserver用;分割,如下:

producer.setNamesrvAddr("47.105.145.123:9876;47.105.149.61:9876");

  3. 调用start()方法启动:

 producer.start();

  4. 发送消息

 for (int i = 0; i < 10; i++) {
//构建实例,第一个参数为topic,第二个参数为tabs,第三个参数为消息体
Message message = new Message("MyQuickStartTopic","tabA",("Hello World:" + i).getBytes(RemotingHelper.DEFAULT_CHARSET));
SendResult result = producer.send(message);
System.out.println(result);
}

  5. 关闭生产者(根据自己需求确定是够需要关闭)

 producer.shutdown();

  完整示例如下:

package com.wangx.rocketmq.quickstart;

import org.apache.rocketmq.client.exception.MQBrokerException;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.common.RemotingHelper;
import org.apache.rocketmq.remoting.exception.RemotingException; import java.io.UnsupportedEncodingException; /**
* 创建一个消费者
*/
public class Producer { public static void main(String[] args) throws MQClientException, RemotingException, InterruptedException, MQBrokerException, UnsupportedEncodingException {
//1. 实例化一个producer group
DefaultMQProducer producer = new DefaultMQProducer("my-producer-group"); //2. 设置namesrvAddr,集群环境多个nameserver用;分割 producer.setNamesrvAddr("47.105.145.123:9876;47.105.149.61:9876");
//3. 启动
producer.start();
// 4. 发送消息
for (int i = 0; i < 10; i++) {
//构建实例,第一个参数为topic,第二个参数为tabs,第三个参数为消息体
Message message = new Message("MyQuickStartTopic","tabA",("Hello World:" + i).getBytes(RemotingHelper.DEFAULT_CHARSET));
SendResult result = producer.send(message);
System.out.println(result);
}
//关闭生产者
producer.shutdown(); }
}

  使用方式可以说非常简单了。

3. Consumer开发步骤

  1. 实例化Consumer Group,如下:

DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("my-consumer-group");

  2. 设置namesrvAddr,集群环境多个nameserver用;分割,如下:

producer.setNamesrvAddr("47.105.145.123:9876;47.105.149.61:9876");

  3. 设置从什么位置开始都

consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET);

  4. 订阅topic.

consumer.subscribe("MyQuickStartTopic", "*");

  5. 注册消息监听器

 consumer.registerMessageListener();

  6. 重写MessageListenerConcurrently接口的consumeMessage()方法

  完整代码如下:

package com.wangx.rocketmq.quickstart;

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.List; /**
* 创建一个消费者
*/
public class Consumer {
public static void main(String[] args) throws MQClientException {
//实例化一个consumer组
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("my-consumer-group");
//设置setNamesrvAddr,同生产者
consumer.setNamesrvAddr("47.105.145.123:9876;47.105.149.61:9876"); //设置消息读取方式,这里设置的是队尾开始读取
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET); //设置订阅主题,第二个参数为过滤tabs的条件,可以写为tabA|tabB过滤Tab,*表示接受所有
consumer.subscribe("MyQuickStartTopic", "*"); //注册消息监听
consumer.registerMessageListener(new MessageListenerConcurrently() {
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> list, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
try {
//的到MessageExt
MessageExt messageExt = list.get(0);
String topic = messageExt.getTopic();
String message = new String(messageExt.getBody(),"UTF-8");
int queueId = messageExt.getQueueId();
System.out.println("收到来自topic:" + topic + ", queueId:" + queueId + "的消息:" + message); } catch (Exception e) {
//失败,请求稍后重发
return ConsumeConcurrentlyStatus.RECONSUME_LATER;
}
//成功
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
consumer.start(); }
}

  consumeMessage返回一个枚举的两种状态,成功表示接受成功,否则返回稍后重发的状态。这里注意,启动的时候需要consumer先启动,因为它需要在生产者之前先订阅,否则将会收不到生产在consumer生产的消息,造成消息丢失。

  启动consumer,在启动producer

  producer控制台

  consumer控制台:

  rocketmq-console信息:

可以看到,我们前面部署的集群环境也是能够实现消息的负载均衡的,会使两个broker上都创建topic,且都能够接收生产者生产的消息。

  进入topic,可以看到新增了两个我们自定义的topic

可能会出现的问题:

  RemotingTooMuchRequestException: sendDefaultImpl call timeout

  在客户端运行Producer时,可能会出现如上异常,这是因为从 Windows 上开发连接 虚拟机中的 nameServer 时要经过 Linux 系统的防火墙,而防火墙一般都会有超时的机制,在网络连接长时间不传输数据时,会关闭这个 TCP 的会话,关闭后再读写,就有可能导致这个异常。

  解决办法就是关闭防火墙,ubuntu下命令如下:

  

  contOS下命令如下:

  systemctl stop firewalld.service #停止firewall
  systemctl disable firewalld.service #禁止firewall开机启动
  firewall-cmd --state #查看默认防火墙状态(关闭后显示notrunning,开启后显示running)

RocketMQ学习笔记(6)----RocketMQ的Client的使用 Producer/Consumer的更多相关文章

  1. 【rocketmq学习笔记】rocketmq入门学习

    基本介绍 rocketmq是阿里巴巴团队使用java语言开发的一款基于发布订阅模型的分布式消息队列中间件,是一款低延迟,高可用,拥有海量消息堆积能力和灵活拓展性的消息队列. 特点 可以实现集群无单点故 ...

  2. RocketMQ学习笔记(15)----RocketMQ的消息模式

    在前面学习ActiveMQ时,看到ActiveMQ可以是队列消息模式,也可以是订阅发布模式. 同样,在RocketMQ中,也存在两种消息模式,即是集群消费模式和广播消费模式. 1. 集群消费模式 跟A ...

  3. RocketMQ学习笔记(13)----RocketMQ的Consumer消息重试

    1. 概念 Producer端重试: 生产者端的消息失败,也就是Producer往MQ上发消息没有发送成功,比如网络抖动导致生产者发送消息到MQ失败. 这种消息失败重试我们可以手动设置发送失败重试的次 ...

  4. RocketMQ学习笔记(16)----RocketMQ搭建双主双从(异步复制)集群

    1. 修改RocketMQ默认启动端口 由于只有两台机器,部署双主双从需要四个节点,所以只能修改rocketmq的默认启动端口,从官网下载rocketmq的source文件,解压后使用idea打开,全 ...

  5. RocketMQ学习笔记(14)----RocketMQ的去重策略

    1. Exactly Only Once (1). 发送消息阶段,不允许发送重复的消息 (2). 消费消息阶段,不允许消费重复的消息. 只有以上两个条件都满足情况下,才能认为消息是“Exactly O ...

  6. RocketMQ学习笔记(4)----RocketMQ搭建双Master集群

    前面已经学习了RockeMQ的四种集群方式,接下来就来搭建一个双Master(2m)的集群环境. 1. 双Master服务器环境 序号 ip 用户名 密码 角色 模式 (1) 47.105.145.1 ...

  7. rocketmq ----> 学习笔记

    官网:http://rocketmq.apache.org 1.环境搭建 准备: rocketmq-all-4.3.0-bin-release.zip 必须配置:JAVA_HOME=/home/rui ...

  8. RocketMQ学习笔记(1)----RocketMQ的简介

    1. 什么是RocketMQ? 是一个队列模型的消息中间件,具有高性能.高可靠.高实时.分布式特点. Producer.Consumer.队列都可以分布式.  Producer 吐一些队列轮流収送消息 ...

  9. RocketMQ学习笔记(11)----RocketMQ的PushConsumer和PullConsumer

    1. PushConsumer 推,Broker主动向Consumer推消息,它Consumer的一种,应用通常向对象注册一个Listener接口,一旦接收到消息,Consumer对象立刻回调Lins ...

随机推荐

  1. px 与 pt

    px:pixel,像素,屏幕上显示的最小单位,用于网页设计,直观方便: pt:point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用: em:即%,在CSS中,1em=100 ...

  2. elasticsearch集群添加节点

    最简配置文件: cluster.name:  your_cluster_name node.name:  your_ip network.host: 0.0.0.0 http.port: your_p ...

  3. ZBrush中平滑笔刷介绍

    平滑笔刷在ZBrush®中的使用颇多,它可以在ZBrush®模型的多层细分下工作,并且能够控制对模型的平滑效果,而且还能将模型的细节完整保留.默认情况下,按住Shift键就会切换到平滑笔刷,根据调整不 ...

  4. nginx 日志配置不生效的问题

    log_format 有个默认的日志格式: log_format combined '$remote_addr - $remote_user [$time_local] ' ' "$requ ...

  5. c++的map有关

    Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字(key),每个关键字只能在map中出现一次,第二个可能称为该关键字的值(value))的数据 处理能力,由于这个特性,它完成有可能 ...

  6. JVM 原理

    0 引言  JVM一直是java知识里面进阶阶段的重要部分,如果希望在java领域研究的更深入,则JVM则是如论如何也避开不了的话题,本系列试图通过简洁易读的方式,讲解JVM必要的知识点. 1 运行流 ...

  7. 如何设置,获取,删除cookie?

    cookie : 存储数据,当用户访问了某个网站(网页)的时候,我们就可以通过cookie来像访问者电脑上存储数据 1.不同的浏览器存放的cookie位置不一样,也是不能通用的 2.cookie的存储 ...

  8. CF343E Pumping Stations(最小割树)

    没学过最小割树的出门左转. 我们已经知道了两点的最小割就是最小割树上,对应两点之间路径的权值的最小值. 找到最小割树中权值的最小的边. 那么一定是先选完一侧的点在选完另一侧的点. 因为当前边最小,那么 ...

  9. 当一个线程进入一个对象的一个synchronized方法后, 其它线程是否可进入此对象的其它方法?

    分几种情况: 1.其他方法前是否加了synchronized关键字,如果没加,则能. 2.如果这个方法内部调用了wait,则可以进入其他synchronized方法. 3.如果其他个方法都加了sync ...

  10. 洛谷 P1825 [USACO11OPEN]玉米田迷宫Corn Maze

    P1825 [USACO11OPEN]玉米田迷宫Corn Maze 题目描述 This past fall, Farmer John took the cows to visit a corn maz ...