详解RocketMQ中的consumer
上述就是MQ中有关Consumer的类图,下面来介绍一下每个类
1.MQAdmin:底层类,上篇博客已经提过,就不再此重提
2.MQConsumer:Consumer公共的接口,常用的方法如下
如果消费失败的话,消息将会返回到broker中,并且延迟一会消费的时间
void sendMessageBack(final MessageExt msg, final int delayLevel, final String brokerName) throws RemotingException, MQBrokerException, InterruptedException, MQClientException;
3.MQPushConsumer:Consumer的一种,应用通常向Consumer对象注册一个Listener接口,一旦收到消息,Consumer对象立刻回调Listener接口方法
4.MQPullConsumer:Consumer的一种,应用通常主动调用Consumer的拉消息方法从Broker拉消息,主动权由应用控制
在上图中出现了两类的消费者分别是PushConsumer和PullConsumer,下面来看一下
PushConsumer:通过注册监听的方式来消费信息
- <span style="font-family:Comic Sans MS;font-size:18px;">/**
- * @FileName: Consumer.java
- * @Package:com.test
- * @Description: TODO
- * @author: LUCKY
- * @date:2015年12月28日 下午2:43:23
- * @version V1.0
- */
- package com.test;
- import java.util.List;
- import com.alibaba.rocketmq.client.consumer.DefaultMQPushConsumer;
- import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
- import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
- import com.alibaba.rocketmq.client.consumer.listener.MessageListenerConcurrently;
- import com.alibaba.rocketmq.common.consumer.ConsumeFromWhere;
- import com.alibaba.rocketmq.common.message.Message;
- import com.alibaba.rocketmq.common.message.MessageExt;
- /**
- * @ClassName: Consumer
- * @Description: 模拟消费者
- * @author: LUCKY
- * @date:2015年12月28日 下午2:43:23
- */
- public class ConsumerTest {
- public static void main(String[] args) {
- DefaultMQPushConsumer consumer=new DefaultMQPushConsumer("broker-a");
- consumer.setNamesrvAddr("100.66.154.81:9876");
- try {
- // 订阅PushTopic下Tag为push的消息,都订阅消息
- consumer.subscribe("PushTopic", "push");
- // 程序第一次启动从消息队列头获取数据
- consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
- //可以修改每次消费消息的数量,默认设置是每次消费一条
- // consumer.setConsumeMessageBatchMaxSize(10);
- //注册消费的监听
- consumer.registerMessageListener(new MessageListenerConcurrently() {
- //在此监听中消费信息,并返回消费的状态信息
- public ConsumeConcurrentlyStatus consumeMessage(
- List<MessageExt> msgs,
- ConsumeConcurrentlyContext context) {
- // msgs中只收集同一个topic,同一个tag,并且key相同的message
- // 会把不同的消息分别放置到不同的队列中
- for(Message msg:msgs){
- System.out.println(new String(msg.getBody()));
- }
- return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
- }
- });
- consumer.start();
- Thread.sleep(5000);
- //5秒后挂载消费端消费
- consumer.suspend();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- </span>
PullConsumer:通过拉去的方式来消费消息
- <span style="font-family:Comic Sans MS;font-size:18px;">/**
- * @FileName: Consumer.java
- * @Package:com.test
- * @Description: TODO
- * @author: LUCKY
- * @date:2015年12月28日 下午2:43:23
- * @version V1.0
- */
- package com.test;
- import java.util.Set;
- import com.alibaba.rocketmq.client.consumer.DefaultMQPullConsumer;
- import com.alibaba.rocketmq.client.consumer.MessageQueueListener;
- import com.alibaba.rocketmq.common.message.MessageQueue;
- /**
- * @ClassName: Consumer
- * @Description: 模拟消费者
- * @author: LUCKY
- * @date:2015年12月28日 下午2:43:23
- */
- public class ConsumerPullTest {
- public static void main(String[] args) {
- DefaultMQPullConsumer consumer=new DefaultMQPullConsumer();
- consumer.setNamesrvAddr("100.66.154.81:9876");
- consumer.setConsumerGroup("broker");
- try {
- consumer.start();
- Set<MessageQueue> messageQueues= consumer.fetchSubscribeMessageQueues("PushTopic");
- for(MessageQueue messageQueue:messageQueues){
- System.out.println(messageQueue.getTopic());
- }
- //消息队列的监听
- consumer.registerMessageQueueListener("", new MessageQueueListener() {
- @Override
- //消息队列有改变,就会触发
- public void messageQueueChanged(String topic, Set<MessageQueue> mqAll,
- Set<MessageQueue> mqDivided) {
- // TODO Auto-generated method stub
- }
- });
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- </span>
一般在应用中都会采用push的方法来自动的消费信息
详解RocketMQ中的consumer的更多相关文章
- jQuery:详解jQuery中的事件(二)
上一篇讲到jQuery中的事件,深入学习了加载DOM和事件绑定的相关知识,这篇主要深入讨论jQuery事件中的合成事件.事件冒泡和事件移除等内容. 接上篇jQuery:详解jQuery中的事件(一) ...
- 图文详解Unity3D中Material的Tiling和Offset是怎么回事
图文详解Unity3D中Material的Tiling和Offset是怎么回事 Tiling和Offset概述 Tiling表示UV坐标的缩放倍数,Offset表示UV坐标的起始位置. 这样说当然是隔 ...
- 【转】详解C#中的反射
原帖链接点这里:详解C#中的反射 反射(Reflection) 2008年01月02日 星期三 11:21 两个现实中的例子: 1.B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内 ...
- 详解Webwork中Action 调用的方法
详解Webwork中Action 调用的方法 从三方面介绍webwork action调用相关知识: 1.Webwork 获取和包装 web 参数 2.这部分框架类关系 3.DefaultAction ...
- 【转】详解JavaScript中的this
ref:http://blog.jobbole.com/39305/ 来源:foocoder 详解JavaScript中的this JavaScript中的this总是让人迷惑,应该是js众所周知的坑 ...
- 深入详解SQL中的Null
深入详解SQL中的Null NULL 在计算机和编程世界中表示的是未知,不确定.虽然中文翻译为 “空”, 但此空(null)非彼空(empty). Null表示的是一种未知状态,未来状态,比如小明兜里 ...
- java 乱码详解_jsp中pageEncoding、charset=UTF -8"、request.setCharacterEncoding("UTF-8")
http://blog.csdn.net/qinysong/article/details/1179480 java 乱码详解__jsp中pageEncoding.charset=UTF -8&quo ...
- 详解Objective-C中委托和协议
Objective-C委托和协议本没有任何关系,协议如前所述,就是起到C++中纯虚类的作用,对于“委托”则和协议没有关系,只是我们经常利用协议还实现委托的机制,其实不用协议也完全可以实现委托. AD: ...
- 举例详解Python中的split()函数的使用方法
这篇文章主要介绍了举例详解Python中的split()函数的使用方法,split()函数的使用是Python学习当中的基础知识,通常用于将字符串切片并转换为列表,需要的朋友可以参考下 函数:sp ...
随机推荐
- Django基于Pycharm开发之一【创建django工程】
Django的工程结构,可以通过pycharm里面,选择创建django工程来直接创建,也可以通过命令行通过pip来安装. 一.通过命令行安装的步骤 Install Python. Install a ...
- 关于freetype在安装中的遇到的问题
本人电脑配置的是Anconda环境+pycharm2017.2.2 comuniity,每次安装什么包就是直接pip install 的,但是这次在安装freetype的安装中却遇到了麻烦. 具体是在 ...
- Django Form two
Django_Form: 1.class TeacherNewForm(Form): username = fields.CharField( required=True, error_message ...
- AngularJS自定义指令directive:scope属性 (转载)
原文地址:http://blog.csdn.net/VitaLemon__/article/details/52213103 一.介绍: 在AngularJS中,除了内置指令如ng-click等,我们 ...
- 反射的妙用-类名方法名做参数进行方法调用实例demo
首先声明一点,大家都会说反射的效率低下,但是大多数的框架能少了反射吗?当反射能为我们带来代码上的方便就可以用,如有不当之处还望大家指出 1,项目结构图如下所示:一个ClassLb类库项目,一个为测试用 ...
- Selenium WebDriver-actionchain模拟键盘左键长按
#encoding=utf-8 import unittest import time from selenium import webdriver from selenium.webdriver i ...
- python week08 并发编程之多线程--实践部分
一. threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍 官网链接:https://docs.pytho ...
- python 学习分享-基础篇
1.python起手式 写下第一个代码,打印‘hello world’ print('hello world') 2.变量 变量是为了存储信息,在程序中被调用,标识数据名称或类型. 变量定义的规则: ...
- [转]廖雪峰:datetime用法
datetime是Python处理日期和时间的标准库. 获取当前日期和时间 我们先看如何获取当前日期和时间: >>> from datetime import datetime &g ...
- [Err] 1022 - Can't write; duplicate key in table '#sql-1500_26'
今天用powerdesigner修改了一些外键关系,有两个外键的名字取一样的,忘记改了.然后在用navicat运行sql文件时,报出[Err] 1022 - Can't write; dupl ...