Java操作RockeMQ
RocketMQ是阿里巴巴在2012年开源的分布式消息中间件,目前已经捐赠给Apache基金会,已经于2016年11月成为 Apache 孵化项目,相信RocketMQ的未来会发挥着越来越大的作用,将有更多的开发者因此受益。
本文仅对RocketMQ的简单实用做入门性介绍,不对RocketMQ的底层原理进行深入介绍,后续文章将对RocketMQ的原理做详细介绍。
RocketMQ的Maven依赖:
<!-- https://mvnrepository.com/artifact/com.alibaba.rocketmq/rocketmq-client -->
<dependency>
<groupId>com.alibaba.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>3.2.6</version>
</dependency>
MQ的消费类RocketMQConsumer.java:
package com.lance.rocketMQ.RocketMQ;
import com.alibaba.rocketmq.client.consumer.DefaultMQPushConsumer;
import com.alibaba.rocketmq.client.consumer.listener.MessageListener;
import com.alibaba.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import com.alibaba.rocketmq.client.exception.MQClientException;
import com.alibaba.rocketmq.common.consumer.ConsumeFromWhere;
import java.util.UUID;
/**
* Created by lance on 2017/2/10.
*/
public class RocketMQConsumer {
private DefaultMQPushConsumer consumer;
private MessageListener listener;
protected String nameServer;
protected String groupName;
protected String topics;
public RocketMQConsumer(MessageListener listener, String nameServer, String groupName, String topics) {
this.listener = listener;
this.nameServer = nameServer;
this.groupName = groupName;
this.topics = topics;
}
public void init() {
consumer = new DefaultMQPushConsumer(groupName);
consumer.setNamesrvAddr(nameServer);
try {
consumer.subscribe(topics, "*");
} catch (MQClientException e) {
e.printStackTrace();
}
consumer.setInstanceName(UUID.randomUUID().toString());
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET);
consumer.registerMessageListener((MessageListenerConcurrently) this.listener);
try {
consumer.start();
} catch (MQClientException e) {
e.printStackTrace();
}
System.out.println("RocketMQConsumer Started! group=" + consumer.getConsumerGroup() + " instance=" + consumer.getInstanceName()
);
}
}
MQ消息的监听接口类RocketMQListener.java
package com.lance.rocketMQ.RocketMQ;
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.message.MessageExt;
import java.util.List;
/**
* Created by lance on 2017/2/10.
*/
public class RocketMQListener implements MessageListenerConcurrently {
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
// System.out.println("get data from rocketMQ:" + msgs);
for (MessageExt message : msgs) {
String msg = new String(message.getBody());
System.out.println("msg data from rocketMQ:" + msg);
}
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
}
MQ消息的生产者类RocketMQProducer.java
package com.lance.rocketMQ.RocketMQ;
import com.alibaba.rocketmq.client.exception.MQClientException;
import com.alibaba.rocketmq.client.producer.DefaultMQProducer;
import com.alibaba.rocketmq.client.producer.SendResult;
import com.alibaba.rocketmq.client.producer.SendStatus;
import com.alibaba.rocketmq.common.message.Message;
import java.util.UUID;
/**
* Created by lance on 2017/2/10.
*/
public class RocketMQProducer {
private DefaultMQProducer sender;
protected String nameServer;
protected String groupName;
protected String topics;
public void init() {
sender = new DefaultMQProducer(groupName);
sender.setNamesrvAddr(nameServer);
sender.setInstanceName(UUID.randomUUID().toString());
try {
sender.start();
} catch (MQClientException e) {
e.printStackTrace();
}
}
public RocketMQProducer(String nameServer, String groupName, String topics) {
this.nameServer = nameServer;
this.groupName = groupName;
this.topics = topics;
}
public void send(Message message) {
message.setTopic(topics);
try {
SendResult result = sender.send(message);
SendStatus status = result.getSendStatus();
System.out.println("messageId=" + result.getMsgId() + ", status=" + status);
} catch (Exception e) {
e.printStackTrace();
}
}
}
测试RocketMQ的消费 RocketMQConsumerTest.java
package com.lance.rocketMQ.RocketMQ;
/**
* Created by lance on 2017/2/10.
*/
public class RocketMQConsumerTest {
public static void main(String[] args) {
String mqNameServer = "172.10.254.2:9876";
String mqTopics = "MQ-MSG-TOPICS-TEST";
String consumerMqGroupName = "CONSUMER-MQ-GROUP";
RocketMQListener mqListener = new RocketMQListener();
RocketMQConsumer mqConsumer = new RocketMQConsumer(mqListener, mqNameServer, consumerMqGroupName, mqTopics);
mqConsumer.init();
try {
Thread.sleep(1000 * 60L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
测试RocketMQ的消费 RocketMQConsumerTest.java
package com.lance.rocketMQ.RocketMQ;
/**
* Created by lance on 2017/2/10.
*/
public class RocketMQConsumerTest {
public static void main(String[] args) {
String mqNameServer = "172.10.254.2:9876";
String mqTopics = "MQ-MSG-TOPICS-TEST";
String consumerMqGroupName = "CONSUMER-MQ-GROUP";
RocketMQListener mqListener = new RocketMQListener();
RocketMQConsumer mqConsumer = new RocketMQConsumer(mqListener, mqNameServer, consumerMqGroupName, mqTopics);
mqConsumer.init();
try {
Thread.sleep(1000 * 60L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
run RocketMQConsumerTest.java 之后,控制台输出:
RocketMQConsumer Started! group=CONSUMER-MQ-GROUP instance=1eb7d308-4414-4658-90b5-e2cae3b793eb
结果分析: 此时MQ对应的TOPIC中并没有响应的消息,故收不到消息,仅看到MQ消费者正常启动信息。
MQ的生产者测试类:RocketMQProducerTest.java
package com.lance.rocketMQ.RocketMQ;
import com.alibaba.rocketmq.common.message.Message;
/**
* Created by lance on 2017/2/10.
*/
public class RocketMQProducerTest {
public static void main(String[] args) {
String mqNameServer = "172.10.254.2:9876";
String mqTopics = "MQ-MSG-TOPICS-TEST";
String producerMqGroupName = "PRODUCER-MQ-GROUP";
RocketMQProducer mqProducer = new RocketMQProducer(mqNameServer, producerMqGroupName, mqTopics);
mqProducer.init();
for (int i = 0; i < 5; i++) {
Message message = new Message();
message.setBody(("I send message to RocketMQ " + i).getBytes());
mqProducer.send(message);
}
}
}
run RocketMQProducerTest.java 之后,RocketMQProducerTest.java 对应的控制台输出为:
- messageId=0A71290100002A9F00000003D0BB0832, status=SEND_OK
- messageId=0A71290100002A9F00000003D0BB08BB, status=SEND_OK
- messageId=0A71290100002A9F00000003D0BB0944, status=SEND_OK
- messageId=0A71290100002A9F00000003D0BB09CD, status=SEND_OK
- messageId=0A71290300002A9F000000005440AEED, status=SEND_OK
结果分析:表明所有消息都已经正常发送,且被RocketMQ正常接收。
此时查看RocketMQConsumerTest.java对应的控制台输出发生改变,输出内容变更如下:
- RocketMQConsumer Started! group=CONSUMER-MQ-GROUP instance=1eb7d308-4414-4658-90b5-e2cae3b793eb
- msg data from rocketMQ:I send message to RocketMQ 1
- msg data from rocketMQ:I send message to RocketMQ 0
- msg data from rocketMQ:I send message to RocketMQ 3
- msg data from rocketMQ:I send message to RocketMQ 2
- msg data from rocketMQ:I send message to RocketMQ 4
看,简单吧!
备注:小编自己使用了Apache版本的RocketMQ(即RocketMQ 4.*),发现只需要更改import的package的路径而已,不需要修改其他代码,请参考。
RocketMQ的重复问题解决方式:
Java操作RockeMQ的更多相关文章
- Java操作Sqlite数据库-jdbc连接
Java操作Sqlite数据库步骤: 1. 导入Sqlite jdbc 本文使用sqlite-jdbc-3.7.2.jar,下载地址 http://pan.baidu.com/s/1kVHAGdD 2 ...
- 【MongoDB for Java】Java操作MongoDB
上一篇文章: http://www.cnblogs.com/hoojo/archive/2011/06/01/2066426.html介绍到了在MongoDB的控制台完成MongoDB的数据操作,通过 ...
- Java操作Oracle
public class DBCon { // 数据库驱动对象 public static final String DRIVER = "oracle.jdbc.driver.OracleD ...
- JAVA操作ORACLE数据库的存储过程
一.任务提出 JAVA操作oracle11g存储过程实验需要完成以下几个实例: 1.调用没有返回参数的过程(插入记录.更新记录) 2.有返回参数的过程 3.返回列表的过程 4.返回带分页的列表的过程. ...
- JAVA操作MongoDB数据库
1. 首先,下载MongoDB对Java支持的驱动包 驱动包下载地址:https://github.com/mongodb/mongo-java-driver/downloads 2.Java操作Mo ...
- Java操作Session与Cookie
1,Java操作Session Java操作Session非常简单,步骤如下 1.1,在servlet中通过request获取session HttpSession session = request ...
- JAVA操作COOKIE
JAVA操作COOKIE 1.设置Cookie Cookie cookie = new Cookie("key", "value"); cookie.setMa ...
- [转]MongoDB for Java】Java操作MongoDB
原文地址: MongoDB for Java]Java操作MongoDB 开发环境: System:Windows IDE:eclipse.MyEclipse 8 Database:mongoDB 开 ...
- Java操作文件夹的工具类
Java操作文件夹的工具类 import java.io.File; public class DeleteDirectory { /** * 删除单个文件 * @param fileName 要删除 ...
随机推荐
- nginx配置https及Android客户端访问自签名证书
前一篇随笔通过keytool生成keystore并为tomcat配置https,这篇随笔记录如何给nginx配置https.如果nginx已配置https,则tomcat就不需要再配置https了.通 ...
- 12 . Python3之网络编程
互联网的本质 两台计算机之间的通信与两个人打电话原理是一样的. # 1. 首先要通过各种物理连接介质连接 # 2. 找准确对方计算机(准确到软件)的位置 # 3. 通过统一的标准(一般子协议)进行数据 ...
- Rocket - diplomacy - AddressAdjuster
https://mp.weixin.qq.com/s/X0s5CWN84GEiwpNR7tiRgA 基于AddressAdjuster介绍LazyModule的实现. 参考链接:https://g ...
- Rocket - decode - Inst Decode
https://mp.weixin.qq.com/s/WvepB3yAzjMbQalO3Z82pQ 介绍RocketChip Instruction解码逻辑的实现. 1. RISC-V R ...
- 从0开始探究vue-公共变量的管理
背景 在Vue项目中,我们总会遇到一些公共数据的处理,如方法拦截,全局变量等,本文旨在解决这些问题 解决方案 事件总线 所谓事件总线,就是在当前的Vue实例之外,再创建一个Vue实例来专门进行变量传递 ...
- Java实现 LeetCode 821 字符的最短距离(暴力)
821. 字符的最短距离 给定一个字符串 S 和一个字符 C.返回一个代表字符串 S 中每个字符到字符串 S 中的字符 C 的最短距离的数组. 示例 1: 输入: S = "loveleet ...
- (Java实现) 洛谷 P1042 乒乓球
题目背景 国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及.其中1111分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役.华华就是其中一位,他 ...
- Java实现 LeetCode 671 二叉树中第二小的节点(遍历树)
671. 二叉树中第二小的节点 给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 2 或 0.如果一个节点有两个子节点的话,那么这个节点的值不大于它的子节点的值. 给出这样的 ...
- Java实现 LeetCode 207 课程表
207. 课程表 现在你总共有 n 门课需要选,记为 0 到 n-1. 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] ...
- Java实现 蓝桥杯 算法提高 成绩排序2
试题 算法提高 成绩排序2 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 给出n个学生的成绩,将这些学生按成绩排序,排序规则:总分高的在前:总分相同,数学成绩高的在前:总分与数学相 ...