上述就是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:通过注册监听的方式来消费信息

  1. <span style="font-family:Comic Sans MS;font-size:18px;">/**
  2. * @FileName: Consumer.java
  3. * @Package:com.test
  4. * @Description: TODO
  5. * @author: LUCKY
  6. * @date:2015年12月28日 下午2:43:23
  7. * @version V1.0
  8. */
  9. package com.test;
  10. import java.util.List;
  11. import com.alibaba.rocketmq.client.consumer.DefaultMQPushConsumer;
  12. import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
  13. import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
  14. import com.alibaba.rocketmq.client.consumer.listener.MessageListenerConcurrently;
  15. import com.alibaba.rocketmq.common.consumer.ConsumeFromWhere;
  16. import com.alibaba.rocketmq.common.message.Message;
  17. import com.alibaba.rocketmq.common.message.MessageExt;
  18. /**
  19. * @ClassName: Consumer
  20. * @Description: 模拟消费者
  21. * @author: LUCKY
  22. * @date:2015年12月28日 下午2:43:23
  23. */
  24. public class ConsumerTest {
  25. public static void main(String[] args) {
  26. DefaultMQPushConsumer consumer=new DefaultMQPushConsumer("broker-a");
  27. consumer.setNamesrvAddr("100.66.154.81:9876");
  28. try {
  29. // 订阅PushTopic下Tag为push的消息,都订阅消息
  30. consumer.subscribe("PushTopic", "push");
  31. // 程序第一次启动从消息队列头获取数据
  32. consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
  33. //可以修改每次消费消息的数量,默认设置是每次消费一条
  34. // consumer.setConsumeMessageBatchMaxSize(10);
  35. //注册消费的监听
  36. consumer.registerMessageListener(new MessageListenerConcurrently() {
  37. //在此监听中消费信息,并返回消费的状态信息
  38. public ConsumeConcurrentlyStatus consumeMessage(
  39. List<MessageExt> msgs,
  40. ConsumeConcurrentlyContext context) {
  41. // msgs中只收集同一个topic,同一个tag,并且key相同的message
  42. // 会把不同的消息分别放置到不同的队列中
  43. for(Message msg:msgs){
  44. System.out.println(new String(msg.getBody()));
  45. }
  46. return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
  47. }
  48. });
  49. consumer.start();
  50. Thread.sleep(5000);
  51. //5秒后挂载消费端消费
  52. consumer.suspend();
  53. } catch (Exception e) {
  54. e.printStackTrace();
  55. }
  56. }
  57. }
  58. </span>

 PullConsumer:通过拉去的方式来消费消息

  1. <span style="font-family:Comic Sans MS;font-size:18px;">/**
  2. * @FileName: Consumer.java
  3. * @Package:com.test
  4. * @Description: TODO
  5. * @author: LUCKY
  6. * @date:2015年12月28日 下午2:43:23
  7. * @version V1.0
  8. */
  9. package com.test;
  10. import java.util.Set;
  11. import com.alibaba.rocketmq.client.consumer.DefaultMQPullConsumer;
  12. import com.alibaba.rocketmq.client.consumer.MessageQueueListener;
  13. import com.alibaba.rocketmq.common.message.MessageQueue;
  14. /**
  15. * @ClassName: Consumer
  16. * @Description: 模拟消费者
  17. * @author: LUCKY
  18. * @date:2015年12月28日 下午2:43:23
  19. */
  20. public class ConsumerPullTest {
  21. public static void main(String[] args) {
  22. DefaultMQPullConsumer consumer=new DefaultMQPullConsumer();
  23. consumer.setNamesrvAddr("100.66.154.81:9876");
  24. consumer.setConsumerGroup("broker");
  25. try {
  26. consumer.start();
  27. Set<MessageQueue> messageQueues=  consumer.fetchSubscribeMessageQueues("PushTopic");
  28. for(MessageQueue messageQueue:messageQueues){
  29. System.out.println(messageQueue.getTopic());
  30. }
  31. //消息队列的监听
  32. consumer.registerMessageQueueListener("", new MessageQueueListener() {
  33. @Override
  34. //消息队列有改变,就会触发
  35. public void messageQueueChanged(String topic, Set<MessageQueue> mqAll,
  36. Set<MessageQueue> mqDivided) {
  37. // TODO Auto-generated method stub
  38. }
  39. });
  40. } catch (Exception e) {
  41. e.printStackTrace();
  42. }
  43. }
  44. }
  45. </span>

一般在应用中都会采用push的方法来自动的消费信息

详解RocketMQ中的consumer的更多相关文章

  1. jQuery:详解jQuery中的事件(二)

    上一篇讲到jQuery中的事件,深入学习了加载DOM和事件绑定的相关知识,这篇主要深入讨论jQuery事件中的合成事件.事件冒泡和事件移除等内容. 接上篇jQuery:详解jQuery中的事件(一) ...

  2. 图文详解Unity3D中Material的Tiling和Offset是怎么回事

    图文详解Unity3D中Material的Tiling和Offset是怎么回事 Tiling和Offset概述 Tiling表示UV坐标的缩放倍数,Offset表示UV坐标的起始位置. 这样说当然是隔 ...

  3. 【转】详解C#中的反射

    原帖链接点这里:详解C#中的反射   反射(Reflection) 2008年01月02日 星期三 11:21 两个现实中的例子: 1.B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内 ...

  4. 详解Webwork中Action 调用的方法

    详解Webwork中Action 调用的方法 从三方面介绍webwork action调用相关知识: 1.Webwork 获取和包装 web 参数 2.这部分框架类关系 3.DefaultAction ...

  5. 【转】详解JavaScript中的this

    ref:http://blog.jobbole.com/39305/ 来源:foocoder 详解JavaScript中的this JavaScript中的this总是让人迷惑,应该是js众所周知的坑 ...

  6. 深入详解SQL中的Null

    深入详解SQL中的Null NULL 在计算机和编程世界中表示的是未知,不确定.虽然中文翻译为 “空”, 但此空(null)非彼空(empty). Null表示的是一种未知状态,未来状态,比如小明兜里 ...

  7. 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 ...

  8. 详解Objective-C中委托和协议

    Objective-C委托和协议本没有任何关系,协议如前所述,就是起到C++中纯虚类的作用,对于“委托”则和协议没有关系,只是我们经常利用协议还实现委托的机制,其实不用协议也完全可以实现委托. AD: ...

  9. 举例详解Python中的split()函数的使用方法

    这篇文章主要介绍了举例详解Python中的split()函数的使用方法,split()函数的使用是Python学习当中的基础知识,通常用于将字符串切片并转换为列表,需要的朋友可以参考下   函数:sp ...

随机推荐

  1. 哪里是Maven的中央存储库?

    当你建立了一个Maven工程,Maven会检查你的pom.xml文件,确定要下载的依赖.首先,Maven将从您的本地库Maven查找,如果没有找到,Maven会从中央存储库-http://repo1. ...

  2. HSL颜色处理

    H--色调 S--饱和度 L--亮度 HSB(HSL) 色调饱和度亮度模式 以另外一种不同的理念进行色彩的调配 H色调 0~360 圆环形式 以角度表示 S 饱和度 0~1 之间的小数 L 亮度 0~ ...

  3. Java学习笔记1---JVM、JRE、JDK

    jdk包含jre,jre包含jvm. 用java语言进行开发时,必须先装jdk: 只运行java程序,不进行开发时,可以只装jre. JVM 即Java Virtual machine,Java虚拟机 ...

  4. 使用百度siteapp开发网站的App-(IOS和Android版本)

    介绍 之前写了个把百度云作文网站文件服务器.一些园友的评论不错.不过我似乎把意思弄错了!  我用的百度云的SVN环境! 现在不少人都做web开发.不管你是什么语言编写的(jsp,php,asp.net ...

  5. 用qemu+gdb tcp server+CDT调试linux内核启动-起步

    用qemu+gdb tcp server+CDT调试linux内核启动-起步 说明: 环境信息与 用virtualbox+模拟串口+CDT调试linux内核 TCP IP协议栈-起步 提到的一样,并且 ...

  6. 大数据学习——scala的wordCount小例子

    val lines=List("hello tom hello jerry","hello tom hello kitty hello china") //方法 ...

  7. ACM程序设计选修课——1044: (ds:队列)打印队列(queue模拟)

    问题 A: (ds:队列)打印队列 时间限制: 1 Sec  内存限制: 128 MB 提交: 25  解决: 4 [提交][状态][讨论版] 题目描述 网络工程实验室只有一台打印机,它承担了非常繁重 ...

  8. BZOJ 4817 [Sdoi2017]树点涂色 ——LCT 线段树

    同BZOJ3779. SDOI出原题,还是弱化版的. 吃枣药丸 #include <map> #include <cmath> #include <queue> # ...

  9. BZOJ4916 神犇和蒟蒻 【欧拉函数 + 杜教筛】

    题目 很久很久以前,有一只神犇叫yzy; 很久很久之后,有一只蒟蒻叫lty; 输入格式 请你读入一个整数N;1<=N<=1E9,A.B模1E9+7; 输出格式 请你输出一个整数A=\sum ...

  10. IBM DB2 控制中心等图形工具在 Windows 下的字体设置

    原文地址(直接看原文): http://loveseaside.iteye.com/blog/648941 [简介如下] IBM DB2 在版本 8.0 以上就提供了一个跨平台的基于 Java 的一套 ...