上下文設置
簡而言之, 企業集成模式就是如何使兩個應用程序(可能位于不同的技術堆棧,不同的機器,不同的網絡上)相互通信,以提供單個業務功能。 面臨的挑戰是如何確保這種通信對業務用戶保持透明,同時又對應用程序可靠且容易。 消息傳遞是模式之一。 使用此模式,應用程序可以使用可自定義的格式頻繁,立即,可靠和異步地相互通信。 應用程序通過在虛擬管道(稱為Channels )上發送數據(稱為Messages )來相互交談。 這是對該概念的過于簡單的介紹,但希望足以理解本文的其余部分。
Spring Integration不是任何模式的實現,但是它支持這些模式,主要是消息傳遞。
本文的其余部分將動手實踐,并且是Spring 3系列的擴展。本系列的早期文章包括:
- Hello World with Spring 3 MVC
- 使用Spring 3 MVC處理表單
- 使用Spring 3進行單元測試和記錄
- 使用Spring 3 MVC處理表單驗證
事不宜遲,讓我們開始吧。
裸露骨骼的Spring集成示例
在撰寫本文時,Spring的最新版本是3.1.2.RELEASE。 但是,最新版本的Spring Integration是2.1.3.RELEASE,可在Maven Central中找到。 我有些不滿意-回想起來不合邏輯-對Spring和Spring Integration應該具有不同的最新版本感到吃驚,但是,嘿,就是這樣。 這意味著我們的pom.xml現在應該添加一個(如果您想知道那是從何而來的,至少在很高的層次上,我需要在本文前面提到的Spring 3系列繼續學習)。
文件:/pom.xml
<!-- Spring integration -->
<dependency> <groupId>org.springframework.integration</groupId><artifactId>spring-integration-core</artifactId> <version>2.1.3.RELEASE</version>
</dependency>
pom中的這一依賴性現在允許我的應用程序通過channel發送消息 。 請注意,現在我們在Spring Integration領域中引用消息和通道,這不一定與本文前面在Enterprise Integration Patterns領域中引用的相同概念完全相同。 此時可能值得快速瀏覽一下《 Spring Integration參考手冊》 。 但是,如果您剛剛開始使用Spring Integration,那么暫時最好閱讀本文。 我建議您先洗手,然后再返回參考手冊,該手冊非常好,但也非常詳盡,因此對于初學者來說可能不勝枚舉。
為簡單起見,由于我通常嘗試(盡可能)嘗試第一種方法,因此讓我們嘗試編寫一些單元測試以創建消息,然后通過通道發送它,然后再接收它。 我在這里寫了關于如何在Spring 3應用程序中使用JUnit和Logback的博客 。 繼續相同的原理,假設我們要編寫一個HelloWorldTest.java,讓我們為測試設置Spring配置。
文件:\ src \ test \ resources \ org \ academy \ integration \ HelloWorldTest-context.xml
<?xml version='1.0' encoding='UTF-8'?>
<beans xmlns='http://www.springframework.org/schema/beans'xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:p='http://www.springframework.org/schema/p' xmlns:int='http://www.springframework.org/schema/integration' xsi:schemaLocation='http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/integration
http://www.springframework.org/schema/integration/spring-integration-2.1.xsd'><int:channel id='inputChannel'></int:channel><int:channel id='outputChannel'><int:queue capacity='10' /></int:channel><int:service-activator input-channel='inputChannel'output-channel='outputChannel' ref='helloService' method='greet' /><bean id='helloService'class='org.academy.integration.HelloWorld' /> </beans>
那么,我們只是做什么? 我們已經要求Spring Integration創建一個“ inputChannel”來發送消息。 從中讀取消息的“ outputChannel”。 我們還配置了將“ inputChannel”上的所有消息都移交給“ helloService”的功能。 此“ helloService”是org.academy.integration.HelloWorld類的實例,應具有對消息進行某些處理的能力。 之后,我們還配置了“ helloService”的輸出,即在這種情況下修改后的消息,將被移交給“ outputChannel”。 很簡單,不是嗎? 坦率地說,當我幾年前第一次與Spring Integration合作時,我發現所有這些都令人困惑。 直到我看到這個工作對我來說,這沒有多大意義。 因此,讓我們繼續前進。 讓我們添加關鍵業務 HelloWorld類。
文件:/src/main/java/org/academy/integration/HelloWorld.java
package org.academy.integration;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class HelloWorld {private final static Logger logger = LoggerFactory.getLogger(HelloWorld.class);public String greet(String name){logger.debug('Greeting {}', name); return 'Hello ' + name; }
}
如您所見,給定一個“名稱”,它將返回“ Hello {name}”。 現在,讓我們添加單元測試以實際執行此操作。
文件:/src/test/java/org/academy/integration/HelloWorldTest.java
package org.academy.integration;import static org.junit.Assert.*;import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.integration.MessageChannel;
import org.springframework.integration.core.PollableChannel;
import org.springframework.integration.message.GenericMessage;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class HelloWorldTest {private final static Logger logger = LoggerFactory.getLogger(HelloWorldTest.class);@Autowired@Qualifier('inputChannel')MessageChannel inputChannel;@Autowired@Qualifier('outputChannel')PollableChannel outputChannel;@Testpublic void test() {inputChannel.send(new GenericMessage<String>('World'));assertEquals(outputChannel.receive().getPayload(), 'Hello World');logger.debug('Checked basic Hello World with Spring Integration');}}
盡管不是強制性的,但我發現使用以下登錄設置更容易。 如果您愿意,可以隨時使用它。
文件:/src/main/resources/logback.xml
<?xml version='1.0' encoding='UTF-8'?>
<configuration><appender name='CONSOLE' class='ch.qos.logback.core.ConsoleAppender'><encoder><pattern>%d %5p | %t | %-55logger{55} | %m %n</pattern></encoder></appender><logger name='org.springframework'><level value='ERROR' /><!-- level value='INFO' /> --><!-- level value='DEBUG' /> --></logger><root><level value='DEBUG' /><appender-ref ref='CONSOLE' /></root>
</configuration>
現在,只需鍵入“ mvn -e clean install”(或使用m2e插件),您就應該能夠運行單元測試并確認給定的字符串“ World”,HelloWorld服務的確在整個通道安排中確實返回了“ Hello World”和消息。
同樣,可選但我強烈建議您運行“ mvn -e全新安裝站點”。 假設您已正確配置了一些代碼覆蓋率工具(在我的情況下為cobertura),將為您提供一個不錯HTML報告,其中顯示了代碼覆蓋率。 在這種情況下,它將是100%。 我已經寫了一系列關于代碼質量的文章 ,詳細介紹了該主題,但是總而言之,確保我使用和推薦使用的任何編碼實踐/框架都符合一些基本的代碼質量標準對我來說非常重要。 。 能夠進行單元測試和測量是我所做的這樣一項基本檢查。 毋庸置疑,一般來說,Spring(包括Spring集成)會通過帶有鮮艷色彩的檢查。
結論
本文就是這樣。 在下一篇文章中,我們將了解如何將應用程序代碼與我們當前的JUnit測試中具有的Spring Integration特定代碼 (即inputChannel.send(…)等) 隔離 。
建議進一步閱讀...
以下是本系列早期文章的鏈接:
- Hello World with Spring 3 MVC
- 使用Spring 3 MVC處理表單
- 使用Spring 3進行單元測試和記錄
- 使用Spring 3 MVC處理表單驗證
這些是我可以推薦的出色材料:
- Spring Integration入門
- Spring Integration的示例代碼
- Spring集成–第1節– Hello World
- Spring集成–第2節–更多世界
繼續與網關進行Spring集成
參考:在Tech for Enterprise博客中,我們的JCG合作伙伴 Partho 介紹了Spring Integration 。
翻譯自: https://www.javacodegeeks.com/2012/08/introducing-spring-integration.html