转载请注明出处:http://www.cnblogs.com/xiaodf/

  本博客实现了一个简单的RocketMQ消费者的示例,MQ里存储的是经过Avro序列化的消息数据,程序读取数据并反序列化后,将消息从控制台打印出来。

  程序通过stdin.xml配置文件获取主要参数值,stdin.xml文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<operator>
<parameters>
<parameter>
<key>rocketmq.nameserver.list</key>
<value>172.16.8.106:9876</value>
</parameter>
<parameter>
<key>rocketmq.group.id</key>
<value>test006</value>
</parameter>
<parameter>
<key>rocketmq.topic</key>
<value>TopicTest2</value>
</parameter>
<parameter>
<key>rocketmq.tags</key>
<value>*</value>
</parameter>
<parameter>
<key>rocketmq.message.key</key>
<value>OrderID0034</value>
</parameter>
<parameter>
<key>schemaStr</key>
<value>col1:string,col2:double</value>
</parameter>
<parameter>
<key>filePath</key>
<value>/home/test/rocketmq/input.txt</value>
</parameter>
</parameters>
</operator>

  

消费者示例程序如下:

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.client.exception.MQClientException;
import com.alibaba.rocketmq.common.message.MessageExt;
import com.scistor.datavision.operator.common.OperatorConfiguration;
import org.apache.avro.Schema;
import org.apache.avro.generic.GenericDatumReader;
import org.apache.avro.generic.GenericRecord;
import org.apache.avro.io.DatumReader;
import org.apache.avro.io.Decoder;
import org.apache.avro.io.DecoderFactory;
import org.apache.hive.hcatalog.common.HCatException;
import org.apache.hive.hcatalog.data.schema.HCatSchema; import java.io.IOException;
import java.util.List; public class RocketConsumer {
private static Schema schema = null;
// parameters
private String nameserver;
private String groupID;
private String rocketmqTopic;
private String tags;
private String schemaStr; public RocketConsumer configure(OperatorConfiguration conf) {
this.nameserver = conf.get("rocketmq.nameserver.list");
this.groupID = conf.get("rocketmq.group.id");
this.rocketmqTopic = conf.get("rocketmq.topic");
this.tags = conf.get("rocketmq.tags");
this.schemaStr = conf.get("schemaStr");
return this;
} /**
* 当前例子是PushConsumer用法,使用方式给用户感觉是消息从RocketMQ服务器推到了应用客户端。<br>
* 但是实际PushConsumer内部是使用长轮询Pull方式从MetaQ服务器拉消息,然后再回调用户Listener方法<br>
*/
public void run() throws MQClientException {
/**
* 一个应用创建一个Consumer,由应用来维护此对象,可以设置为全局对象或者单例<br>
* 注意:ConsumerGroupName需要由应用来保证唯一
*/
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("ConsumerGroupName");
consumer.setNamesrvAddr(nameserver);
consumer.setInstanceName(groupID+"Consumber");
consumer.setConsumerGroup(groupID); try {
consumer.subscribe(rocketmqTopic, tags);
} catch (MQClientException e) {
e.printStackTrace();
} HCatSchema hcatSchema = null;
SchemaUtil schemaUtil = new SchemaUtil();
try {
hcatSchema = schemaUtil.createHCatSchema(schemaStr);
schema = schemaUtil.createSchema("com.scistor.rocketmq.producer", rocketmqTopic, hcatSchema);
} catch (HCatException e) {
e.printStackTrace();
} consumer.registerMessageListener(new MessageListenerConcurrently() {
/**
* 默认msgs里只有一条消息,可以通过设置consumeMessageBatchMaxSize参数来批量接收消息
*/
public ConsumeConcurrentlyStatus consumeMessage(
List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
System.out.println(Thread.currentThread().getName()
+ " Receive New Messages: " + msgs.size()); for (MessageExt msg : msgs) {
if (msg.getTopic().equals(rocketmqTopic)) {
byte[] bytes = msg.getBody();
DatumReader<GenericRecord> reader = new GenericDatumReader<GenericRecord>(schema);
Decoder decoder = DecoderFactory.get().binaryDecoder(bytes, null);
GenericRecord record1 = null;
try {
record1 = reader.read(null, decoder);
} catch (IOException e) {
e.printStackTrace();
}
int fieldSize = record1.getSchema().getFields().size();
for (int i = 0; i < fieldSize; i++) {
System.out.print(record1.get(i) + "====");
}
System.out.println();
}
}
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
}); /**
* Consumer对象在使用之前必须要调用start初始化,初始化一次即可<br>
*/
consumer.start(); System.out.println("Consumer Started.");
} public static void main(String[] args) throws MQClientException {
if (args.length < 1) {
System.err.println("需要: 参数配置文件<stdin.xml>所在的hdfs目录");
System.exit(-1);
}
OperatorConfiguration conf = new OperatorConfiguration(args[0]);
RocketConsumer trainer = new RocketConsumer();
trainer.configure(conf).run();
}
}

程序运行输出打印到控制台:

[root@m106 rocketmq]# ./consumer.sh
Consumer Started.
ConsumeMessageThread_5 Receive New Messages: 1
ConsumeMessageThread_1 Receive New Messages: 1
ConsumeMessageThread_9 Receive New Messages: 1
ConsumeMessageThread_8 Receive New Messages: 1
ConsumeMessageThread_7 Receive New Messages: 1
ConsumeMessageThread_4 Receive New Messages: 1
ConsumeMessageThread_2 Receive New Messages: 1
ConsumeMessageThread_10 Receive New Messages: 1
ConsumeMessageThread_3 Receive New Messages: 1
ConsumeMessageThread_6 Receive New Messages: 1
/home/xdf/workflow/file-web/file/1.html====hdfs:///user/xdf/streaming/file-web/file/3.html====1.0====hdfs:///user/xdf/streaming/file-web/file/2.html====hdfs:///user/xdf/streaming/file-web/file/4.html====/home/xdf/workflow/file-web/file/3.html====hdfs:///user/xdf/streaming/file-web/file/1.html====/home/xdf/workflow/file-web/file====1.0====
hdfs:///user/xdf/streaming/file-web/file====/home/xdf/workflow/file-web/file/2.html====/home/xdf/workflow/file-web/file/4.html====2.0====
1.0====
1.0====
3.0====
4.0====
2.0====
3.0====
4.0====

  

RocketMQ消费者示例程序的更多相关文章

  1. RocketMQ生产者示例程序

    转载请注明出处:http://www.cnblogs.com/xiaodf/ 本示例展示了一个RocketMQ producer的简单实现,通过解析文本文件获取输入数据,将数据经过Avro序列化后发送 ...

  2. 【rabbitmq】rabbitmq概念解析--消息确认--示例程序

    概述 本示例程序全部来自rabbitmq官方示例程序,rabbitmq-demo: 官方共有6个demo,针对不同的语言(如 C#,Java,Spring-AMQP等),都有不同的示例程序: 本示例程 ...

  3. Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例

    Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例 本文由 TonySpark 翻译自 Javarevisited.转载请参见文章末尾的要求. Java.util.concurr ...

  4. 通过Jexus 部署 dotnetcore版本MusicStore 示例程序

    ASPNET Music Store application 是一个展示最新的.NET 平台(包括.NET Core/Mono等)上使用MVC 和Entity Framework的示例程序,本文将展示 ...

  5. .NET跨平台:在Ubuntu上用自己编译的dnx运行ASP.NET 5示例程序

    在 Linux Ubuntu 上成功编译 dnx 之后,会在 artifacts/build/ 文件夹中生成 dnx-coreclr-linux-x64/ 与 dnx-mono/ 这2个文件夹,前者是 ...

  6. .NET跨平台:在CentOS上编译dnx并运行ASP.NET 5示例程序

    在之前的博文中我们在 Ubuntu 上成功编译出了 dnx ,并且用它成功运行了 ASP.NET 5 示例程序.在这篇博文中我们将 Ubuntu 换成 CentOS. 目前 dnx 的编译需要用到 m ...

  7. Salesforce Apex 使用JSON数据的示例程序

    本文介绍了一个在Salesforce Apex中使用JSON数据的示例程序, 该示例程序由以下几部分组成: 1) Album.cls, 定了了封装相关字段的数据Model类 2) RestClient ...

  8. osg 示例程序解析之osgdelaunay

    osg 示例程序解析之osgdelaunay 转自:http://lzchenheng.blog.163.com/blog/static/838335362010821103038928/ 本示例程序 ...

  9. DotNetBar for Windows Forms 12.7.0.10_冰河之刃重打包版原创发布-带官方示例程序版

    关于 DotNetBar for Windows Forms 12.7.0.10_冰河之刃重打包版 --------------------11.8.0.8_冰河之刃重打包版------------- ...

随机推荐

  1. 常用js总结1

    1.cookie.js(封装了cookie的基本操作) 1.引入cookie.js <script type="text/javascript" src="../j ...

  2. SQL GROUP BY 后排序

    由于GROUP BY 使用Sum函数后 ID等唯一值就无法查询出来了,所以想按照ID排序也就不可以了. 这时可以使用一个MIN 或者MAX函数来取得一个最小或者最大的ID 这样就可以实现以其中一条ID ...

  3. 对css中clear元素的理解

    clear:left;表示左侧不能有浮动元素. clear:right;表示右侧不能有浮动元素. clear:both;表示左右两侧都不能有浮动元素. 但在使用时,还得考虑css优先级问题.相同类型选 ...

  4. Displaying Window In Center In Oracle Forms 6i

    Center window automatically  in Oracle Forms 6i, use the following procedure by passing window name ...

  5. 20个Linux服务器安全强化建议(二)

    接上文,继续介绍一些Linux服务器的安全配置. #6.强密码策略.   当我们使用 useradd.usermod 命令创建或维护用户账号时,确保始终应用强密码策略.例如,一个好的密码至少包括8个字 ...

  6. 删除DSO Change Log表数据

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  7. VB.NET中的除法运算符 与 C#中的除法运算符

    VB.NET中的除法运算符有两个:/(浮点除法).\(整数除法) C#中的除法运算符只有一个:/(除法) VB.NET中的除法运算符与C#中的除法运算符存在很大的差异,使用时注意区分. 关于VB.NE ...

  8. console打印数组object具体内容

    例如 var data=[ {}, {}, {} ] 需要打印出以上data中每个{}内容,可以使用如下方式: for(var i=0;i<data.length;i++) { var a = ...

  9. python打怪之路【第二篇】:ImportError: No module named setuptools

    在python安装第三方模块时出现如下错误: python错误:ImportError: No module named setuptools这句错误提示的表面意思是:没有setuptools的模块, ...

  10. iOS 键盘

    http://blog.sina.com.cn/s/blog_7018d3820101djut.html 一.键盘风格 UIKit框架支持8种风格键盘. typedef enum { UIKeyboa ...