阿里云RocketMQ的消费者简单实现
业务场景之类的请看另一篇生产者的实现;
package com.ttt.eee; import com.aliyun.openservices.ons.api.Action;
import com.aliyun.openservices.ons.api.Consumer;
import com.aliyun.openservices.ons.api.ONSFactory;
import com.aliyun.openservices.ons.api.PropertyKeyConst; import java.nio.charset.Charset;
import java.util.Properties;
import java.util.Scanner; public class MQTestConsumer { public static void main(String[] args) {
Properties properties = new Properties();
// 您在控制台创建的 Group ID,其实就是网上说的groupName
properties.put(PropertyKeyConst.GROUP_ID, "eee");
// AccessKey 阿里云身份验证,在阿里云服务器管理控制台创建
properties.put(PropertyKeyConst.AccessKey, "sss");
// SecretKey 阿里云身份验证,在阿里云服务器管理控制台创建
properties.put(PropertyKeyConst.SecretKey, "bbb");
// 设置 TCP 接入域名,到控制台的实例基本信息中查看
properties.put(PropertyKeyConst.NAMESRV_ADDR,
"http://ttt.mq-internet-access.mq-internet.aliyuncs.com:80");
// 集群订阅方式 (默认)
// properties.put(PropertyKeyConst.MessageModel, PropertyValueConst.CLUSTERING);
// 广播订阅方式
// properties.put(PropertyKeyConst.MessageModel, PropertyValueConst.BROADCASTING);
Consumer consumer = ONSFactory.createConsumer(properties);
// TODO tag如果是*表示订阅所有的tag消息,注意在producer里是叫tags,这里却叫subExpresion
// *表示订阅所有Tag,TagA||TagB表示订阅 TagA和TagB
consumer.subscribe("xxx-change", "*", (message, context) -> {
// context的用处暂时不知道
System.out.println("Receive: " + message);
System.out.println("具体消息为:" + new String(message.getBody(), Charset.forName("UTF-8")));
// 正常消费返回这个,如果消费消息后业务处理出现问题一般返回:Action.ReconsumeLater表示这条消息晚点处理;
return Action.CommitMessage;
});
//订阅另外一个 Topic
// TODO 一个Consumer可以订阅多个topic ??,不过既然是官网的例子应该是可以的
/*consumer.subscribe("TopicTestMQ-Other", "*", new MessageListener() { //订阅全部 Tag
public Action consume(Message message, ConsumeContext context) {
System.out.println("Receive: " + message);
return Action.CommitMessage;
}
});*/
consumer.start();
System.out.println("Consumer Started"); var scanner = new Scanner(System.in);
scanner.next(); consumer.shutdown();
System.out.println("closed producer conn.");
} }
集合到Spring里是:
@Bean(initMethod = "start", destroyMethod = "shutdown")
public ConsumerBean xxxNotify(XxxNotifyListener xxxNotifyListener) {
return this.getConsumer(gid, topic, xxxNotifyListener);
} private ConsumerBean getConsumer(String gid, String topic, MessageListener messageListener) {
Properties properties = new Properties();
properties.setProperty("addr", addr);
properties.setProperty("AccessKey", accessKey);
properties.setProperty("SecretKey", secretKey);
properties.setProperty("GROUP_ID", gid); Map<Subscription, MessageListener> subscriptionTable = new HashMap<>();
Subscription subscription = new Subscription();
subscription.setTopic(topic);
// 这里还可以设置subExpression来描述tag(重要:这里有个很大的坑,就是我这里设置了tag是tagA
//,但是producer发送的是tagB的,尽管这里确实不会到consume方法里进行业务消费,但这个消息在消息队列里也是没有了,它不会将tagB的消息返回到mq里待消费
// 上面的总结可能不准确,这里当初是两个消费者用的一个groupId导致的,这个有机会再测试一下;
// 经过测试如果在创建Consumer时就指定 tags,那么这个consumer只消费这个tags的消息,非此tags的消息是不会消费掉的,其他group是可以消费那些消息的;
// 而对于一个topic里有两个消费组,且aGroup消费TagA,bGroup消费TagB,那么必须在创建consumer时就指定tags,而不能通过consume方法里面判断tag,然后
// 不符合要求的则return Action.ReconsumeLater,这样是有问题的,比如bGroup消费了这个消息,发现不是自己的tag准备return ...Later,此时aGroup也
// 消费了这个消息,发现是自己的tag,然后做了业务处理,这个时候bGroup就返回了...Later,那么这条消息就可能被aGroup重复消费;
subscriptionTable.put(subscription, messageListener);
ConsumerBean consumer = new ConsumerBean();
consumer.setProperties(properties);
consumer.setSubscriptionTable(subscriptionTable);
return consumer;
}
MessageListener里是用来实现消费这个消息后的具体业务逻辑的;
阿里云RocketMQ的消费者简单实现的更多相关文章
- 阿里云RocketMQ的生产者简单实现
// MQ的应用场景有比如 订单变更消息可以通过产生这个事件的地方(比如前端调用后端的接口post一个订单,那么就是在这个mapping方法里做一个生产者[不过最好通过aop来实现,不然n多个接口都要 ...
- [原创]阿里云RocketMQ踩过的哪些坑
由于公司的最近开始使用RocketMQ来做支付业务处理, 便开启了学习阿里云RocketMQ的学习与实践之路, 其中踩了不少的坑, 大部份是由于没有仔细查看阿里云的技术文档而踩的坑. 但是有一个非常大 ...
- 阿里云RocketMQ定时/延迟消息队列实现
新的阅读体验:http://www.zhouhong.icu/post/157 一.业务需求 需要实现一个提前二十分钟通知用户去做某件事的一个业务,拿到这个业务首先想到的最简单得方法就是使用Redis ...
- 阿里云api调用做简单的cmdb
阿里云api调用做简单的cmdb 1 步骤 事实上就是调用阿里api.获取可用区,比方cn-hangzhou啊等等.然后在每一个区调用api 取ecs的状态信息,最好写到一个excel里面去.方便排序 ...
- Spring boot实战项目整合阿里云RocketMQ (非开源版)消息队列实现发送普通消息,延时消息 --附代码
一.为什么选择RocketMQ消息队列? 首先RocketMQ是阿里巴巴自研出来的,也已开源.其性能和稳定性从双11就能看出来,借用阿里的一句官方介绍:历年双 11 购物狂欢节零点千万级 TPS.万亿 ...
- 阿里云OSS对象存储 简单上传文件
不得不说阿里云的命名比较让人摸不着头脑,开始以为是文件存储NAS,弄了半天什么文件系统,挂载点的搞不明白.后来才搞清楚原来 对象存储OSS才是我需要的. 其中EndPoint就是画红框的部分,但是要加 ...
- CentOS7 配置阿里云yum源,非常之简单
1.进入yum的文件夹 命令:cd /etc/yum.repos.d/ 2.下载wget 命令:yum -y install wget 命令:yum install bash-completion ...
- 【工具】OSS阿里云存储服务--超级简单--个人还是觉得Fastdfs好玩
介绍 阿里云对象存储服务(Object Storage Service,简称 OSS)为您提供基于网络的数据存取服务. 使用 OSS,您可以通过网络随时存储和调用包括文本.图片.音频和视频等在内的各种 ...
- Docker 部署阿里云RocketMQ 4.5.1
搜索镜像 docker search rocketmq 查看镜像版本 如果要查看其它的镜像,只需要将其中的镜像名称foxiswho/rocketmq替换为其它镜像即可 curl https://reg ...
随机推荐
- luogu 3919
主席树 #include <iostream> #include <cstdio> #include <algorithm> #include <cmath& ...
- python中的关键字yield有什么作用?
保存当前运行状态,然后暂停执行,即将函数挂起.yield关键字后面表达式的值作为返回值返回.当使用next(),send()函数从断点处继续执行.
- es 修改 mapping 字段类型
一.原索引 PUT my_index { "mappings": { "_doc": { "properties": { "cre ...
- [bzoj 3566][SHOI 2014]概率充电器
传送门 Description SHOI 概率充电器由 n-1 条导线连通了 n 个充电元件.进行充电时,每条导线是否可以导电以概率决定,每一个充电元件自身是否直接进行充电也由概率决定. 随后电能可以 ...
- 牛客训练21674——牛牛与LCM
Problem 链接:https://ac.nowcoder.com/acm/problem/21674 来源:牛客网 牛牛最近在学习初等数论,他的数学老师给他出了一道题,他觉得太简单了, 懒得做,于 ...
- tcp流式传输和udp数据报传输
所有的书上都说, tcp是流式传输, 这是什么意思? 假设A给B通过TCP发了200字节, 然后又发了300字节, 此时B调用recv(设置预期接受1000个字节), 那么请问B实际接受到多少字节? ...
- c语言复杂申明解释程序
c语言复杂声明的解释 目标:分析一个将c语言复杂申明解释为英语的一个程序 首先介绍一种简单的读声明的方法,来源网络 1.右左法则 从标识符开始(或者最内层的结构,如果不存在标识符的话,通常出现于函数指 ...
- arcgis python 开启编辑会话和编辑操作、在表中创建行、停止编辑操作以及提交编辑会话。
import arcpy import os fc = 'Database Connections/Portland.sde/portland.jgp.schools' workspace = os. ...
- angular组件数据
import { Component, OnInit } from '@angular/core'; @Component({ selector: 'app-news', templateUrl: ' ...
- ColorMatrix图片饱和度设置
package com.loaderman.customviewdemo; import android.app.Activity; import android.graphics.Bitmap; i ...