使用Java客户端发送消息和消费的应用

体验链接:https://developer.aliyun.com/adc/scenario/fb1b72ee956a4068a95228066c3a40d6
实验简介
本教程将Demo演示使用java客户端发送消息和消费的应用场景
实验实操
第1节 如何发送和消费并发消息
并发消息,也叫普通消息,是相对顺序消息而言的,普通消息的效率最高。本教程将简单演示如何使用纯java client发送和消费消息。
1. 下载java代码demo(已下载则忽略操作)
cd /data/demos
git clone https://github.com/ApacheRocketMQ/06-all-java-demos.git
2. 打包,执行代码demo
再执行命令, 可以看到正常生产和消费输出
// 进入demo代码目录
cd /data/demos/06-all-java-demos/
// 打包
mvn clean package
// 运行代码
mvn exec:java -Dexec.args="127.0.0.1:39876" -Dexec.mainClass="org.apache.rocketmqdemos.ConcurrentMessageDemo" -Dexec.classpathScope=runtime
3. Demo代码说明
Demo代码可以查看github。并发消息,意思是生产者可以并发的向topic中发送消息, 消费端不区分顺序的消息,这种模式效率最好。生产者demo代码如下:

最后留一个思考题给大家: 生产者实例和消费者实例, 都是线程安全的吗?
第2节 如何发送和消费顺序消息
顺序消息分为分区有序和全局有序。生产消费代码都是一样的, 区别在于分区有序的topic中queue个数可以是任意有效值,全局有序的topic要求queue的个数为1。顺序消息的实现非常简单易懂,但牺牲了可用性,单节点故障会直接影响顺序消息。
什么是分区有序消息,什么场景应该使用呢,又该如何发送分区有序消息?分区有序表示在一个queue中的消息是有序的,发送消息时设置设置了相同key的消息会被发送到同一个queue中。
本教程将简单演示如何使用纯java client发送和消费顺序消息。
1. 下载java代码demo(已下载则忽略操作)
cd /data/demos
git clone https://github.com/ApacheRocketMQ/06-all-java-demos.git
2. 打包,执行代码demo
再执行命令, 可以看到正常生产和消费输出。 消费输出注意看相同queue id的消息输出内容中的数字,按照从小到大就是正确的。
// 进入demo代码目录
cd /data/demos/06-all-java-demos/
// 打包
mvn clean package
// 运行代码
mvn exec:java -Dexec.args="127.0.0.1:39876" -Dexec.mainClass="org.apache.rocketmqdemos.OrderMessageDemo1" -Dexec.classpathScope=runtime

3. Demo代码说明
Demo代码可以查看github。
- 生产者说明
生产者会根据设置的keys做hash,相同hash值的消息会发送到相同的queue中。所以相同hash值的消息需要保证在同一个线程中顺序的发送。

- 消费者说明
消费者使用相对比较简单, 消息监听类实现org.apache.rocketmq.client.consumer.listener.MessageListenerOrderly接口即可。相同queue的消息需要串行处理,这样救保证消费的顺序性

第3节 如何发送和消费延迟消息
延迟消息,对于一些特殊场景比如订票后30分钟不支付自动取消等类似场景比较有用。本教程将简单演示如何使用纯java client发送和消费延迟消息。
1. 下载java代码demo(已下载则忽略操作)
cd /data/demos
git clone https://github.com/ApacheRocketMQ/06-all-java-demos.git
2. 打包,执行代码demo
执行命令, 可以看到正常生产和消费输出。 目前RocketMQ支持多种延迟级别, 不过每种延迟级别都是基于RocketMQ自身,实际延迟时间会加上Broker-Client端的网络情况不同而略有差异。
// 进入demo代码目录
cd /data/demos/06-all-java-demos/
// 打包
mvn clean package
// 运行代码
mvn exec:java -Dexec.args="127.0.0.1:39876" -Dexec.mainClass="org.apache.rocketmqdemos.DelayMessageDemo" -Dexec.classpathScope=runtime

3. Demo代码说明
Demo代码可以查看github。
- 生产者说明
生产者在发送消息的时候需要设置延迟级别,RocketMQ支持多种延迟级别。如果把延迟时间算作一个以空格分割的数组,延迟级别就是延迟时间数组的下标index+1。RocketMQ如何解析延迟级别和延迟时间映射关系。

- 消费者说明: 消费者按照并发消息消费即可
第4节 如何发送和消费事务消息
事务消息,是RocketMQ解决分布式事务的一种实现,极其简单好用。一个事物消息大致的生命周期如下图

概括为如下几个重要点:
生产者发送half消息(事物消息)
Broker存储half消息
生产者处理本地事物,处理成功后commit事物
消费者消费到事物消息
本教程将简单演示如何使用纯java client发送和消费事物消息。
1. 下载java代码demo(已下载则忽略操作)
cd /data/demos
git clone https://github.com/ApacheRocketMQ/06-all-java-demos.git
2. 打包,执行代码demo
执行命令, 可以看到事物消息的全部过程。
// 进入demo代码目录
cd /data/demos/06-all-java-demos/
// 打包
mvn clean package
// 运行代码
mvn exec:java -Dexec.args="127.0.0.1:39876" -Dexec.mainClass="org.apache.rocketmqdemos.TransactionMessageDemo" -Dexec.classpathScope=runtime
3. Demo代码说明
Demo代码可以查看github。在事物消息中,消费代码和普通消息的消费一样,主要代码在生产者端。
生产者端的主要代码包含3个步骤:
- 初始化生产者,设置回调线程池、设置本地事物处理监听类。
这里注意事物消息的生产者类是: org.apache.rocketmq.client.producer.TransactionMQProducer, 而不是普通生产者类。

事物监听类需要实现2个方法,这里的逻辑都是mock的,实际使用的时候需要根据实际修改。

- 发送事物消息。调用sendMessageInTransaction()方法发送事物消息, 而不是以前的send()方法。

第5节 生产者消费者如何同步发送、消费消息(Request-Reply)
request-reply模式,可以满足目前类似RPC同步调用的场景,本教程将简单演示如何使用该模式。
1. 下载java代码demo(已下载则忽略操作)
cd /data/demos
git clone https://github.com/ApacheRocketMQ/06-all-java-demos.git
2. 打包,执行代码demo
执行命令, 可以看到正常生产和消费输出。
// 进入demo代码目录
cd /data/demos/06-all-java-demos/
// 打包
mvn clean package
// 运行代码
mvn exec:java -Dexec.args="127.0.0.1:39876" -Dexec.mainClass="org.apache.rocketmqdemos.RequestReplyMessageDemo" -Dexec.classpathScope=runtime
通过代码结果和代码比较, 我们得知request-reply类似RPC同步调用的效果。

个人觉得:需要同步调用就用RPC, 不要走MQ,毕竟两者是完全不同的目标的产品,专业的事情交给专业的产品。
3. Demo代码说明
Demo代码可以查看github。
request-reply模式,在生产者和消费者两端都和一般的生产消费有区别,下面分别介绍下demo代码。
生产者demo主要代码, 主要区别在于调用request(),而不是send()方法。

消费者demo主要代码: 消费代码主要增加了“回复”逻辑。回复是利用消息发送直接向生产者发送一条消息。 有点类似事物消息中broker回查生产者。

一个小问题:事物消息和request-reply消息时,生产者的生产者组名有什么要求嘛?
第6节 如何有选择性的消费消息
有时候我们只想消费部分消息, 当然全部消费,在代码中过滤。 假如消息海量时, 会有很多资源浪费,比如浪费不必要的带宽。我们可以通过tag,sql92表达式来选择性的消费。
- 进入broker目录
cd /usr/local/services/5-rocketmq/broker-01
- 编辑配置文件,修改broker配置项2个
vim conf/broker.conf
配置项值:
// 是否支持重试消息也过滤
filterSupportRetry=true
// 支持属性过滤
enablePropertyFilter=true
修改后:

- 重启broker
./restart.sh
1. 下载java代码demo(已下载则忽略操作)
cd /data/demos
git clone https://github.com/ApacheRocketMQ/06-all-java-demos.git
2. 打包,执行tag过滤代码demo
执行命令, 可以看到正常生产和消费输出。
// 进入demo代码目录
cd /data/demos/06-all-java-demos/
// 打包
mvn clean package
// 运行代码
mvn exec:java -Dexec.args="127.0.0.1:39876 tag" -Dexec.mainClass="org.apache.rocketmqdemos.FliterMessageDemo" -Dexec.classpathScope=runtime
3. 执行sql过滤代码demo
执行命令, 可以看到正常生产和消费输出。
// 进入demo代码目录
cd /data/demos/06-all-java-demos/
// 打包
mvn clean package
// 运行代码
mvn exec:java -Dexec.args="127.0.0.1:39876 sql" -Dexec.mainClass="org.apache.rocketmqdemos.FliterMessageDemo" -Dexec.classpathScope=runtime
4. Demo代码说明
Demo代码可以查看github。以下分别介绍生产者和消费者主要demo代码。
- 生产者
在生产tag消息的时候, 消息中需要加上发送tag;sql92过滤的时候,加上自定义k-v。

- 消费者
tag过滤消费时,在订阅topic时, 也添加上tag订阅

SQL92过滤时,添加上SQL过滤订阅。至于SQL92除了等号,还是支持什么,大家可以自行自行查看或者到群里问。

第7节 如何使用ACL客户端生产消费消息
ACL,全称是Access Control List,是RocketMQ设计来做访问和权限控制的。更多文档参见github wiki:https://github.com/apache/rocketmq/wiki/RIP-5-RocketMQ-ACL
0. 启动一个集群
- 进入broker目录
cd /usr/local/services/5-rocketmq/broker-01
- 编辑配置文件,修改broker配置项1个
vim conf/broker.conf
配置项值:
aclEnable=true
修改后:

- 重启broker
./restart.sh
1. 下载java代码demo(已下载则忽略操作)
cd /data/demos
git clone https://github.com/ApacheRocketMQ/06-all-java-demos.git
2. 打包,执行代码demo
执行命令, 可以看到正常生产和消费输出。 demo代码使用的admin权限发送和消费,实际使用需要对于每个topic,消费者组授权,才能正常生产消费。
// 进入demo代码目录
cd /data/demos/06-all-java-demos/
// 打包
mvn clean package
// 运行代码
mvn exec:java -Dexec.args="127.0.0.1:39876" -Dexec.mainClass="org.apache.rocketmqdemos.ACLDemo" -Dexec.classpathScope=runtime
3. Demo代码说明
Demo代码可以查看github。带ACL的生产者和消费者在初始化的时候,都必须给一个hook实例,构建方法如下:
static RPCHook getAclRPCHook(String accessKey, String secretKey) {
return new AclClientRPCHook(new SessionCredentials(accessKey, secretKey));
}
在broker端secret key用来校验信息的完整性, access key用来校验用户权限。二者缺一不可。
使用Java客户端发送消息和消费的应用的更多相关文章
- 原生 Java 客户端进行消息通信
原生 Java 客户端进行消息通信 Direct 交换器 DirectProducer:direct类型交换器的生产者 NormalConsumer:普通的消费者 MulitBindConsumer: ...
- Netty客户端发送消息并同步获取结果
客户端发送消息并同步获取结果,其实是违背Netty的设计原则的,但是有时候不得不这么做的话,那么建议进行如下的设计: 比如我们的具体用法如下: NettyRequest request = new N ...
- 消息中间件系列三:使用RabbitMq原生Java客户端进行消息通信(消费者(接收方)自动确认模式、消费者(接收方)自行确认模式、生产者(发送方)确认模式)
准备工作: 1)安装RabbitMQ,参考文章:消息中间件系列二:RabbitMQ入门(基本概念.RabbitMQ的安装和运行) 2.)分别新建名为OriginalRabbitMQProducer和O ...
- mina客户端发送消息延迟问题分析
原文:http://www.cnblogs.com/haiq/archive/2011/08/01/2124292.html (写的蛮好,保存下来) 由于项目需要,用到了 mina 框架进行 tcp ...
- java socket 一个服务器对应多个客户端,可以互相发送消息
直接上代码,这是网上找的demo,然后自己根据需求做了一定的修改.代码可以直接运行 服务器端: package socket; import java.io.BufferedReader; impor ...
- Socket通讯-C#客户端与Java服务端通讯(发送消息和文件)
设计思路 使用websocket通信,客户端采用C#开发界面,服务端使用Java开发,最终实现Java服务端向C#客户端发送消息和文件,C#客户端实现语音广播的功能. Java服务端设计 packag ...
- Spring Boot+Socket实现与html页面的长连接,客户端给服务器端发消息,服务器给客户端轮询发送消息,附案例源码
功能介绍 客户端给所有在线用户发送消息 客户端给指定在线用户发送消息 服务器给客户端发送消息(轮询方式) 项目搭建 项目结构图 pom.xml <?xml version="1.0&q ...
- NIO【同步非阻塞io模型】关于 NIO socket 的详细总结【Java客户端+Java服务端 + 业务层】【可以客户端间发消息】
1.前言 以前使用 websocket来实现双向通信,如今深入了解了 NIO 同步非阻塞io模型 , 优势是 处理效率很高,吞吐量巨大,能很快处理大文件,不仅可以 做 文件io操作, 还可以做sock ...
- RabbitMQ(3) Java客户端使用
RabbitMQ针对不同的开发语言(java,python,c/++,Go等等),提供了丰富对客户端,方便使用.就Java而言,可供使用的客户端有RabbitMQ Java client. Rabbi ...
随机推荐
- C# 有关List<T>的Contains与Equals方法
[以下内容仅为本人在学习中的所感所想,本人水平有限目前尚处学习阶段,如有错误及不妥之处还请各位大佬指正,请谅解,谢谢!] !!!观前提醒!!! [本文内容可能较为复杂,虽然我已经以较为清晰的方式展 ...
- 基于.NetCore开发博客项目 StarBlog - (5) 开始搭建Web项目
系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...
- html5 tts(文字朗读)
在 chrome 下使用比较好的中文语音包. 注意 speechSynthesis.getVoices() 有时候可能会返回空数组,需要做验证 var zhCnLangs = speechSynthe ...
- MySQL主从配置及haproxy和keepalived搭建
本篇文章主要介绍如何搭建MySQL主主配置.主从配置.haproxy.keepalived,已经搭建过程中的一些问题.本次运行环境是在docker中,也会介绍一些docker的知识 docker 小知 ...
- 好客租房29-从jsx中抽离事件处理程序
从jsx中抽离过多js逻辑代码 会显得非常混乱 推荐:将逻辑抽离到单独的方法中 保证jsx结构清晰 //导入react import React from 'react' ...
- 146_ACCESS之HR招聘信息管理_64位
焦棚子的文章目录 点击下载附件 一.背景: 最近把之前做的一个HR招聘信息管理工具翻新了下,有需要的朋友可以自取,主要想解决的问题是多人在跟进人员招聘的时候信息的不对称,这样下来的就可以及时的看到整个 ...
- java框架--快速入门
spring快速入门 1.创建项目 1.1创建项目文件夹 1.2启动idea ->文件->打开->点击创建的项目文件夹 1.3右键创建 ...
- HBase数据库基础操作
实验要求: 根据上面给出的学生表Student的信息,执行如下操作: 用Hbase Shell命令创建学生表Student: create 'student','name', 'score' put ...
- HTML区块
1.HTML 可以通过 <div> 和 <span>将元素组合起来. 2.HTML <div> 元素 HTML <div> 元素是块级元素,它可用于组合 ...
- 前端 关于请求地址时出现乱码, 出现%E2%80%8B的问题
做项目时,添加了新的一个接口,习惯性地复制了接口下来.然后测试发现 请求时自动添加 了几个%E2%80%8B这种乱码. 问题原因: 我输出请求地址时也是正确的,是因为复制过来的接口地址会有零宽空格 解 ...