1. 同步传输(可靠,适用于重要的通知消息、短信通知、短信营销系统等)

package com.miaoying.rocketmq.client;

import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendCallback;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.common.RemotingHelper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.StopWatch; import javax.annotation.PostConstruct;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit; /**
*  @Description:
*  @author miaoying
*  @date 2019/2/27
*/
@Slf4j
@Component
public class RocketMQClient {
/**
* 生产者的组名
*/
@Value("${apache.rocketmq.producer.producerGroup}")
private String producerGroup; /**
* NameServer 地址
*/
@Value("${apache.rocketmq.namesrvAddr}")
private String namesrvAddr; @PostConstruct
public void defaultMQProducer() throws InterruptedException {
DefaultMQProducer producer = new DefaultMQProducer(producerGroup);
producer.setNamesrvAddr(namesrvAddr); int messageCount = 10000;
final CountDownLatch countDownLatch = new CountDownLatch(messageCount); try {
producer.start();
producer.setRetryTimesWhenSendAsyncFailed(0); for (int i = 0; i < messageCount; i++) {
Message message = new Message("TopicMiaoAsync", "push", "keyTest", ("message" + i).getBytes(RemotingHelper.DEFAULT_CHARSET));
SendResult sendResult = producer.send(message);
log.info("MsgId = " + sendResult.getMsgId() + " , offsetMsgId = " + sendResult.getOffsetMsgId());
}
} catch (Exception e) {
e.printStackTrace();
}
countDownLatch.await(5, TimeUnit.SECONDS);
producer.shutdown();
}
}

2. 异步传输(一般用于响应时间敏感的业务场景)

package com.miaoying.rocketmq.client;

import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendCallback;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.common.RemotingHelper; import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit; @Slf4j
public class AsyncRocketMQClient { public static void main(String[] args) throws InterruptedException {
DefaultMQProducer producer = new DefaultMQProducer("Producer");
producer.setNamesrvAddr("localhost:9876"); int messageCount = 10000;
final CountDownLatch countDownLatch = new CountDownLatch(messageCount); try {
producer.start();
producer.setRetryTimesWhenSendAsyncFailed(0); for (int i = 0; i < messageCount; i++) {
Message message = new Message("TopicMiaoAsync", "push", "keyTest", ("message" + i).getBytes(RemotingHelper.DEFAULT_CHARSET));
producer.send(message, new SendCallback() {
@Override
public void onSuccess(SendResult result) {
countDownLatch.countDown();
// 对于客户端来说msgd是由客户端producer生成的,offsetMsgId是由服务端broker生成的
log.info("MsgId : " + result.getMsgId() + " , offsetMsgId : " + result.getOffsetMsgId() + " , send status : " + result.getSendStatus());
} @Override
public void onException(Throwable e) {
countDownLatch.countDown();
log.error("send message to rocketmq fail. " + e.getMessage());
}
});
}
} catch (Exception e) {
e.printStackTrace();
}
countDownLatch.await(5, TimeUnit.SECONDS);
producer.shutdown();
}
}

3. 单向传输(用于需要中等可靠性的情况,例如日志收集)

package com.miaoying.rocketmq.client;

import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendCallback;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.common.RemotingHelper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.StopWatch; import javax.annotation.PostConstruct;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit; /**
*  @Description:
*  @author miaoying
*  @date 2019/2/27
*/
@Slf4j
@Component
public class RocketMQClient {
/**
* 生产者的组名
*/
@Value("${apache.rocketmq.producer.producerGroup}")
private String producerGroup; /**
* NameServer 地址
*/
@Value("${apache.rocketmq.namesrvAddr}")
private String namesrvAddr; @PostConstruct
public void defaultMQProducer() throws InterruptedException {
DefaultMQProducer producer = new DefaultMQProducer(producerGroup);
producer.setNamesrvAddr(namesrvAddr); int messageCount = 10000;
final CountDownLatch countDownLatch = new CountDownLatch(messageCount); try {
producer.start();
producer.setRetryTimesWhenSendAsyncFailed(0); for (int i = 0; i < messageCount; i++) {
Message message = new Message("TopicMiaoAsync", "push", "keyTest", ("message" + i).getBytes(RemotingHelper.DEFAULT_CHARSET));
producer.sendOneway(message);
}
} catch (Exception e) {
e.printStackTrace();
}
countDownLatch.await(5, TimeUnit.SECONDS);
producer.shutdown();
}
}

RocketMQ源码分析:(二)消息发送的三种方式的更多相关文章

  1. 源码分析 Kafka 消息发送流程(文末附流程图)

    温馨提示:本文基于 Kafka 2.2.1 版本.本文主要是以源码的手段一步一步探究消息发送流程,如果对源码不感兴趣,可以直接跳到文末查看消息发送流程图与消息发送本地缓存存储结构. 从上文 初识 Ka ...

  2. 源码分析 Kafka 消息发送流程

    Futuresend(ProducerRecord<K, V> record) Futuresend(ProducerRecord<K, V> record, Callback ...

  3. rocketmq源码分析3-consumer消息获取

    使用rocketmq的大体消息发送过程如下: 在前面已经分析过MQ的broker接收生产者客户端发过来的消息的过程,此文主要讲述订阅者获取消息的过程,或者说broker是怎样将消息传递给消费者客户端的 ...

  4. RocketMQ 源码分析 —— Message 发送与接收

    1.概述 Producer 发送消息.主要是同步发送消息源码,涉及到 异步/Oneway发送消息,事务消息会跳过. Broker 接收消息.(存储消息在<RocketMQ 源码分析 —— Mes ...

  5. RocketMQ源码分析之从官方示例窥探:RocketMQ事务消息实现基本思想

    摘要: RocketMQ源码分析之从官方示例窥探RocketMQ事务消息实现基本思想. 在阅读本文前,若您对RocketMQ技术感兴趣,请加入RocketMQ技术交流群 RocketMQ4.3.0版本 ...

  6. 十、Spring之BeanFactory源码分析(二)

    Spring之BeanFactory源码分析(二) 前言 在前面我们简单的分析了BeanFactory的结构,ListableBeanFactory,HierarchicalBeanFactory,A ...

  7. 【RocketMQ源码分析】深入消息存储(3)

    前文回顾 CommitLog篇 --[RocketMQ源码分析]深入消息存储(1) ConsumeQueue篇 --[RocketMQ源码分析]深入消息存储(2) 前面两篇已经说过了消息如何存储到Co ...

  8. 多线程之美8一 AbstractQueuedSynchronizer源码分析<二>

    目录 AQS的源码分析 该篇主要分析AQS的ConditionObject,是AQS的内部类,实现等待通知机制. 1.条件队列 条件队列与AQS中的同步队列有所不同,结构图如下: 两者区别: 1.链表 ...

  9. 【RocketMQ源码分析】深入消息存储(2)

    前文回顾 CommitLog篇 --[RocketMQ源码分析]深入消息存储(1) MappedFile篇 --[RocketMQ源码分析]深入消息存储(3) 前文说完了一条消息如何被持久化到本地磁盘 ...

随机推荐

  1. Masonry学习札记

    Masnory学习札记 在之前的文章里有草草提到过Masonry自动布局,可这么重要第三方布局框架的怎么可以怎么随便带过呢!昨天在完成页面的时候刚好遇到了被Masorny功能惊叹的部分,所以趁热打铁写 ...

  2. sublime text 3 ,React,html元素自动补全方法(用Emmet写法写jsx中的html)

    1. 安装emmet: Preferences -> Package Control -> Install Package -> emmet 2. 配置emmet: Preferen ...

  3. tnsping无法ping通的问题,TNS-12535 TNS操作超时 (服务器环境:window server 2008R2 数据库环境:oracle 11 g)

    今天新搭建一个测试用的数据库服务器,操作系统为WIN server 2008 r2 版本.系统内已安装oracle 11g database,数据库服务端已配置完毕,监听listener已开启. 我在 ...

  4. 理解java容器:iterator与collection,容器的起源

    关于容器 iterator与collection:容器的起源 iterator的简要介绍 iterable<T> iterator<T> 关于remove方法 Collecti ...

  5. github上传代码返回403错误

    报错代码: ****************   表示上传的项目地址 remote: Permission to Jayson00/camera.git denied to Minelinkinpar ...

  6. 【python】闭包

    一.闭包满足的条件 闭包 = 内部函数 + 定义函数的环境 条件一 : 内部函数 条件二: 外部环境的变量 二.实战 def outer(): x = 10 y = 20 def inner(): p ...

  7. EBS WEBADI无法创建文档

    有些小伙伴在使用WEBADI时,下载模板之后会发现模板创建文档一直没有成功(没有报错,只是单纯的没有创建出文档),可以参考: http://blog.csdn.net/cyco008/article/ ...

  8. redis scan删除key的方法封装

    /** * @desc 迭代式的删除redis key * 用法: * $redis = BaseService::S()->getRedisConfig(\Yii::$app->redi ...

  9. Java面试问题汇总

    转一些面试经验 刚看到下面这份面试清单,从个人的开发面试经历看,里面总结的大部分内容还是很不错的.年后想跳槽的朋友可以选取里面的问题准备一下. GitHub上的面试总结帖 Interview-Note ...

  10. 廖雪峰Git入门教程

    廖雪峰Git入门教程  2018-05-24 23:05:11     0     0     0 https://www.liaoxuefeng.com/wiki/00137395163059296 ...