010 使用RabbitMQ處理消息

原文

https://spring.io/guides/gs/messaging-rabbitmq/

直譯

設置RabbitMQ 代理

在構建消息傳遞應用程序之前,需要設置將處理接收和發送消息的服務器。

RabbitMQ是一個AMQP服務器。該服務器可從http://www.rabbitmq.com/download.html免費獲得。您可以手動下載,或者如果您使用的是帶自制軟件的Mac:

brew install rabbitmq

解壓縮服務器並使用默認設置啓動它。

rabbitmq-server

你應該看到這樣的東西:

            RabbitMQ 3.1.3. Copyright (C) 2007-2013 VMware, Inc.
##  ##      Licensed under the MPL.  See http://www.rabbitmq.com/
##  ##
##########  Logs: /usr/local/var/log/rabbitmq/[email protected]
######  ##        /usr/local/var/log/rabbitmq/[email protected]
##########
            Starting broker... completed with 6 plugins.

如果您在本地運行docker,也可以使用Docker Compose快速啓動RabbitMQ服務器。有一個docker-compose.yml在Github上“完整”的項目的根。這很簡單:

docker-compose.yml

rabbitmq:
  image: rabbitmq:management
  ports:
    - "5672:5672"
    - "15672:15672"

使用當前目錄中的此文件,您可以運行docker-compose up以在容器中運行RabbitMQ。

創建一個RabbitMQ消息接收器

使用任何基於消息傳遞的應用程序,您需要創建一個響應已發佈消息的接收器。

src/main/java/hello/Receiver.java

package hello;

import java.util.concurrent.CountDownLatch;
import org.springframework.stereotype.Component;

@Component
public class Receiver {

    private CountDownLatch latch = new CountDownLatch(1);

    public void receiveMessage(String message) {
        System.out.println("Received <" + message + ">");
        latch.countDown();
    }

    public CountDownLatch getLatch() {
        return latch;
    }

}

這Receiver是一個簡單的POJO,它定義了一種接收消息的方法。當您註冊接收消息時,您可以將其命名爲任何名稱。

爲方便起見,這個POJO也有一個CountDownLatch。這允許它發出信號表示已收到消息。這是您不太可能在生產應用程序中實現的。
註冊監聽器併發送消息
Spring AMQP RabbitTemplate提供了使用RabbitMQ發送和接收消息所需的一切。具體來說,您需要配置:

消息偵聽器容器

聲明隊列,交換以及它們之間的綁定

用於發送一些消息以測試偵聽器的組件

Spring Boot會自動創建連接工廠和RabbitTemplate,從而減少您必須編寫的代碼量。
您將使用RabbitTemplate發送消息,並將Receiver使用消息偵聽器容器註冊a 以接收消息。連接工廠驅動兩者,允許它們連接到RabbitMQ服務器。

src/main/java/hello/Application.java

package hello;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
import org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class Application {

    static final String topicExchangeName = "spring-boot-exchange";

    static final String queueName = "spring-boot";

    @Bean
    Queue queue() {
        return new Queue(queueName, false);
    }

    @Bean
    TopicExchange exchange() {
        return new TopicExchange(topicExchangeName);
    }

    @Bean
    Binding binding(Queue queue, TopicExchange exchange) {
        return BindingBuilder.bind(queue).to(exchange).with("foo.bar.#");
    }

    @Bean
    SimpleMessageListenerContainer container(ConnectionFactory connectionFactory,
            MessageListenerAdapter listenerAdapter) {
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.setQueueNames(queueName);
        container.setMessageListener(listenerAdapter);
        return container;
    }

    @Bean
    MessageListenerAdapter listenerAdapter(Receiver receiver) {
        return new MessageListenerAdapter(receiver, "receiveMessage");
    }

    public static void main(String[] args) throws InterruptedException {
        SpringApplication.run(Application.class, args).close();
    }

}

@SpringBootApplication 是一個便利註釋,添加了以下所有內容:

  • @Configuration 標記該類作爲應用程序上下文的bean定義的來源。

  • @EnableAutoConfiguration 告訴Spring Boot開始根據類路徑設置,其他bean和各種屬性設置添加bean。

  • 通常你會添加@EnableWebMvc一個Spring MVC應用程序,但Spring Boot會在類路徑上看到spring-webmvc時自動添加它。這會將應用程序標記爲Web應用程序並激活關鍵行爲,例如設置a DispatcherServlet。

  • @ComponentScan告訴Spring在包中尋找其他組件,配置和服務hello,允許它找到控制器。

該main()方法使用Spring Boot的SpringApplication.run()方法啓動應用程序。您是否注意到沒有一行XML?也沒有web.xml文件。此Web應用程序是100%純Java,您無需處理配置任何管道或基礎結構。

listenerAdapter()方法中定義的bean在定義的容器中註冊爲消息偵聽器container()。它將偵聽“spring-boot”隊列中的消息。因爲Receiver該類是POJO,所以需要將其包裝在MessageListenerAdapter指定要調用的位置receiveMessage。

JMS隊列和AMQP隊列具有不同的語義。例如,JMS僅向一個使用者發送排隊的消息。雖然AMQP隊列執行相同的操作,但AMQP生成器不會將消息直接發送到隊列。相反,消息被髮送到交換機,交換機可以轉到單個隊列,或扇出到多個隊列,模仿JMS主題的概念。有關更多信息,請參閱瞭解AMQP。
消息監聽器容器和接收器bean是您監聽消息所需的全部內容。要發送消息,您還需要一個Rabbit模板。

該queue()方法創建AMQP隊列。該exchange()方法創建主題交換。該binding()方法將這兩者綁定在一起,定義RabbitTemplate發佈到交換時發生的行爲。

Spring AMQP要求將the Queue,the TopicExchange和Binding聲明爲頂級Spring bean才能正確設置。
在這種情況下,我們使用主題交換,並且隊列與路由密鑰綁定,foo.bar.#這意味着使用以路由鍵開頭的任何消息foo.bar.都將路由到隊列。

發送測試消息
測試消息由a發送CommandLineRunner,它還等待接收器中的鎖存器並關閉應用程序上下文:

src/main/java/hello/Runner.java

package hello;

import java.util.concurrent.TimeUnit;

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
public class Runner implements CommandLineRunner {

    private final RabbitTemplate rabbitTemplate;
    private final Receiver receiver;

    public Runner(Receiver receiver, RabbitTemplate rabbitTemplate) {
        this.receiver = receiver;
        this.rabbitTemplate = rabbitTemplate;
    }

    @Override
    public void run(String... args) throws Exception {
        System.out.println("Sending message...");
        rabbitTemplate.convertAndSend(Application.topicExchangeName, "foo.bar.baz", "Hello from RabbitMQ!");
        receiver.getLatch().await(10000, TimeUnit.MILLISECONDS);
    }

}

請注意,模板將消息路由到交換機,其路由密鑰foo.bar.baz與綁定匹配。

可以在測試中模擬跑步者,以便可以單獨測試接收器。

運行應用程序

該main()方法通過創建Spring應用程序上下文來啓動該過程。這將啓動消息偵聽器容器,該容器將開始偵聽消息。Runner然後有一個bean自動執行:它RabbitTemplate從應用程序上下文中檢索併發送一個“來自RabbitMQ的Hello!” “spring-boot”隊列中的消息。最後,它關閉Spring應用程序上下文,應用程序結束。

構建可執行的JAR

您可以使用Gradle或Maven從命令行運行該應用程序。或者,您可以構建一個包含所有必需依賴項,類和資源的可執行JAR文件,並運行該文件。這使得在整個開發生命週期中,跨不同環境等將服務作爲應用程序發佈,版本和部署變得容易。

如果您使用的是Gradle,則可以使用./gradlew bootRun。或者您可以使用構建JAR文件./gradlew build。然後你可以運行JAR文件:

java -jar build / libs / gs-messaging-rabbitmq-0.1.0.jar

如果您使用的是Maven,則可以使用該應用程序運行該應用程序./mvnw spring-boot:run。或者您可以使用構建JAR文件./mvnw clean package。然後你可以運行JAR文件:

java -jar target / gs-messaging-rabbitmq-0.1.0.jar

上面的過程將創建一個可運行的JAR。您也可以選擇構建經典WAR文件。
您應該看到以下輸出:

Sending message...
Received <Hello from RabbitMQ!>

摘要

恭喜!您剛剛使用Spring和RabbitMQ開發了一個簡單的發佈 - 訂閱應用程序。還有更多,你可以使用Spring和RabbitMQ的做的比這裏覆蓋,但是這應該提供一個良好的開端。

擴展知識

RabbitMQ的安裝/啓動

https://www.rabbitmq.com/install-homebrew.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章