文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-06-05 03:53

关注

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 文件中加入

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

在 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’

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯