RocketMQ集群解决方案----JAVA应用

RocketMQ入坑指南(二):JAVA接入RocketMQ 阅读详情

       上篇文章 RocketMQ集群解决方案 已经讲解了RocketMQ应用场景及性能、RocketMQ网络部署图、实际集群部署操作步骤(采用多Master多Slave,异步复制集群模式进行部署),这篇文章将讲解JAVA应用中怎么实际调用搭建的RocketMQ集群环境。
     一、先搭建两个JAVA  WEB工程,一个是消息生产者工程ProducerProject,另外是一个消息消费者工程ConsumerProject
     二、然后导入RocketMQ的所需要JAR包(rocketmq-client-3.2.6.jar,rocketmq-common-3.2.6.jar,rocketmq-remoting-3.2.6.jar),点击此链接进行下载
    三、在ProducerProject 创建一个发送消息的工具类,用来向RocketMQ发送消息,代码如下:
    
package com.cluster.mq;


import java.io.UnsupportedEncodingException;


import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;


import com.alibaba.rocketmq.client.exception.MQBrokerException;
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;
import com.alibaba.rocketmq.remoting.exception.RemotingException;
/**
 * RocketMQ生产者类
 * @author pengtian
 *
 */
public class RocketMqProducer {
private static Log log = LogFactory.getLog(RocketMqProducer.class);
static DefaultMQProducer producer = null;
private static final Object obj = new Object();

/**
* 系统一启动,就启动运行生产者
*/
static {
if (producer == null) {
synchronized (obj) {
if (producer == null) {
try {
producer = new DefaultMQProducer("myProducer");
//producer.setNamesrvAddr(SystemGlobals.getProperties("nameServiceAddr"));// 连接MQ服务器地址
producer.setNamesrvAddr("rocketmq-nameserver1:9876;rocketmq-nameserver2:9876;rocketmq-nameserver3:9876;rocketmq-nameserver4:9876");// 连接MQ服务器地址;192.168.113.134:9876

producer.start();
} catch (MQClientException e) {
log.error("MQ producer初始化异常");
e.printStackTrace();
}
}
}
}
}


/**
* 发送MQ消息
* @param xml,String MQ消息
* @param topic,String MQ消息主题
* @param tags,String MQ消息标志
* @return
* @throws Exception
*/
public static boolean sendMessage(String xml, String topic, String tags)throws Exception {
// 以注册为例,Message中参数为 Topic ; 注册为memberRegister; 这两个参数必须与收消息方共同定义好,现在用户注册
// 为Topic,memberRegister,新的再加定义
SendResult sendResult = null;
try {

Message msg = new Message(topic, tags, xml.getBytes("UTF-8"));
msg.setKeys("KEYS_"+System.currentTimeMillis());
sendResult = producer.send(msg);
log.info("MSG_ID:"+sendResult.getMsgId()+",SendStatus:"+sendResult.getSendStatus());
   //producer.shutdown();
return true;
} catch (UnsupportedEncodingException e) {
log.error("发送消息到mq不支持的编码异常--->");
e.printStackTrace();
} catch (MQClientException e) {
log.error("发送消息到mq MQ客户端异常--->");
e.printStackTrace();
} catch (RemotingException e) {
log.error("发送消息到mq Remoting异常--->");
e.printStackTrace();
} catch (MQBrokerException e) {
log.error("发送消息到mq MQBroker异常--->");
e.printStackTrace();
} catch (Exception e) {
log.error("发送消息到mq未知异常--->");
e.printStackTrace();
}
return false;
}

public static void main(String[] args) {
for(int i=1;i<100;i++){
// 消息的内容
StringBuffer xml = new StringBuffer("");
xml.append("<REQUEST id='mqMsg'>");
xml.append("<VERSION>1.1</VERSION>");
xml.append("<DDH>DD_1231eqwe123</DDH>");
xml.append("</REQUEST>");
String message = xml.toString();
try {
sendMessage(message, "Topic", "MY_TEST_01");
} catch (Exception e) {
e.printStackTrace();
}
}
}






}
   四、在ConsumerProject工程配置消费RocketMQ队列中的消息,需要和Spring进行集成:
     1、先创建RocketMQ 消费工具类,代码如下:
package com.cluster.mq;


import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;


import com.alibaba.rocketmq.client.consumer.DefaultMQPushConsumer;
import com.alibaba.rocketmq.client.exception.MQClientException;
import com.alibaba.rocketmq.common.consumer.ConsumeFromWhere;
import com.alibaba.rocketmq.common.protocol.heartbeat.MessageModel;
import com.cluster.util.SystemGlobals;


/**
 * RocketMq消费者
 * @author pengtian
 *
 */
public class RocketMqConsumers {

private static final Logger log = Logger.getLogger(RocketMqConsumers.class);
private DefaultMQPushConsumer consumer;
private static final String namesrvAddr = "rocketmq-nameserver1:9876;rocketmq-nameserver2:9876;rocketmq-nameserver3:9876;rocketmq-nameserver4:9876";
       private static final String consumerGroup = "myProducer";private static final String topicName = "Topic";

       private static final String tagsName = "MY_TEST_01||mytest";//代表获取Tags为MY_TEST_01、mytest的消息

       private static final int consumeThreadMin = 3;

       private static final int consumeThreadMax = 5;

@Autowiredprivate 

MsgListenerConcurrently msgListenerConcurrently;

/** * Spring bean init-method */

public void init() throws MQClientException {

try {

 // 参数信息log.info("DefaultMQPushConsumer初始化!");

 log.info("consumerGroup:"+consumerGroup);

 log.info("namesrvAddr:"+namesrvAddr);

 log.info("topicName:"+topicName);

 log.info("tagsName:"+tagsName);

// 一个应用创建一个Consumer,由应用来维护此对象,可以设置为全局对象或者单例<br>// 注意:ConsumerGroupName需要由应用来保证唯一

consumer = new DefaultMQPushConsumer(consumerGroup);

consumer.setNamesrvAddr(namesrvAddr);

consumer.setInstanceName(String.valueOf(System.currentTimeMillis()));// 订阅指定topic下tags等于tag

consumer.subscribe(topicName, tagsName);

//MessageModel.CLUSTERING 集群消费 :只能有一个消费者消费一次 ,MessageModel.BROADCASTING 广播模式 所有的消费者都会消费一次

consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);

consumer.setMessageModel(MessageModel.CLUSTERING);

consumer.registerMessageListener(msgListenerConcurrently);

consumer.setConsumeThreadMin(consumeThreadMin);

consumer.setConsumeThreadMax(consumeThreadMax);

consumer.start();log.info("DefaultMQPushConsumer初始化成功!");

} catch (Exception ex) {

       log.error("DefaultMQPushConsumer初始化异常=" + ex.getMessage());ex.printStackTrace();

}

}

/** * Spring bean destroy-method */

public void destory() {

   consumer.shutdown();

}

/** * @param args */

public static void main(String[] args) {

  / / TODO Auto-generated method stub

}

}
package com.cluster.mq;


import java.util.List;
import java.util.Map;


import org.apache.log4j.Logger;


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 com.bwdz.fpt.common.xml.XmlUtil;


/**
 * PushConsumer回调Listener方法
 * 
 */
@SuppressWarnings("unchecked")
public class MsgListenerConcurrently implements MessageListenerConcurrently {


private static final Logger log = Logger
.getLogger(MsgListenerConcurrently.class);




public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,
ConsumeConcurrentlyContext context) {
for (MessageExt msg : msgs) {
String body = "";
String tags = msg.getTags();
String topic = msg.getTopic();
log.info("【tags:"+tags+",topic:"+topic+"】");
try {
body = new String(msg.getBody(), "UTF-8");
System.out.println("【MSG:"+body+"】");
//Map map = XmlUtil.Dom2Map(body);
if("topic".equals(topic)&&"A".equals(tags)){
System.out.println("A===============");
}else if("topic".equals(topic)&&"B".equals(tags)){
System.out.println("B===============");
}
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
} catch (Exception e) {
String delay = msg.getProperty("DELAY");
if (delay != null && Integer.parseInt(delay) > 4) {// 重试次数超过3次丢弃此条消息
log.warn("消息重试次数过多,不再消费:" + body);
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
log.error("mq消息消费异常,本条消息是:" + body);
e.printStackTrace();
}
}
return ConsumeConcurrentlyStatus.RECONSUME_LATER;
}


}




   2、将上面创建的RocketMQ消费者工具类集成到Spring中,在spring配置文件中进行如下配置:
    
    <!-- 消息消费者Consumer -->
    <bean id="msgListenerConcurrently" class="com.cluster.mq.MsgListenerConcurrently" scope="singleton">
    </bean>
    <!-- 消息消费者Consumer -->
    <bean class="com.cluster.mq.RocketMqConsumers" init-method="init" destroy-method="destory" scope="singleton" />



五、接下是检验成败的时候了
   1、先启动好RocketMQ集群(具体请查看 RocketMQ集群解决方案),然后启动好ConsumerProject
   2、单元运行ProducerProject工程 RocketMqProducer.java Main函数,执行后,ProducerProject工程控制台打印如下信息,说明通讯正常,然后再查看ConsumerProject就会收到发送的报文信息。
16-11-24 14:06:18  INFO RocketMqProducer:63 - MSG_ID:C0A8718A00002A9F000000000000EC08,SendStatus:SEND_OK
16-11-24 14:06:18  INFO RocketMqProducer:63 - MSG_ID:C0A8718A00002A9F000000000000EEEA,SendStatus:SEND_OK
16-11-24 14:06:18  INFO RocketMqProducer:63 - MSG_ID:C0A8718A00002A9F000000000000F1CC,SendStatus:SEND_OK
16-11-24 14:06:18  INFO RocketMqProducer:63 - MSG_ID:C0A8718A00002A9F000000000000F4AE,SendStatus:SEND_OK
16-11-24 14:06:18  INFO RocketMqProducer:63 - MSG_ID:C0A8718A00002A9F000000000000F790,SendStatus:SEND_OK



        
Rocket MQ 使用Java 发送接收消息 Java 使用 RocketMQ 简单demo 阅读详情

相关推荐

追求极致性能,RocketMQ 消息通信详解

上面介绍了 RocketMQ 消息通信的主要内容,我们用几句话总结下:整个 RocketMQ 队列系统中,rocketmq-remoting Module 是专门用来负责网络通信职能的。网络通信模块基于 Netty 进行扩展的,所以自定义了 RocketMQ 的消息协议,在传输过程的数据进行结构制定、封装、编解码的过程。

Q54665642ljf的博客 1179

JAVA使用rocketmq-client整合RocketMQ

前言 理论部分请前往这个专题的其他文章查看,本文接RocketMQ消息类型文章,本文使用rocketmq-client操作RocketMQ发送接受各种消息的案例! 依赖 <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-client</artifactId> </dependenc

程序员劝退师的博客 8883

Java之RocketMQ详解

Java之RocketMQ详解

每天进步一点点... 1万+

rocketmq-client-java 5.x PushConsumer

rocketmq-client-java 5.x PushConsumer

Confused_Tom_Cat的博客 1631

三台服务器部署RocketMQ集群的详细步骤

在各台服务器上分别启动配置的 Broker:(启动Broker时,推荐的顺序是先启动Master,再启动Slave。虽然从技术上讲,启动顺序不严格,但这种顺序可以确保在启动过程中尽可能避免问题。至此,RocketMQ 集群的搭建完成。确保所有三台服务器都已安装1.8以上版本的JDK,并配置环境变量。这些命令将停止所有相关的RocketMQ服务进程。检查内存使用情况,确保调整后的内存配置生效。确保按照上述步骤配置存储路径时使用。在所有三台服务器上找到并编辑。在所有三台服务器上找到并编辑。

u011197085的博客 2405

RocketMQ-RocketMQ快速实战及集群原理

​ MQ:MessageQueue,消息队列。是在互联网中使用非常广泛的一系列服务中间件。这个词可以分两个部分来看,一是Message消息。消息是在不同进程之间传递的数据。这些进程可以部署在同一台机器上,也可以分布在不同机器上。二是Queue队列。队列原意是指一种具有FIFO(先进先出)特性的数据结构,是用来缓存数据的。对于消息中间件产品来说,能不能保证FIFO特性,尚值得考量。但是,所有消息队列都是需要具备存储消息,让消息排队的能力。

weixin_43874650的博客 1184

RocketMQ集群部署与快速入门全解密:从原理到实战,万字干货吃透消息中间件

本文全面介绍了Apache RocketMQ分布式消息队列的集群部署与开发实践。首先解析了RocketMQ核心组件(NameServer、Broker、Producer、Consumer)和关键术语,详细说明了多Master多Slave集群架构模式。然后通过Linux环境下的实战演示,从JDK安装、RocketMQ部署到集群配置,完整展示了3Master+3Slave同步双写集群的搭建过程。文章还提供了Java客户端开发示例,包括同步/异步消息发送、集群消费模式实现,并深入讲解了事务消息机制。

果酱 の 博客 493

rocketMQ所需jar包.zip

rocketMQ所需jar包.zip

ACE-架构师-RocketMQ(上下集)

课程目标 培养高级Java工程师成为架构师的高端课程,学习主流互联网应用技术,学习应用架构设计。 课程目录 1001_RocketMQ_简介[免费观看]17:13 2002_RocketMQ_核心概念详解[免费观看]36:44 3003_RocketMQ_集群构建模型详解(一)27:47 4004_RocketMQ_集群构建模型详解(二)23:36 5005_RocketMQ_双主模式集群环境...

kkwant的博客 285

项目方案:社会视频资源整合接入汇聚系统解决方案(五)

视频监控接入和视频汇聚平台,形成整合平台,平台服务层包括编码设备、存储设备、解码设备等的接入服务,提供基础视频服务、传输服务、存储服务、控制服务及事件服务。两种不同的接入方式:监控设备接入,是指接入社会单位视频监控系统的DVR(数字硬盘录像机)、DVS和IPC、DVR/NVR、CVR等设备;平台对接,是指对接接入社会单位数字视频监控平台。AS-VAG视频监控接入网关支持onvif、国标等接入,也支持多种SDK接入方式,包括国产的主流品牌支持海康、大华、宇视、华为等SDK,国际品牌支持松下和axis等SDK。

weixin_70208651的博客 2464

物联网低功耗广域网NB-IoT开发(一):初识NB-IoT

(二)NB-IoT的关键特性: (三)NB-IoT的应用场景: 二、NB-IOT介绍

weixin_49763156的博客 853

RocketMQ相关知识点

消息队列的优缺点,以及使用场景? 如何保证消息不被重复消费? 由于网络波动的原因,无法保证生产消息和消费消息时的重复,所以只能保证消息的幂等性。 如何保证消息不丢失

Linging_24的博客 786

BUUCTF--[OGeek2019]babyrop

才学习了基本的ROP流程,到处找题练,不过也没做出来几道题,以这道32位的题作为例题吧。 这道题是BUUCTF上pwn练习题里的[OGeek2019]babyrop。 代码审计 老规矩先checksec一下: 没有canary保护,nx保护开启排除shellcode可能性,FULL RELEO为地址随机化。 观察主函数,先设定了一个闹铃,到时间就会强制退出程序,解除闹铃的方法在上一篇博客中提到过了, 这道题中闹铃函数依然对我们解题起不到什么干扰作用。 主函数的思路大概是:生成一个随机数,把这个随机数作为

N1rvana的博客 6005

RocketMQ集群部署

RocketMQ是一款非常优秀的消息中间件,运用的场景也是非常丰富,且在各大公司运用中也非常广泛。但是它是如何进行部署的呢,以及它的高可用是如何实现的呢。那么就由我来为大家讲解一哈RocketMQ是如何进行部署的,后续会讲解底层架构设计。linux环境、JDK、RocketMQ环境包1.jdk 官方下载地址 Java Archive | Oracle2.RocketMQ 官方下载地址 Downloading the Apache RocketMQ Releases - Apache RocketMQ 3.这

wangqingjia的博客 1万+

PCB设计之ODB++文件格式详解

ODB++(Open Database++)是一种广泛应用于PCB(印制电路板)设计和制造领域的开放数据交换格式。它由Valor Computerized Systems(现为Siemens EDA的一部分)开发,旨在替代传统的Gerber文件格式,提供更完整、结构化的制造数据,从而优化PCB设计到生产的流程。ODB++通过结构化数据整合了PCB设计到制造的全流程信息,显著提高了生产效率和准确性。尽管存在一定的兼容性挑战,但其在复杂项目和高可靠性场景中的价值不可替代。

ZZcppc的博客 1万+

Sony微单相机alpha6000 wifi远程控制(1)

引言 Sony’s Camera Remote API beta SDK allows you to control a number of Sony cameras, including Sony Action cams, Sony Alpha cameras and Lens Style cameras, wirelessly from another device. 索尼于2017年三月Re...

markfuk996的博客 4965

RocketMQ实战与集群架构详解

RocketMQ是阿里巴巴开源的一个消息中间件,在阿里内部历经了双十一等很多高并发场景的考验,能够处理亿万级别的消息。2016年开源后捐赠给Apache,现在是Apache的一个顶级项目。 早期阿里使用ActiveMQ,但是,当消息开始逐渐增多后,ActiveMQ的IO性能很快达到了瓶颈。于是,阿里开始关注Kafka。但是Kafka是针对日志收集场景设计的,它的高级功能并不是很贴合阿里的业务场景。尤其当它的Topic过多时,由于Partition文件也会过多,这就会加大文件索

qq_45061342的博客 2959

动作识别(三)Win10复现OpenPose1.7.0+ST-GCN代码

动作识别(三)Win10复现OpenPose1.7.0+ST-GCN代码1.Win10系统配置OpenPose1.7.0的Python API 本人最近在研究基于骨架的动作识别方法,有幸看到端到端的ST-GCN算法,于是决定自己复现一下。(具体原理这里不介绍,大家自行查阅,比如Openpose是个啥?ST-GCN又是个啥?) 1.Win10系统配置OpenPose1.7.0的Python API 安装步骤: (1) ...

QIANFANGshiwo的博客 3040

k8s 部署rocketmq集群

kubernetes k8s mq rocketmq rocketmq-dashboard 灵活调整 部署在 k8s 集群中的 rocketmq 集群副本数

weixin_44770684的博客 9458

如何利用东南大学齿轮箱数据集进行故障诊断?从数据采集到模型训练全流程解析

本文详细解析如何利用东南大学齿轮箱数据集进行故障诊断,涵盖从数据采集到模型训练的全流程。通过信号预处理、特征工程构建及多种机器学习模型对比,帮助开发者高效实现工业设备健康管理。特别适合希望将AI技术应用于工业场景的Python开发者。

m2n3b4v5c6的博客 376

vue3+element-plus - 最新详细实现将表格Table组件 “所见所得导出“ 为excel(xls/xlsx)电子表格文件,表格中的图片图像、图标等媒体资源完美导出显示(详细示例代码)

vue3,nuxt3,element plus,表格组件,Table,el-table,导出,下载,excel,电子工作簿,xls,xlsx,将表格导出成xls,如何把表格原封不动的导出成excel,保留图片,带图片,图标,如何导出包括含有图片的Excel表格,图片和表格数据导出excel,把表格导出成excel格式,表格内的图片一起导出,vue3导出图片和数据到Excel,可导出图片,导出图像到Excel,网页上的图片怎么能导出到xls表格中,显示图片url链接,图片太多导出失败,图片会超出单元格,图片不

✅ 精选推荐文章 4766

RocketMQ集群搭建,及RocketMQ-Dashboard部署(前RocketMQ-Console)

RocketMQ不支持单主机搭建主从结构集群,当从节点启动时,即使和主节点设置不同的监听端口,他也要去监听主节点端口,也就是说正常启动的从节点会监听四个端口。原因未知,现象后面会列举出来。

dxh9231028的博客 2523

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

RocketMQ集群搭建(最详细)

然后他对应的slave在192.168.106.129上,修改work2上的 conf/2m-2s-async/broker-b-s.properties。本次搭建一个2主2从异步刷盘的集群,所以我们会使用conf/2m-2s-async下的配 置文件。启动就比较简单了,直接调用bin目录下的脚本就行。上,所以需要配置worker3上的conf/2m-2s-async/broker-b.properties。所以修改的配置文件是进入rocketmq的conf目录下修改2m-2s-async的配置文件。

m0_64473908的博客 2277

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

RocketMQ集群搭建详解

文章目录1、机器环境2、创建用户3、系统配置免密登录关闭防火墙4、安装java5、安装RocketMQ6、配置RocketMQ集群1、配置第一组broker-a7、启动RocketMQ1、先启动nameServer。2、再启动broker3、启动状态检查4、测试mqadmin管理工具**Topic相关**:**集群相关****Broker相关****消息相关****消费者和消费者组相关**连接相关其他5、命令行快速验证8、搭建管理控制台Dleger高可用集群搭建搭建方法9、调整系统参数1、配置RocketM

roykingw的专栏 1278

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

搭建RocketMQ集群-详细版

RocketMQ集群搭建详细流程

weixin_42544499的博客 1570

RocketMQ集群搭建

目录1 RocketMQ集群分类2 RocketMQ集群特征3 rocketmq-console集群监控平台搭建 1 RocketMQ集群分类 单机 一个broker提供服务(宕机后服务瘫痪) 集群 多个broker提供服务(单机宕机后消息无法及时被消费) 多个master多个slave master到slave消息同步方式为同步(较异步方式性能略低,消息无延迟) master到slave消息同步方式为异步(较同步方式性能略高,数据略有延迟) [外链图片转存失败,源站可能有防盗链

赵广陆 823
上一篇: RocketMQ集群解决方案
下一篇: Redis集群方案
aspnetandjava
博客等级 码龄16年 43粉丝 42原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值