SpringBoot 如何使用 Spring Cloud Stream 处理事件

news2024/11/18 7:52:20

SpringBoot 如何使用 Spring Cloud Stream 处理事件

在分布式系统中,事件驱动架构(Event-Driven Architecture,EDA)已经成为一种非常流行的架构模式。事件驱动架构将系统中的各个组件连接在一起,以便它们可以相互协作,响应事件并执行相应的操作。SpringBoot 也提供了一种方便的方式来处理事件——使用 Spring Cloud Stream。

Spring Cloud Stream 是基于 Spring Boot 的用于构建消息驱动微服务的框架。它提供了一种简单、易于使用的方式来建立可靠的、可扩展的和高度可用的消息驱动应用程序。本文将介绍如何使用 Spring Cloud Stream 来处理事件。

在这里插入图片描述

准备工作

在使用 Spring Cloud Stream 处理事件之前,我们需要进行一些准备工作。

安装 RabbitMQ

Spring Cloud Stream 支持多种消息中间件,包括 RabbitMQ、Apache Kafka、Apache RocketMQ 等。在本文中,我们将使用 RabbitMQ 作为消息中间件。

首先,我们需要安装 RabbitMQ。可以使用以下命令在 Ubuntu 系统上安装 RabbitMQ:

sudo apt-get update
sudo apt-get install rabbitmq-server

添加依赖

然后,我们需要在 Maven 项目中添加 Spring Cloud Stream 和 RabbitMQ 的依赖。可以使用以下依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.amqp</groupId>
    <artifactId>spring-rabbit</artifactId>
</dependency>

配置文件

最后,我们需要在 SpringBoot 应用程序中添加以下配置信息:

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

spring.cloud.stream:
  bindings:
    input:
      destination: myTopic
    output:
      destination: myTopic

在上面的配置文件中,我们指定了 RabbitMQ 的连接信息和 Spring Cloud Stream 的绑定信息。inputoutput 分别对应于输入和输出流。

发送事件

现在,我们可以开始使用 Spring Cloud Stream 来处理事件了。

首先,我们需要创建一个消息生产者,用于向 RabbitMQ 发送消息。可以使用以下代码:

@EnableBinding(Source.class)
public class EventSender {
    private final Source source;

    public EventSender(Source source) {
        this.source = source;
    }

    public void sendEvent(String message) {
        source.output().send(MessageBuilder.withPayload(message).build());
    }
}

在上面的代码中,我们使用 @EnableBinding(Source.class) 注解将 EventSender 类绑定到 Source 类上,表示该类是一个消息生产者。sendEvent 方法用于发送消息。我们将要发送的消息作为字符串参数传递给该方法,并将其包装在 MessageBuilder 对象中。然后,我们使用 output().send() 方法将消息发送到输出流中。

接收事件

接下来,我们需要创建一个消息消费者,用于接收从 RabbitMQ 接收到的消息。可以使用以下代码:

@EnableBinding(Sink.class)
public class EventReceiver {
    @StreamListener(target = Sink.INPUT)
    public void receiveEvent(String message) {
        System.out.println("Received message: " + message);
    }
}

在上面的代码中,我们使用 @EnableBinding(Sink.class) 注解将 EventReceiver 类绑定到 Sink 类上,表示该类是一个消息消费者。@StreamListener(target = Sink.INPUT) 注解用于指定该方法应该接收输入流中的消息。接收到的消息作为字符串参数传递给 receiveEvent 方法,并在控制台上打印出来。

完整代码

下面是完整的代码示例:

@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

@EnableBinding(Source.class)
public class EventSender{
    private final Source source;

    public EventSender(Source source) {
        this.source = source;
    }

    public void sendEvent(String message) {
        source.output().send(MessageBuilder.withPayload(message).build());
    }
}

@EnableBinding(Sink.class)
public class EventReceiver {
    @StreamListener(target = Sink.INPUT)
    public void receiveEvent(String message) {
        System.out.println("Received message: " + message);
    }
}
spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

spring.cloud.stream:
  bindings:
    input:
      destination: myTopic
    output:
      destination: myTopic

在上面的代码中,我们创建了一个 SpringBoot 应用程序,并在其中添加了一个名为 MyApplication 的启动类。EventSenderEventReceiver 类用于发送和接收事件。我们还在 application.yml 文件中添加了 RabbitMQ 和 Spring Cloud Stream 的配置信息。

运行应用程序

现在,我们已经完成了使用 Spring Cloud Stream 处理事件的所有准备工作。我们可以使用以下命令运行应用程序:

mvn spring-boot:run

应用程序会启动并开始监听名为 myTopic 的主题。我们可以使用 EventSender 类向该主题发送消息,并使用 EventReceiver 类从该主题接收消息。

可以使用以下代码在控制台上发送消息:

@Autowired
private EventSender eventSender;

eventSender.sendEvent("Hello World!");

可以在控制台上看到如下输出:

Received message: Hello World!

这表示我们已经成功地使用 Spring Cloud Stream 处理了事件。

总结

本文介绍了如何使用 Spring Cloud Stream 处理事件。我们首先准备了 RabbitMQ 和 Maven 依赖,并在 SpringBoot 应用程序中添加了相关的配置信息。然后,我们创建了一个消息生产者和一个消息消费者,用于发送和接收事件。最后,我们演示了如何在控制台上发送和接收消息。

使用 Spring Cloud Stream 处理事件具有很多优势。它可以帮助我们构建高可靠、高可用、可扩展的消息驱动应用程序。此外,它还提供了一种简单、易于使用的方式来处理事件。希望本文能够帮助您了解如何使用 Spring Cloud Stream 处理事件,并在实际项目中使用该框架构建可靠的消息驱动应用程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/670360.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【深度学习】5-4 与学习相关的技巧 - 正则化解决过拟合(权值衰减,Dropout)

机器学习的问题中&#xff0c;过拟合是一个很常见的问题。过拟合指的是只能拟合训练数据&#xff0c;但不能很好地拟合不包含在训练数据中的其他数据的状态。机器学习的目标是提高泛化能力&#xff0c;即便是没有包含在训练数据里的未观测数据也希望模型可以进行正确的识别。 …

皓文电子 | 智能制造领先企业的安全服务经验分享

皓文电子是一家为客户提供设计、生产、销售高端开关电源及各类功率变换产品的国家级高新技术企业&#xff0c;是国内智能制造领域的代表企业。其核心产品能与国际主流电源厂商竞争&#xff0c;达到国内外领先水平&#xff0c;并在国家多个重点项目中批量生产装备。 遭遇安全事件…

2023年湖北孝感初、中级工程师职称报名条件和要求是什么?启程别

2023年湖北孝感初、中级工程师职称报名条件和要求是什么&#xff1f;启程别 初级职称对于找工作很有帮助。现在&#xff0c;学历越来越高&#xff0c;仅有学历已经不能满足应聘需求。初级职称的获得并不难&#xff0c;有了职称也会让自己在找工作时更有竞争力。威信公号搜一下启…

2023年最新智能优化算法之——IBI逻辑优化算法(IBL),附MATLAB代码

今天给大家带来一个有意思的智能优化算法&#xff0c;IBL算法。 先说效果&#xff1a;在CEC2005函数集测试&#xff0c;基本上毫无压力&#xff0c;把把都能预测的很准确&#xff0c;而且速度极快。大家可以自行尝试哈。 为啥说这个算法有意思呢&#xff0c;大家看IBL的英文全…

史上最大图灵测试实验完成150万人类参与1000万次对话,判断对面是人还是AI

本文 介绍 了AI 21实验室推出了一个好玩的社交图灵游戏——「人类还是机器人&#xff1f;」 【导读】这个「人类还是AI?」的游戏一经推出&#xff0c;就被广大网友们玩疯了&#xff01;如今全世界已有150万人参与&#xff0c;网友们大方分享自己鉴AI的秘诀。 历上规模最大的…

解决:torch.cuda.is_available()一直返回False,显卡是NVIDA GeForce MX250

目录 1. 背景2. 发现问题根源3. 解决问题 1. 背景 AI时代了&#xff0c;之前一直不怎么用到的小米笔记本Pro的 NVIDA GeForce MX250独显&#xff0c;就想着让它发挥余热&#xff0c;免得买了这么多年&#xff0c;一直闲置&#xff0c;浪费。 无脑按照chatGPT给的例子&#x…

为什么Django要引入CSRF令牌?答:主要是为了防止跨站伪造请求攻击,那么什么是跨站伪造请求攻击呢?

“CSRF”的英文全称是&#xff1a;“Cross-Site Request Forgery”&#xff0c;翻译过来就是&#xff1a;“跨站请求伪造”。 那么什么是跨站伪造请求攻击呢&#xff1f;看下面这张图就够了。 注意&#xff1a;看上面这张图请按图中标注的1到6的顺序阅读。 Django通过引入CS…

一文详解!接口自动化的关键思路和解决方案

目录 引言 正文 一.接口传参 二. 外部数据源 三. 测试断言 四. 环境切换 五. 批量测试 总结 一.接口自动化的工具思维和测试思维 二.贯穿整个接口自动化项目的三个基本思路&#xff1a; 引言 与UI相比&#xff0c;接口一旦研发完成&#xff0c;通常变更或重构的频率…

使用nps搭建内网穿透服务

使用nps搭建内网穿透服务 如何使用nps搭建内网穿透服务前提准备操作流程配置服务端配置客户端 P2P模式&#xff0c;大流量低延迟 正式开始之前呢&#xff0c;先介绍一下什么是内网穿透&#xff1a; 内网穿透&#xff08;NAT穿透&#xff09;是一种技术&#xff0c;它允许您通过…

软件测试简历编写以及软件测试面试题大全

目录 前言&#xff1a; 一、简历重要性以及编写原则 二、简历模板 三、简历包装 四、互联网公司常用接口测试面试题 五、互联网公司常面自动化测试面试题 前言&#xff1a; 软件测试是软件开发过程中必不可少的一环&#xff0c;也是一个不断发展和变化的领域。在寻找软件测试职…

广角积分球均匀光源

现阶段&#xff0c;摄影测量技术已涉及多行多业&#xff0c;其在交通、考古以及景物三维重建中的应用尤为显著&#xff0c;但是普通相机取景范围有限&#xff0c;不能全面捕获整个空间信息&#xff0c;因此一种新型相机--全景相机逐步被应用到实际当中。80年代初&#xff0c;国…

场景解析丨活用PDCA循环,让你的项目管理更高效!

聚焦制造业共性项目管控难题 结合装备制造行业特性&#xff0c; 从PDCA循环角度&#xff0c; 通过痛点、解决方案、实际案例的剖析&#xff0c; 看企业如何做好项目管理。 本期干货内容分享 1. 计划的可执行性 计划要达成共识&#xff0c;打造合理三级计划体系 2. 执行的…

Android预装apk

预装APK到system/app目录 注&#xff1a;APK名字不能含有中文、空格等特殊字符。 在 驱动路径/android/vendor/aw/public/prebuild/apk 创建一个目录存放对应的APK将所需预装的APK放入该目录中在该目录中创建 Android.mk文件&#xff0c;并编译 # 文件名 LOCAL_PATH : $(call…

supervisor简介

1、概述 supervisor是一个用python语言编写的进程管理工具&#xff0c;它可以很方便的监听、启动、停止、重启一个或多个进程。当一个进程意外被杀死&#xff0c;supervisor监听到进程死后&#xff0c;可以很方便的让进程自动恢复&#xff0c;不再需要程序员或系统管理员自己编…

回调函数(callback)是什么?一文理解回调函数(callback)

这里写目录标题 一、什么是回调函数1.1、回调函数的定义和基本概念1.2、回调函数的作用和使用场景 二、回调函数的实现方法2.1、函数指针2.2、函数对象/functor2.3、匿名函数/lambda表达式 三、回调函数的应用举例四、回调函数的优缺点五、回调函数与其他编程概念的关系5.1、回…

性能提升30%!袋鼠云数栈基于 Apache Hudi 的性能优化实战解析

Apache Hudi 是一款开源的数据湖解决方案&#xff0c;它能够帮助企业更好地管理和分析海量数据&#xff0c;支持高效的数据更新和查询。并提供多种数据压缩和存储格式以及索引功能&#xff0c;从而为企业数据仓库实践提供更加灵活和高效的数据处理方式。 在金融领域&#xff0…

Mysql高阶语句(一)

Mysql高阶语句&#xff08;一&#xff09; 一、MySQL高级进阶SQL 语句1、SELECT斜体样式2、DISTINCT3、WHERE4、AND、OR5、IN6、BETWEEN7、通配符、LIKE8、ORDER BY9、| | 连接符10、GROUP BY11、HAVING 二、函数1、数学函数2、聚合函数3、字符串函数4、日期时间函数 一、MySQL…

短视频矩阵源码

短视频矩阵源码的开发部署其实并不难&#xff0c;主要依托于抖音平台各种开放权限进行研发&#xff0c;市面上常见的源码功能构建也是大同小异&#xff0c;主要处理还在于细节及产品优化上。 如&#xff1a; 1. 视频制作板块&#xff0c;文字转语音功能&#xff0c;当然各种云&…

【人工智能技术专题】「入门到精通系列教程」零基础带你进军人工智能领域的全流程技术体系和实战指南(NLP、GPT-Pre-Training和数据标注都是什么)

零基础带你进军人工智能领域的全流程技术体系和实战指南&#xff08;NLP、GPT-Pre-Training和数据标注都是什么&#xff09; 前言专栏介绍专栏说明学习大纲前提条件面向读者学习目标核心内容NLP自然话言理解指的是什么定义概念涉及到的领域技术与应用关系 重要性语言结构剖析分…

AI已在职场大规模应用,求职者被要求熟练使用ChatGPT

“能熟练使用ChatGPT、Midjourney等AI软件生产高质量文图内容完成辅助工作。”当这条岗位要求悄然出现在今夏的应聘季&#xff0c;时光仿佛被拉回到数十年前&#xff0c;那个要求“会使用Word、Excel等计算机软件”的求职年代。 彼时&#xff0c;因为计算机的逐渐普及&#xf…