千家信息网

Java Spring Boot 整合RabbitMQ(一):Hello World -B2B2C小程序电子商务

发表于:2025-01-24 作者:千家信息网编辑
千家信息网最后更新 2025年01月24日,Spring Boot 整合环境:RabbitMQ:3.7.4Spring Boot:2.0.1.RELEASE因为有 Starter POMs,在 Spring Boot 中整合 RabbitMQ
千家信息网最后更新 2025年01月24日Java Spring Boot 整合RabbitMQ(一):Hello World -B2B2C小程序电子商务

Spring Boot 整合

环境:

RabbitMQ:3.7.4

Spring Boot:2.0.1.RELEASE

因为有 Starter POMs,在 Spring Boot 中整合 RabbitMQ 是一件非常容易的事,其中的 AMQP 模块就可以很好的支持 RabbitMQ。

我们可以使用 Spring Intializr 或 https://start.spring.io/ 创建一个 Spring Boot 工程,并勾选 RabbitMQ。

或者手动在 pom.xml 文件中加入

    org.springframework.boot    spring-boot-starter-amqp

在 application.yml 中配置关于 RabbitMQ 的连接和用户信息,如果没有改 RabbitMQ 的默认配置的话,这里零配置即可启动。这里我们还定义了一些额外的配置备用。

spring:  profiles:    active: usage_message  rabbitmq:    port: 5672tutorial:  client:    duration: 10000

生产者

Spring AMQP 让我们用少量的代码就能轻松实现消息的发送和接收。通过注入 AmqpTemplate 接口的实例来实现消息的发送,AmqpTemplate 接口定义了一套针对 AMQP 协议的基础操作。在 Spring Boot 中会根据配置来注入其具体实现 (AmqpTemplate 的默认实现就是 RabbitTemplate)。

public class Tut1Sender {    @Autowired    private AmqpTemplate template;    @Autowired    private Queue queue;    /**     * 用定时任务来模拟生产者定时发送消息     */    @Scheduled (fixedDelay = 1000, initialDelay = 500)    public void send() {        String message = "Hello World!" + new Date();        template.convertAndSend(queue.getName(), message);        System.out.println(" [x] Sent '" + message + "'");    }}

在该生产者中,我们会产生一个字符串,并发送到名为"hello-world" 的队列中。

消费者

创建消费者 Receiver。通过 @RabbitListener 注解定义该类对"hello-world" 队列的监听,并用 @RabbitHandler 注解来指定对消息的处理方法。所以,该消费者实现了对"hello-world" 队列的消费,消费操作为输出消息的字符串内容。

@RabbitListener(queues = "hello-world")public class Tut1Receiver {    @RabbitHandler    public void receive(String in) {        System.out.println(" [x] Received '" + in + "'");    }}

配置类
创建一个新的 JavaConfig 文件

@Profile({"tut1", "hello-world"})@Configurationpublic class Tut1Config {    @Bean    public Queue queue() {        return new Queue("hello-world");    }   @Profile("receiver")    @Bean    public Tut1Receiver receiver() {        return new Tut1Receiver();    }   @Profile("sender")   @Bean     public Tut1Sender sender() {        return new Tut1Sender();    }}

在上面的 JavaConfig 中,我们使用 @Configuration 让 Spring 知道这是一个 Java 配置,并定义了生产者、消费者和一个名为"hello-world" 的队列。并且,我们使用 Spring Profiles 来控制它运行哪个示例,以及它是生产者还是消费者,这样我们就可以简单的通过启动参数传递我们的配置文件来正确的启动应用了。了解springcloud架构可以加求求:三五三六二四七二五九

至于具体的生产者(Tut1Sender)和消费者(Tut1Receiver),我们这里仅先定义出来,稍后再具体实现。

应用主类

再小小的改造一下生成的 RabbitmqTutorialApplication.java

@SpringBootApplication@EnableSchedulingpublic class RabbitmqTutorialApplication {    public static void main(String[] args) {        new SpringApplicationBuilder()                .sources(RabbitmqTutorialApplication.class)                // 设置成非 web 环境                .web(WebApplicationType.NONE)                .run(args);    }   @Profile("usage_message")   @Bean     public CommandLineRunner usage() {        return arg0 -> {            System.out.println("This app uses Spring Profiles to control its behavior.\n");            System.out.println("Sample usage: java -jar target/rabbitmq-tutorial-0.0.1-SNAPSHOT.jar --spring.profiles.active=hello-world,sender");        };    }    @Profile("!usage_message")    @Bean     public CommandLineRunner tutorial() {        return new RabbitTutorialRunner();    }}

这里我将环境设置为了 WebApplicationType.NONE,即非 WEB 环境,因为默认的话 Netty 会监听 8080 端口,同时运行的话就会接口冲突导致启动失败(当然,也可以直接在启动时用参数绑定不同的端口以避免冲突)。

其中的 RabbitTutorialRunner 如下

public class RabbitTutorialRunner implements CommandLineRunner {   @Value("${tutorial.client.duration:0}")    private int duration;    @Autowiredprivate ConfigurableApplicationContext ctx;    @Override  public void run(String... args) throws Exception {        System.out.println("Ready ... running for " + duration + "ms");        Thread.sleep(duration);        ctx.close();    }}

这个 Runner 主要是为了阻止主线程退出。除了用 Thread.sleep(millisecond),也可以用 CountDownLatch 来达到相同的目的。

运行

编译

mvn clean package -Dmaven.test.skip=true

运行

java -jar target/rabbitmq-tutorial-0.0.1-SNAPSHOT.jar --spring.profiles.active=tut1,sender

java -jar target/rabbitmq-tutorial-0.0.1-SNAPSHOT.jar --spring.profiles.active=tut1,receiver

输出

// Sender

Ready … running for 10000ms

[x] Sent 'Hello World!Thu Apr 12 16:56:01 CST 2018'

[x] Sent 'Hello World!Thu Apr 12 16:56:03 CST 2018'

[x] Sent 'Hello World!Thu Apr 12 16:56:04 CST 2018'

消费 配置 消费者 生产者 生产 消息 环境 队列 运行 接口 文件 整合 参数 字符 字符串 注解 端口 冲突 应用 监听 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 财务数据库的技术要求 服务器如何接两个硬盘 重庆智能还款软件开发 wpe封包如何弄到服务器上 日本提交网络安全对策 正在连接游戏服务器 阿里云租用香港服务器要求 互联网科技创新企业扶持政策 张家界网络安全管理与维护技术 福州网络安全培训学费多少钱 不启动服务器管理器 服务器如何切换到笔记本上显示 网吧信息网络安全证明文件 江山天气预报软件开发 宁波什么是软件开发工具 云舒网络技术有限公司电话 格力软件开发薪资 约会软件开发平台 山东云服务器平台云空间虚拟主机 数据库字符比较大小 广州柯嘉网络技术有限公司 服务器修改后excel怎么保存 国内网络安全公司 360 物采互联网科技有限公司 浙江曙光服务器维修调试云服务器 四川高校日志审计服务器 网络安全性和可能性 实体服务器租用 安信网络技术服务 使用adt连接数据库
0