返回顶部
首页 > 资讯 > 精选 >如何使用RocketMQTemplate发送带tags的消息
  • 815
分享到

如何使用RocketMQTemplate发送带tags的消息

2023-06-20 13:06:27 815人浏览 薄情痞子
摘要

这篇文章将为大家详细讲解有关如何使用RocketMQTemplate发送带tags的消息,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。RocketMQTemplate发送带tags的消息RocketMQt

这篇文章将为大家详细讲解有关如何使用RocketMQTemplate发送带tags的消息,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

RocketMQTemplate发送带tags的消息

RocketMQtemplate是RocketMQ集成到spring cloud之后提供的个方便发送消息的模板类,它是基本spring 的消息机制实现的,对外只提供了Spring抽象出来的消息发送接口。

在单独使用RocketMQ的时候,发送消息使用的Message是‘org.apache.rocketmq.common.message'包下面的Message,而使用RocketMQTemplate发送消息时,使用的Message是org.springframework.messaging的Message,猛一看,没办法发送带tags的消息了,其实在RocketMQ集成的时候已经解决了这个问题。

在RocketMQTemplate发送消息时,调用的方法是:

public SendResult syncSendOrderly(String destination, Message<?> message, String hashKey, long timeout) {        if (Objects.isNull(message) || Objects.isNull(message.getPayload())) {            log.error("syncSendOrderly failed. destination:{}, message is null ", destination);            throw new IllegalArgumentException("`message` and `message.payload` cannot be null");        }        try {            long now = System.currentTimeMillis();          //在这里对消息进行了转化,将Spring的message转化为rocketmq自己的message            org.apache.rocketmq.common.message.Message rocketMsg = RocketMQUtil.convertToRocketMessage(objectMapper,                charset, destination, message);            SendResult sendResult = producer.send(rocketMsg, messageQueueSelector, hashKey, timeout);            long costTime = System.currentTimeMillis() - now;            log.debug("send message cost: {} ms, msgId:{}", costTime, sendResult.getMsgId());            return sendResult;        } catch (Exception e) {            log.error("syncSendOrderly failed. destination:{}, message:{} ", destination, message);            throw new MessagingException(e.getMessage(), e);        }    }

在上面的代码中,对消息进行了转化,将Spring的message转化为rocketmq自己的message,在RocketMQUtil.convertToRocketMessage方法中有个地方就是获取tags的:

String[] tempArr = destination.split(":", 2);        String topic = tempArr[0];        String tags = "";        if (tempArr.length > 1) {            tags = tempArr[1];        }

所以,在发送消息的时候,我们只要把tags使用":"添加到topic后面就可以了。

例如:xxxx:tag1 || tag2 || tag3

使用RocketMQ 处理消息

消息发送(生产者)

Maven + SpringBoot 工程为例,先在pom.xml增加依赖

<dependency>    <groupId>org.apache.rocketmq</groupId>    <artifactId>rocketmq-spring-boot-starter</artifactId>    <version>2.0.1</version></dependency>

由于,这个依赖是一个starter,直接引入依赖就可以开始写投递消息的代码了。这个starter注册了一个叫org.apache.rocketmq.spring.core.RocketMQTemplate的bean,用它就可以直接把消息投递出去。 具体的api是这样的

XXXEvent xxxDto = new XXXEvent();    Message<XXXEvent> message = MessageBuilder.withPayload(xxxDto).build();    String dest = String.fORMat("%s:%s",topic-name","tag-name");    //默认投递:同步发送 不会丢失消息。如果在投递成功后发生网络异常,客户端会认为投递失败而回滚本地事务    this.rocketMQTemplate.send(dest, xxxDto);

这种投递方式能保证投递成功的消息不会丢失,但是不能保证投递一定成功。假设一次调用的流程是这样的

如何使用RocketMQTemplate发送带tags的消息

如果在步骤3的时候发生错误,因为出错mqClient会认为消息投递失败而把事务回滚。如果消息已经被消费,那就会导致业务错误。我们可以用事务消息解决这个问题。

以带事务方式投递的消息,正常情况下的处理流程是这样的

如何使用RocketMQTemplate发送带tags的消息

出错的时候是这样的

如何使用RocketMQTemplate发送带tags的消息

由于普通消息没有消息回查,普通消息用的producer不支持回查操作,不同业务的回查处理也不一样,事务消息需要使用单独的producer。消息发送代码大概是这样的

//调用这段代码之前别做会影响数据的操作XXXEvent xxxDto = new XXXEvent();Message<XXXEvent> message = MessageBuilder.withPayload(xxxDto).build();String dest = String.format("%s:%s",topic-name","tag-name");TransactionSendResult transactionSendResult = this.rocketMQTemplate.sendMessageInTransaction("poducer-name","topic-name:tag-name",message,"xxxid");if (LocalTransactionState.ROLLBACK_MESSAGE.equals(transactionSendResult.getLocalTransactionState())){    throw new RuntimeException("事务消息投递失败");}//按照RocketMQ的写法,这个地方不应该有别的代码
@RocketMQTransactionListener(txProducerGroup = "producer")    class TransactionListenerImpl implements RocketMQLocalTransactionListener {                //消息投递成功后执行的逻辑(半消息)        //原文:When send transactional prepare(half) message succeed, this method will be invoked to execute local transaction.        @Override        public RocketMQLocalTransactionState executeLocalTransaction(Message msg, Object arg) {            try{                //                xxxService.doSomething();                return RocketMQLocalTransactionState.COMMIT;            catch(IOException e){                //不确定最终是否成功                return RocketMQLocalTransactionState.UNKNOWN;            }catch(Exception e){                return RocketMQLocalTransactionState.ROLLBACK;            }        }        //回查事务执行状态        @Override        public RocketMQLocalTransactionState checkLocalTransaction(Message msg) {            Boolean result = xxxService.isSuccess(msg,arg);            if(result != null){                if(result){                    return RocketMQLocalTransactionState.COMMIT;                }else{                    return RocketMQLocalTransactionState.ROLLBACK;                }            }            return RocketMQLocalTransactionState.UNKNOWN;        }    }

处理消息(消费)

普通消息和事务消息的区别只在投递的时候才明显,对应的消费端代码比较简单

import lombok.extern.slf4j.Slf4j;import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;import org.apache.rocketmq.spring.core.RocketMQListener;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.core.StringRedisTemplate;import org.springframework.stereotype.Component;@Slf4j@Component@RocketMQMessageListener(consumerGroup = "xxx-consumer", topic = "topic-name",selectorExpression = "tag-name")public class XXXEventMQListener implements RocketMQListener<XXXEvent> {    private  String repeatCheckRedisKeyTemplate = "topic-name:tag:repeat-check:%s";    @Autowired private StringRedisTemplate redisTemplate;    @Override    public void onMessage(XXXEvent message) {        log.info("consumer message {}",message);        //处理消息        try{            xxxService.doSomething(message);        }catch(Exception ex){            log.warn(String.format("message [%s] 消费失败",message),ex);            //抛出异常后,MQClient会返回ConsumeConcurrentlyStatus.RECONSUME_LATER,这条消息会再次尝试消费            throw new RuntimException(ex);        }    }}

RocketMQ用ACK机制保证NameServer知道消息是否被消费在

org.apache.rocketmq.spring.support.DefaultRocketMQListenerContainer里是这么处理的

public class DefaultMessageListenerConcurrently implements MessageListenerConcurrently {    @SuppressWarnings("unchecked")    @Override    public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {        for (MessageExt messageExt : msgs) {            log.debug("received msg: {}", messageExt);            try {                long now = System.currentTimeMillis();                rocketMQListener.onMessage(doConvertMessage(messageExt));                long costTime = System.currentTimeMillis() - now;                log.debug("consume {} cost: {} ms", messageExt.getMsgId(), costTime);            } catch (Exception e) {                log.warn("consume message failed. messageExt:{}", messageExt, e);                context.setDelayLevelWhenNextConsume(delayLevelWhenNextConsume);                return ConsumeConcurrentlyStatus.RECONSUME_LATER;            }        }        return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;    }}

关于“如何使用RocketMQTemplate发送带tags的消息”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: 如何使用RocketMQTemplate发送带tags的消息

本文链接: https://lsjlt.com/news/296923.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 使用RocketMQTemplate发送带tags的消息
    RocketMQTemplate发送带tags的消息 RocketMQTemplate是RocketMQ集成到Spring cloud之后提供的个方便发送消息的模板类,它是基本Spr...
    99+
    2024-04-02
  • 如何使用RocketMQTemplate发送带tags的消息
    这篇文章将为大家详细讲解有关如何使用RocketMQTemplate发送带tags的消息,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。RocketMQTemplate发送带tags的消息RocketMQT...
    99+
    2023-06-20
  • 如何使用服务器脚本发送消息
    今天小编给大家分享一下如何使用服务器脚本发送消息的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下...
    99+
    2024-04-02
  • Android使用广播发送消息
    本文实例为大家分享了Android使用广播发送消息的具体代码,供大家参考,具体内容如下 1.activity_main.xml  <xml version="1.0...
    99+
    2024-04-02
  • 如何使用JavaScript给微信用户发送消息
    这篇文章给大家分享的是有关如何使用JavaScript给微信用户发送消息的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体实现我们登陆微信公众号的控制台后,点开发-> 基本配置:能看到我们配置的微信消息服务...
    99+
    2023-06-04
  • C#使用udp如何实现消息的接收和发送
    目录使用udp实现消息的接收和发送C# 运用UDP服务端界面客户端界面总结使用udp实现消息的接收和发送 代码比较简单,但是别忘记关闭防火墙进行测试。 首先便是服务端,使用Socke...
    99+
    2023-02-26
    C#使用udp udp消息接收 udp消息发送
  • Android怎么使用广播发送消息
    本文小编为大家详细介绍“Android怎么使用广播发送消息”,内容详细,步骤清晰,细节处理妥当,希望这篇“Android怎么使用广播发送消息”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。具体效果如下activit...
    99+
    2023-06-30
  • mq消息发送失败如何解决
    当MQ消息发送失败时,可以尝试以下几种解决方法: 检查MQ服务器状态:确认MQ服务器是否正常运行,并检查连接配置是否正确。 ...
    99+
    2023-10-23
    mq
  • 如何发送消息并忽略路由
    积累知识,胜过积蓄金银!毕竟在Golang开发的过程中,会遇到各种各样的问题,往往都是一些细节知识点还没有掌握好而导致的,因此基础知识点的积累是很重要的。下面本文《如何发送消息并忽略路由》,就带大家...
    99+
    2024-04-05
  • 如何用Python自动给朋友发送消息
    这篇文章主要讲解了“如何用Python自动给朋友发送消息”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何用Python自动给朋友发送消息”吧!首先我们下载两个要用的Python库,在命令行...
    99+
    2023-06-17
  • springboot如何使用websocket技术主动给前端发送消息
    这篇文章将为大家详细讲解有关springboot如何使用websocket技术主动给前端发送消息,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。使用websocket技术主动给前端发送消息springBoo...
    99+
    2023-06-22
  • 如何使用Redis和Python开发实时消息推送功能
    如何使用Redis和Python开发实时消息推送功能随着实时通信的需求日益增长,开发实时消息推送功能变得越来越重要。在本文中,将介绍如何使用Redis和Python来实现这样的功能,同时提供具体的代码示例。一、什么是实时消息推送功能?实时消...
    99+
    2023-10-22
    Python redis 实时消息推送
  • CentOS6下发送消息命令的用法
    这篇文章给大家分享的是有关CentOS6下发送消息命令的用法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、wall '...'wall是给所有的用户发送消息,消息内容用''包含...
    99+
    2023-06-10
  • 如何用PHP实现消息推送
     什么是消息推送 通过服务器自动推送消息到客户端(浏览器,APP,微信)的应用技术。  为什么要使用消息推送技术 通常情况下都是用户发送请求浏览器显示用户需要的信息。推送技术通过自动传送信息给用户,来减少用于网络上搜索的时间。它根据用户的兴...
    99+
    2023-08-31
    php 开发语言 websocket
  • 如何使用Python实现给企业微信发送消息功能
    如何使用Python实现给企业微信发送消息功能,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、概述下面将介绍如何使用python3给企业微信发送消息。我的环境是linux...
    99+
    2023-06-22
  • SpringBoot如何实现MQTT消息发送和接收
    今天小编给大家分享一下SpringBoot如何实现MQTT消息发送和接收的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Spr...
    99+
    2023-07-05
  • Kafka中的Producer发送消息失败后如何处理
    当Kafka中的Producer发送消息失败后,可以通过以下几种方式处理: 重试发送:Producer可以设置重试机制,当发送消...
    99+
    2024-04-02
  • PHP微信开发:如何实现群发消息发送记录
    随着微信成为了人们生活中越来越重要的一个通讯工具,其敏捷的消息传递功能迅速受到广大企业和个人的青睐。对于企业而言,将微信发展为一个营销平台已经成为趋势,而微信开发的重要性也逐渐凸显。在其中,群发功能更是被广泛使用,那么,作为PHP程序员,如...
    99+
    2023-05-14
    PHP 微信开发 群发消息发送记录
  • C#怎么使用udp实现消息的接收和发送
    本篇内容主要讲解“C#怎么使用udp实现消息的接收和发送”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#怎么使用udp实现消息的接收和发送”吧!使用udp实现消息的接收和发送代码比较简单,但是...
    99+
    2023-07-05
  • 如何使用socket.io实现消息实时推送功能
    本篇文章给大家分享的是有关如何使用socket.io实现消息实时推送功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Socket.io 介绍...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作