# 使用JMS進行消息傳遞
本指南將引導您完成使用JMS代理發布和訂閱消息的過程。
## 你會建立什么
您將構建一個使用Spring的應用程序 `JmsTemplate` 發布一條消息并使用 `@JmsListener` 托管bean的帶批注的方法。
## 你需要什么
* 約15分鐘
* 最喜歡的文本編輯器或IDE
* [JDK 1.8](http://www.oracle.com/technetwork/java/javase/downloads/index.html) 或更高版本
* [Gradle 4+](http://www.gradle.org/downloads) 或 [Maven 3.2+](https://maven.apache.org/download.cgi)
* 您還可以將代碼直接導入到IDE中:
* [彈簧工具套件(STS)](https://spring.io/guides/gs/sts)
* [IntelliJ IDEA](https://spring.io/guides/gs/intellij-idea/)
## 如何完成本指南
像大多數Spring 一樣 [入門指南](https://spring.io/guides) ,您可以從頭開始并完成每個步驟,也可以繞過您已經熟悉的基本設置步驟。 無論哪種方式,您最終都可以使用代碼。
要 **從頭開始** ,請繼續 [使用Gradle構建](https://spring.io/guides/gs/messaging-jms/#scratch) 。
要 **跳過基礎知識** ,請執行以下操作:
* [下載](https://github.com/spring-guides/gs-messaging-jms/archive/master.zip) 并解壓縮本指南的源存儲庫,或使用 對其進行克隆 [Git](https://spring.io/understanding/Git) : `git clone [https://github.com/spring-guides/gs-messaging-jms.git](https://github.com/spring-guides/gs-messaging-jms.git)`
* 光盤進入 `gs-messaging-jms/initial`
* 跳至 [創建消息接收器](https://spring.io/guides/gs/messaging-jms/#initial) 。
**完成后** ,您可以根據中的代碼檢查結果 `gs-messaging-jms/complete`.
## 用Gradle構建
## 用Maven編譯
## 使用您的IDE進行構建
## 創建一個消息接收者
Spring提供了將消息發布到任何 [POJO的方法](https://spring.io/understanding/POJO) 。
在本指南中,您將研究如何通過JMS消息代理發送消息。 首先,讓我們創建一個非常簡單的POJO,其中體現了電子郵件的詳細信息。 請注意,我們沒有發送電子郵件。 我們只是將有關某個內容的詳細信息從一個地方發送到另一個地方,以發送消息。
`src/main/java/hello/Email.java`
~~~
Unresolved directive in <stdin> - include::complete/src/main/java/hello/Email.java[]
~~~
這個POJO非常簡單,包含兩個字段 **to** 和 **body** ,以及假定的getter和setter集。
在這里,您可以定義一個消息接收者:
`src/main/java/hello/Receiver.java`
~~~
Unresolved directive in <stdin> - include::complete/src/main/java/hello/Receiver.java[]
~~~
`Receiver`也稱為 **消息驅動POJO** 。 如您在上面的代碼中看到的,不需要實現任何特定的接口,也不需要使該方法具有任何特定的名稱。 此外,該方法可以具有 [非常靈活的簽名](https://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#jms-annotated-method-signature) 。 特別注意,此類在JMS API上沒有導入。
這 `JmsListener` 批注定義了名稱 `Destination` 該方法應偵聽的內容以及對 `JmsListenerContainerFactory`用于創建基礎消息偵聽器容器。 嚴格來講,除非您需要自定義容器的構建方式,否則不需要最后一個屬性,因為Spring Boot會在必要時注冊默認工廠。
該 [參考文檔](https://docs.spring.io/spring/docs/current/spring-framework-reference/integration.html#jms-annotated-method-signature) 涵蓋得更詳細。
## 使用Spring發送和接收JMS消息
接下來,連接發送方和接收方。
`src/main/java/hello/Application.java`
~~~
Unresolved directive in <stdin> - include::complete/src/main/java/hello/Application.java[]
~~~
`@SpringBootApplication` 是一個方便注釋,它添加了以下所有內容:
* `@Configuration`:將類標記為應用程序上下文的Bean定義的源。
* `@EnableAutoConfiguration`:告訴Spring Boot根據類路徑設置,其他bean和各種屬性設置開始添加bean。 例如,如果 `spring-webmvc` 在類路徑上,此注釋將應用程序標記為Web應用程序并激活關鍵行為,例如設置 `DispatcherServlet`.
* `@ComponentScan`:告訴Spring在服務器中尋找其他組件,配置和服務 `hello` 包,讓它找到控制器。
這 `main()` 方法使用Spring Boot的 `SpringApplication.run()`啟動應用程序的方法。 您是否注意到沒有一行XML? 沒有 `web.xml`文件。 該Web應用程序是100%純Java,因此您無需處理任何管道或基礎結構。
`@EnableJms` 觸發發現帶有注釋的方法 `@JmsListener`,在后臺創建消息偵聽器容器。
為了清楚起見,我們還定義了 `myFactory` 在中引用的bean `JmsListener`接收者的注釋。 因為我們使用 `DefaultJmsListenerContainerFactoryConfigurer` 由Spring Boot提供的基礎架構 `JmsMessageListenerContainer` 將與引導默認情況下創建的引導程序相同。
默認值 `MessageConverter` 只能轉換基本類型(例如 `String`, `Map`, `Serializable`)和我們的 `Email` 不是 `Serializable`故意。 我們要使用Jackson并將內容以文本格式序列化為json(即 `TextMessage`)。 Spring Boot將檢測到是否存在 `MessageConverter` 并將其關聯到兩個默認值 `JmsTemplate` 和任何 `JmsListenerContainerFactory` 由...制作 `DefaultJmsListenerContainerFactoryConfigurer`.
`JmsTemplate`使將消息發送到JMS目標變得非常簡單。 在里面 `main` 跑步者方法,啟動后,您可以使用 `jmsTemplate` 發送一個 `Email`POJO。 因為我們的習俗 `MessageConverter` 已自動與其關聯,則將在 `TextMessage` 只要。
您未看到定義的兩個bean是 `JmsTemplate` 和 `ConnectionFactory`。 這些是由Spring Boot自動創建的。 在這種情況下,ActiveMQ代理將以嵌入式方式運行。
默認情況下,Spring Boot創建一個 `JmsTemplate`配置為 來 [傳輸到隊列](https://docs.spring.io/spring/docs/current/spring-framework-reference/integration.html#jms-destinations) 通過將 **pubSubDomain** 設置為false 。 這 `JmsMessageListenerContainer`也配置相同。 要覆蓋,請設置 `spring.jms.isPubSubDomain=true` 通過Boot的屬性設置(在內部 `application.properties`或按環境變量)。 然后確保接收容器具有相同的設置。
春天的 JmsTemplate 可以直接通過其接收消息 receive方法,但只能同步工作,這意味著它將阻塞。 因此,我們建議您使用監聽器容器,例如 DefaultMessageListenerContainer 使用基于緩存的連接工廠,因此您可以異步使用消息,并以最大的連接效率使用消息。
### 建立可執行的JAR
您可以使用Gradle或Maven從命令行運行該應用程序。 您還可以構建一個包含所有必需的依賴項,類和資源的可執行JAR文件,然后運行該文件。 生成可執行jar使得在整個開發生命周期中,跨不同環境等等的情況下,都可以輕松地將服務作為應用程序進行發布,版本控制和部署。
如果您使用Gradle,則可以通過使用以下命令運行該應用程序 `./gradlew bootRun`。 或者,您可以通過使用以下命令構建JAR文件: `./gradlew build` 然后運行JAR文件,如下所示:
~~~
java -jar build/libs/gs-messaging-jms-0.1.0.jar
~~~
如果您使用Maven,則可以通過使用以下命令運行該應用程序 `./mvnw spring-boot:run`。 或者,您可以使用以下命令構建JAR文件: `./mvnw clean package` 然后運行JAR文件,如下所示:
~~~
java -jar target/gs-messaging-jms-0.1.0.jar
~~~
此處描述的步驟將創建可運行的JAR。 您還可以 構建經典的WAR文件 。
當它運行時,埋在所有日志中,您應該看到以下消息:
~~~
Sending an email message.
Received <Email{to=info@example.com, body=Hello}>
~~~
## 概括
恭喜你! 您剛剛開發了基于JMS的消息的發布者和使用者。
- springboot概述
- springboot構建restful服務
- spring構建一個RESTful Web服務
- spring定時任務
- 消費RESTful Web服務
- gradle構建項目
- maven構建項目
- springboot使用jdbc
- springboot應用上傳文件
- 使用LDNA驗證用戶
- 使用 spring data redis
- 使用 spring RabbitTemplate消息隊列
- 用no4j訪問nosql數據庫
- springboot驗證web表單
- Spring Boot Actuator構j建服務
- 使用jms傳遞消息
- springboot創建批處理服務
- spring security保護web 安全
- 在Pivotal GemFire中訪問數據
- 使用Spring Integration
- 使用springboot jpa進行數據庫操作
- 數據庫事務操作
- 操作mongodb
- springmvc+tymleaf創建web應用
- 將Spring Boot JAR應用程序轉換為WAR
- 創建異步服務
- spring提交表單
- 使用WebSocket構建交互式Web應用程序
- 使用REST訪問Neo4j數據
- jquery消費restful
- springboot跨域請求
- 消費SOAP Web服務
- springboot使用緩存
- 使用Vaadin創建CRUD UI
- 使用REST訪問JPA數據
- 使用REST訪問Pivotal GemFire中的數據
- 構建soap服務
- 使用rest訪問mongodb數據
- 構建springboot應用docker鏡像
- 從STS部署到Cloud Foundry
- springboot測試web應用
- springboot訪問mysql
- springboot編寫自定義模塊并使用
- 使用Google Cloud Pub / Sub進行消息傳遞
- 構建反應式RESTful Web服務
- 使用Redis主動訪問數據
- Spring Boot 部署到Kubernetes
- 使用反應式協議R2DBC訪問數據
- Spring Security架構
- spring構建Docker鏡像詳解
- Spring Boot和OAuth2
- springboot應用部署到k8s
- spring構建rest服務詳解