原文
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的做的比這裏覆蓋,但是這應該提供一個良好的開端。