Java Spring Boot 整合RabbitMQ(一):Hello World -B2B2C小程式電子商務

gung123發表於2020-03-05

Spring Boot 整合

環境:


RabbitMQ:3.7.4

Spring Boot:2.0.1.RELEASE

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

我們可以使用 Spring Intializr 或 建立一個 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: 5672
tutorial:
  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"})
@Configuration
public 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
@EnableScheduling
public 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;
    @Autowired
private 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’



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69952307/viewspace-2678696/,如需轉載,請註明出處,否則將追究法律責任。

相關文章