014 使用JMS處理消息

原文

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

直譯

創建一個消息接收器
Spring提供了向任何POJO發佈消息的方法。

在本指南中,您將瞭解如何通過JMS消息代理髮送消息。首先,讓我們創建一個非常簡單的POJO,它體現了電子郵件的細節。付款說明,我們不會發送電子郵件。我們只是將詳細信息從一個地方發送到另一個地方,以便在郵件中發送什麼內容。

src/main/java/hello/Email.java

package hello;

public class Email {

    private String to;
    private String body;

    public Email() {
    }

    public Email(String to, String body) {
        this.to = to;
        this.body = body;
    }

    public String getTo() {
        return to;
    }

    public void setTo(String to) {
        this.to = to;
    }

    public String getBody() {
        return body;
    }

    public void setBody(String body) {
        this.body = body;
    }

    @Override
    public String toString() {
        return String.format("Email{to=%s, body=%s}", getTo(), getBody());
    }

}

這個POJO非常簡單,包含兩個字段to和body,以及假設的getter和setter集合。

從這裏,您可以定義消息接收器:

src/main/java/hello/Receiver.java

package hello;

import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;

@Component
public class Receiver {

    @JmsListener(destination = "mailbox", containerFactory = "myFactory")
    public void receiveMessage(Email email) {
        System.out.println("Received <" + email + ">");
    }

}

Receiver也被稱爲消息驅動的POJO。正如您在上面的代碼中所看到的,不需要實現任何特定的接口或方法具有任何特定的名稱。此外,該方法可以具有非常靈活的簽名。請特別注意,此類在JMS API上沒有導入。

該JmsListener註解定義的名稱Destination,該方法應該聽和參考JmsListenerContainerFactory用於創建基礎消息偵聽容器。嚴格地說,除非您需要自定義容器的構建方式,否則不需要最後一個屬性,因爲Spring Boot會在必要時註冊默認工廠。

該參考文檔涵蓋得更詳細。

使用Spring發送和接收JMS消息
接下來,連接發送器和接收器。

src/main/java/hello/Application.java

package hello;

import javax.jms.ConnectionFactory;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jms.DefaultJmsListenerContainerFactoryConfigurer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.jms.annotation.EnableJms;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.jms.config.JmsListenerContainerFactory;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.support.converter.MappingJackson2MessageConverter;
import org.springframework.jms.support.converter.MessageConverter;
import org.springframework.jms.support.converter.MessageType;

@SpringBootApplication
@EnableJms
public class Application {

    @Bean
    public JmsListenerContainerFactory<?> myFactory(ConnectionFactory connectionFactory,
                                                    DefaultJmsListenerContainerFactoryConfigurer configurer) {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        // This provides all boot's default to this factory, including the message converter
        configurer.configure(factory, connectionFactory);
        // You could still override some of Boot's default if necessary.
        return factory;
    }

    @Bean // Serialize message content to json using TextMessage
    public MessageConverter jacksonJmsMessageConverter() {
        MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
        converter.setTargetType(MessageType.TEXT);
        converter.setTypeIdPropertyName("_type");
        return converter;
    }

    public static void main(String[] args) {
        // Launch the application
        ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);

        JmsTemplate jmsTemplate = context.getBean(JmsTemplate.class);

        // Send a message with a POJO - the template reuse the message converter
        System.out.println("Sending an email message.");
        jmsTemplate.convertAndSend("mailbox", new Email("[email protected]", "Hello"));
    }

}

@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,您無需處理配置任何管道或基礎結構。

@EnableJms觸發發現帶註釋的方法@JmsListener,在封面下創建消息監聽器容器。

爲清楚起見,我們還定義了一個在接收器註釋中myFactory引用的bean JmsListener。因爲我們使用DefaultJmsListenerContainerFactoryConfigurerSpring Boot提供的基礎結構,所以JmsMessageListenerContainer它與默認情況下引導創建的基礎結構相同。

默認MessageConverter是能夠轉換隻有基本類型(例如String,Map,Serializable)我們Email是不是Serializable故意的。我們想要使用Jackson並以文本格式將內容序列化爲json(即作爲a TextMessage)。Spring Boot將檢測a的存在,MessageConverter並將其與默認值JmsTemplate和任何JmsListenerContainerFactory創建者相關聯DefaultJmsListenerContainerFactoryConfigurer。

JmsTemplate使消息發送到JMS目的地變得非常簡單。在mainrunner方法中,啓動後,您可以使用jmsTemplate發送EmailPOJO。因爲我們的自定義MessageConverter已自動關聯到它,所以只會生成一個json文檔TextMessage。

您沒有看到定義的兩個bean是JmsTemplate和ConnectionFactory。這些是由Spring Boot自動創建的。在這種情況下,ActiveMQ代理運行嵌入式。

默認情況下,Spring Boot會創建一個JmsTemplate配置爲通過將pubSubDomain設置爲false 來傳輸到隊列。在也被配置是相同的。要覆蓋,請通過Boot的屬性設置(內部或環境變量)進行設置。然後確保接收容器具有相同的設置。JmsMessageListenerContainerspring.jms.isPubSubDomain=trueapplication.properties

Spring JmsTemplate可以通過它的receive方法直接接收消息,但這隻能同步工作,這意味着它會阻塞。這就是爲什麼我們建議您使用偵聽器容器,例如DefaultMessageListenerContainer使用基於緩存的連接工廠,這樣您就可以異步使用消息並以最大的連接效率。

構建可執行的JAR

您可以使用Gradle或Maven從命令行運行該應用程序。或者,您可以構建一個包含所有必需依賴項,類和資源的可執行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{[email protected], body=Hello}>

摘要

恭喜!您剛剛開發了基於JMS的消息的發佈者和使用者。

擴展知識

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