业务场景之类的请看另一篇生产者的实现;

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的消费者简单实现的更多相关文章

  1. 阿里云RocketMQ的生产者简单实现

    // MQ的应用场景有比如 订单变更消息可以通过产生这个事件的地方(比如前端调用后端的接口post一个订单,那么就是在这个mapping方法里做一个生产者[不过最好通过aop来实现,不然n多个接口都要 ...

  2. [原创]阿里云RocketMQ踩过的哪些坑

    由于公司的最近开始使用RocketMQ来做支付业务处理, 便开启了学习阿里云RocketMQ的学习与实践之路, 其中踩了不少的坑, 大部份是由于没有仔细查看阿里云的技术文档而踩的坑. 但是有一个非常大 ...

  3. 阿里云RocketMQ定时/延迟消息队列实现

    新的阅读体验:http://www.zhouhong.icu/post/157 一.业务需求 需要实现一个提前二十分钟通知用户去做某件事的一个业务,拿到这个业务首先想到的最简单得方法就是使用Redis ...

  4. 阿里云api调用做简单的cmdb

    阿里云api调用做简单的cmdb 1 步骤 事实上就是调用阿里api.获取可用区,比方cn-hangzhou啊等等.然后在每一个区调用api 取ecs的状态信息,最好写到一个excel里面去.方便排序 ...

  5. Spring boot实战项目整合阿里云RocketMQ (非开源版)消息队列实现发送普通消息,延时消息 --附代码

    一.为什么选择RocketMQ消息队列? 首先RocketMQ是阿里巴巴自研出来的,也已开源.其性能和稳定性从双11就能看出来,借用阿里的一句官方介绍:历年双 11 购物狂欢节零点千万级 TPS.万亿 ...

  6. 阿里云OSS对象存储 简单上传文件

    不得不说阿里云的命名比较让人摸不着头脑,开始以为是文件存储NAS,弄了半天什么文件系统,挂载点的搞不明白.后来才搞清楚原来 对象存储OSS才是我需要的. 其中EndPoint就是画红框的部分,但是要加 ...

  7. CentOS7 配置阿里云yum源,非常之简单

    1.进入yum的文件夹 命令:cd   /etc/yum.repos.d/ 2.下载wget 命令:yum -y install wget 命令:yum install bash-completion ...

  8. 【工具】OSS阿里云存储服务--超级简单--个人还是觉得Fastdfs好玩

    介绍 阿里云对象存储服务(Object Storage Service,简称 OSS)为您提供基于网络的数据存取服务. 使用 OSS,您可以通过网络随时存储和调用包括文本.图片.音频和视频等在内的各种 ...

  9. Docker 部署阿里云RocketMQ 4.5.1

    搜索镜像 docker search rocketmq 查看镜像版本 如果要查看其它的镜像,只需要将其中的镜像名称foxiswho/rocketmq替换为其它镜像即可 curl https://reg ...

随机推荐

  1. 在docker容器中编译hadoop 3.1.0

    在docker容器中编译hadoop 3.1.0 优点:docker安装好之后可以一键部署编译环境,不用担心各种库不兼容等问题,编译失败率低. Hadoop 3.1.0 的源代码目录下有一个 `sta ...

  2. RESOURCE SUMMARY

    I dont know where to start so searched the net and get a lot of free videos, my plan is to watch the ...

  3. centos7 安装 Mysql 5.7.27,详细完整教程

    1. 下载 MySQL yum包 wget http://repo.mysql.com/mysql57-community-release-el7-10.noarch.rpm   2.安装MySQL源 ...

  4. docker 笔记--运行中的容器如何添加端口映射

    解决: iptables -t nat -A DOCKER -p tcp --dport ${YOURPORT_1} -j DNAT --to-destination ${CONTAINERIP}:$ ...

  5. [提权]Windows COM组件提权漏洞 (CVE-2017-0213)

    0x01 简介 COM组件是微软开发的一种新软件开发技术,在这个COM框架的下,可以开发出多功能的组件,可以根据自己的需求进行定制开发,替换旧的组件,多个功能组件组合到一起,从而形成了一个复杂的定制化 ...

  6. Gitlab 服务器搭建

    一.官网地址 首页:https://about.gitlab.com/ 安装说明:https://about.gitlab.com/installation/ 二.安装命令摘录 实际问题:yum 安装 ...

  7. 走进JavaWeb技术世界16:极简配置的SpringBoot

    一位阿里 Java 工程师的技术小站.作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux.网络.多线程,偶尔讲点Docker.ELK,同时 ...

  8. 开发WINDOWS服务程序

    开发WINDOWS服务程序 开发步骤: 1.New->Other->Service Application 2.现在一个服务程序的框架已经搭起来了,打开Service1窗口,有几个属性说明 ...

  9. TynSerial序列(还原)TFDMemTable

    TynSerial序列(还原)TFDMemTable 1)TFDMemTable查询数据 procedure TForm1.Qrys(accountno, sql, sql2: string; Dat ...

  10. $createElement实现自定义弹窗

    <el-button type="text" @click="open4">点击打开 Message Box</el-button> m ...