中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-08-10 11:18:42 來源:ITPUB博客 閱讀:141 作者:gung123 欄目:軟件技術

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鄂伦春自治旗| 武隆县| 屏东市| 高平市| 宝清县| 江山市| 修武县| 得荣县| 肇庆市| 双鸭山市| 井研县| 墨竹工卡县| 弥勒县| 凤台县| 河间市| 松江区| 肥东县| 荥经县| 叶城县| 宁城县| 明光市| 柘荣县| 沾化县| 炎陵县| 山东省| 吉安市| 当涂县| 汉沽区| 宣武区| 吉木萨尔县| 祥云县| 仙桃市| 葫芦岛市| 博乐市| 海淀区| 丰顺县| 鹿泉市| 玛曲县| 东至县| 和政县| 兰溪市|