• JAVA操作rocketmq:

1.导入rocketmq所需要的依赖:

    <dependency>
<groupId>com.alibaba.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>3.0.10</version>
</dependency>
<dependency>
<groupId>com.alibaba.rocketmq</groupId>
<artifactId>rocketmq-all</artifactId>
<version>3.0.10</version>
<type>pom</type>
</dependency>

2.创建生产者

package com.example.producer;

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.common.message.Message; public class Producer {
public static void main(String[] args) throws MQClientException {
DefaultMQProducer producer = new DefaultMQProducer("producer-group");
producer.setNamesrvAddr("192.168.31.165:9876;192.168.31.144:9876");
producer.setInstanceName("producer");
producer.start();
try {
for (int i = 0; i < 10; i++) {
// Thread.sleep(1000); // 每秒发送一次MQ
Message msg = new Message("producer-topic", // topic 主题名称
"msg", // pull 临时值 在消费者消费的时候 可以根据msg类型进行消费
("pushmsg-" + i).getBytes()// body 内容
);
SendResult sendResult = producer.send(msg);
System.out.println(sendResult.toString());
}
} catch (Exception e) {
e.printStackTrace();
}
producer.shutdown();
} }

3.创建消费者

package com.example.consumer;

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.client.exception.MQClientException;
import com.alibaba.rocketmq.common.message.MessageExt; public class Consumer {
public static void main(String[] args) throws MQClientException {
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("consumer-group"); consumer.setNamesrvAddr("192.168.31.165:9876;192.168.31.144:9876");
consumer.setInstanceName("consumer");
consumer.subscribe("producer-topic", "msg");//此处是根据Message对象的参数来获取 consumer.registerMessageListener(new MessageListenerConcurrently() {
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
for (MessageExt msg : msgs) {
System.out.println("消息id:"+msg.getMsgId() + "---" + new String(msg.getBody()));
}
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
consumer.start();
} }

4.运行结果:

生产者运行结果:

消费者运行结果:

  • rocetmq幂等性问题:

在Activemq中 jms规范支持两种消息模型:点对点和发布订阅,在rocketmq中 有两种消费模式:广播消费,和集群消费。

在消费的过程中,如果消费者出现异常或者超时,导致mq没有及时的相应消费的状态,则可能让mq重试,重试机制就有可能导致出现幂等性,而rocketmq的幂等性 只会出现在集群消费(类似activemq中的点对点消息模型)

生产者:

package com.example.producer;

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.common.message.Message; public class Producer {
public static void main(String[] args) throws MQClientException {
DefaultMQProducer producer = new DefaultMQProducer("producer-group");
producer.setNamesrvAddr("192.168.31.169:9876;192.168.31.177:9876");
producer.setInstanceName("producer");
producer.start();
try {
for (int i = 0; i < 10; i++) {
Message msg = new Message("topic", // topic 主题名称
"msg", // pull 临时值 在消费者消费的时候 可以根据msg类型进行消费
(i + "条消息").getBytes()// body 内容
);
SendResult sendResult = producer.send(msg);
System.out.println(sendResult.toString());
}
} catch (Exception e) {
e.printStackTrace();
}
producer.shutdown();
} }

消费者:

package com.example.consumer;

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.client.exception.MQClientException;
import com.alibaba.rocketmq.common.message.MessageExt; public class Consumer {
public static void main(String[] args) throws MQClientException {
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("consumer-group"); consumer.setNamesrvAddr("192.168.31.169:9876;192.168.31.177:9876");
consumer.setInstanceName("consumer");
consumer.subscribe("topic1", "msg"); consumer.registerMessageListener(new MessageListenerConcurrently() {
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
for (MessageExt msg : msgs) {
System.out.println("消息id:" + msg.getMsgId() + "---" + new String(msg.getBody()));
}
// 超时的情况 或者程序异常
int i = 2 / 0;
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
consumer.start();
} }

消费结果:

消息id:C0A81FB100002A9F00000000000268EC---5条消息
消息id:C0A81FB100002A9F000000000002686E---4条消息
消息id:C0A81FA900002A9F0000000000037E6A---1条消息
消息id:C0A81FB100002A9F000000000002696A---6条消息
消息id:C0A81FB100002A9F00000000000269E8---7条消息
消息id:C0A81FA900002A9F0000000000038062---9条消息
消息id:C0A81FA900002A9F0000000000037EE8---2条消息
消息id:C0A81FA900002A9F0000000000037FE4---8条消息
消息id:C0A81FA900002A9F0000000000037F66---3条消息
消息id:C0A81FA900002A9F0000000000037DEC---0条消息
消息id:C0A81FA900002A9F0000000000038704---1条消息
消息id:C0A81FA900002A9F000000000003880C---9条消息
消息id:C0A81FA900002A9F0000000000038914---2条消息
消息id:C0A81FA900002A9F0000000000038A1C---0条消息
消息id:C0A81FA900002A9F0000000000038B24---3条消息
消息id:C0A81FA900002A9F0000000000038C2C---8条消息
消息id:C0A81FB100002A9F0000000000026E7E---4条消息
消息id:C0A81FB100002A9F0000000000026F86---7条消息
消息id:C0A81FB100002A9F0000000000027196---5条消息
消息id:C0A81FB100002A9F000000000002708E---6条消息

在Activimq中,可以通过消息id 来作为全局变量,检测是不是重复消费。但是在rocketmq中消费重试的结果中,任意选出两条相同的消息,可以看出 重试的时候消息id是不同的,此时在用消息id作为全局变量判断是否重复消费显然是不可能的。rocketmq中提供了一个消息的key,可以将业务id作为该key。例如:订单号什么的。可以将消息设置的key 在第一次消费的时候存放到数据库之中

幂等性消费者:

package com.example.consumer;

import java.util.HashMap;
import java.util.List;
import java.util.Map; 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; public class Consumer {
public static Map<String, String> map = new HashMap<String, String>();// 模拟内存,实际情况可以将key放在redis之中 public static void main(String[] args) throws MQClientException {
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("consumer-group");
consumer.setNamesrvAddr("192.168.31.169:9876;192.168.31.177:9876");
consumer.setInstanceName("consumer");
consumer.subscribe("topic1", "msg"); consumer.registerMessageListener(new MessageListenerConcurrently() {
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
for (MessageExt msg : msgs) {
if (!map.containsKey(msg.getKeys())) {
// 如果此时的业务逻辑是将收到的消息存放到数据库
System.out.println("消息id:" + msg.getMsgId() + "---" + new String(msg.getBody()));
map.put(msg.getKeys(), new String(msg.getBody()));
} else {
System.out.println("重复消费");
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
}
// 超时的情况 或者程序异常
int i = 2 / 0;
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
consumer.start();
} }

rocketmq(三 java操作rocket API, rocketmq 幂等性)的更多相关文章

  1. 利用 Java 操作 Jenkins API 实现对 Jenkins 的控制详解

    本文转载自利用 Java 操作 Jenkins API 实现对 Jenkins 的控制详解 导语 由于最近工作需要利用 Jenkins 远程 API 操作 Jenkins 来完成一些列操作,就抽空研究 ...

  2. Elasticsearch Java Rest Client API 整理总结 (三)——Building Queries

    目录 上篇回顾 Building Queries 匹配所有的查询 全文查询 Full Text Queries 什么是全文查询? Match 全文查询 API 列表 基于词项的查询 Term Term ...

  3. Java操作mongoDB2.6的常见API使用方法

    对于mongoDB而言,学习方式和学习关系型数据库差不太多 開始都是学习怎样insert.find.update.remove,然后就是分页.排序.索引,再接着就是主从复制.副本集.分片等等 最后就是 ...

  4. zookeeper(三):java操作zookeeper

    引入jar包 首先要使用java操作zookeeper,zookeeper的javaclient 使我们更轻松的去对zookeeper进行各种操作,我们引入zookeeper-3.4.5.jar 和 ...

  5. Java 8 集合之流式(Streams)操作, Streams API 详解

    因为当时公司的业务需要对集合进行各种各样的业务逻辑操作,为了提高性能,就用到了这个东西,因为以往我们以前用集合都是需要去遍历(串行),所以效率和性能都不是特别的好,而Streams就可以使用并行的方式 ...

  6. Java 8 Stream Api 中的 peek 操作

    1. 前言 我在Java8 Stream API 详细使用指南[1] 中讲述了 [Java 8 Stream API]( "Java 8 Stream API") 中 map 操作 ...

  7. HBase的java操作,最新API。(查询指定行、列、插入数据等)

    关于HBase环境搭建和HBase的原理架构,请见笔者相关博客. 1.HBase对java有着较优秀的支持,本文将介绍如何使用java操作Hbase. 首先是pom依赖: <dependency ...

  8. Java操作Jxl实现数据交互。三部曲——《第三篇》

    Java操作Jxl实现上传文本文件实现转PDF格式在线预览. 本文实现背景Web项目:前台用的框架是Easyui+Bootstrap结合使用,需要引入相应的Js.Css文件.页面:Jsp.拦截请求:S ...

  9. hadoop学习(三)HDFS常用命令以及java操作HDFS

    一.HDFS的常用命令 1.查看根目录下的信息:./hadoop dfs -ls 2.查看根目录下的in目录中的内容:./hadoop dfs -ls in或者./hadoop dfs -ls ./i ...

随机推荐

  1. 将一个float型转化为内存存储格式的步骤

    将一个float型转化为内存存储格式的步骤为: (1)先将这个实数的绝对值化为二进制格式. (2)将这个二进制格式实数的小数点左移或右移n位,直到小数点移动到第一个有效数字的右边. (3)从小数点右边 ...

  2. 怎么在Mac上安装Tomcat 7[转载]

    本文来自http://wolfpaulus.com/journal/mac/tomcat7,谢谢Wolf Paulus 的分享 Tomcat 7 是Apache发布的第一款可以支持Servlet 3. ...

  3. ENVI5.3 影像重采样 和 tiff 保存

    输入---之前用envi4.5处理后的2013分类影像---输出重采样的影像 直接在工具栏搜索 resize data---出来对话框, 这里有几种方法----sample line 指的行列号,可以 ...

  4. Image & Raw Image的区别

    一.面板参数 1.Image类型: Source Image:图片资源(sprite) Color:颜色 Material:材质 Raycast Target :是否作为射线目标 Sprite 2D: ...

  5. 【软件安装与环境配置】ubuntu16.04+caffe+nvidia+CUDA+cuDNN安装配置

    前言 博主想使用caffe框架进行深度学习相关网络的训练和测试,刚开始做,特此记录学习过程. 环境配置方面,博主以为最容易卡壳的是GPU的NVIDIA驱动的安装和CUDA的安装,前者尝试的都要吐了,可 ...

  6. 微信小程序之点击列表的item带参数跳转界面

    1.在js文件里写个界面跳转的事件处理函数gotableinfo,var index = parseInt(e.currentTarget.dataset.index); 为获取当前点击列表的下脚标, ...

  7. JavaScript权威指南--数组Array

    什么是数组 数组是值的有序集合.每一个值叫做元素,每一个元素在数组中有一个位置,用数字表示,称为索引.js数组是无类型的.动态的,也可能是稀疏的.每个数组都有length属性.数组最大能容纳42949 ...

  8. 30天代码day1Data Types

    Primitive Data Types Java has 8 primitive data types: byte, short, int, long, float, double, boolean ...

  9. 设计简单的VB程序

    1.模拟对话程序 [程序源码] Option Explicit Private Sub Command1_Click() Text2.Text = "" Text1.Text = ...

  10. linux磁盘分区笔记

    磁盘基本概念: 硬盘结构:盘片+磁头(盘片可以有多个),工作时盘片高速运转,磁头读取数据 U盘.SSD固态硬盘是用闪存来制作的设备,没有盘片和磁头 Linux磁盘文件名: Linux所有设备都抽象为文 ...