javascript
Spring集成–从头开始应用程序,第1部分
開始之前
在本教程中,您將學習什么是Spring Integration ,如何使用它以及有助于解決哪些問題。 我們將從頭開始構建一個示例應用程序,并演示Spring Integration的一些核心組件。 如果您不熟悉Spring,請查看我編寫的另一本有關Spring的教程- 我們可以一起做一些Spring嗎? 還要注意,您不需要任何特殊的工具,但是您可以使用IntelliJ IDEA或Spring Tool Suite來獲得構建Spring Integration應用程序的最佳體驗(使用STS可以獲得一些精美的圖表)。 您可以按照本教程逐步操作并自己從頭開始創建應用程序,也可以繼續從github獲取代碼:
此處下載資源: https : //github.com/vrto/spring-integration-invoices
無論您喜歡哪種方式,都該開始了!
發票處理申請書-功能說明
想象一下,您在某家公司工作,該公司會定期從各種承包商那里收到大量發票。 我們將建立一個能夠接收發票,過濾掉相關發票,創建付款(本地或國外)并將其發送到某些銀行服務的系統。 即使該系統非常幼稚,當然也不適合企業使用,我們仍將嘗試在頭腦中以良好的可伸縮性,靈活性和分離的設計來構建它。
在繼續之前,您必須意識到一件事:Spring Integration是(不僅但主要是)關于消息傳遞的 。 Spring Integration基本上是嵌入式企業服務總線 ,可讓您無縫地將業務邏輯連接到消息傳遞通道。 可以通過編程方式(通過Spring Integration API)或自動(通過框架本身–更高級別的解耦)來處理消息。 消息是跨渠道傳播的東西。 消息具有標題和有效負載 –在我們的示例中,它們將是實際相關的內容(域類)。 讓我們看一下下面的圖片,它是系統的摘要,并遍歷了重要的部分:
在圖片上,您可以看到一個集成圖,該圖說明了我們的消息傳遞結構和系統的核心組件-它們用紅色數字標記。 讓我們來看一下(稍后我們將更詳細地介紹每個組件):
創建項目
到目前為止,您應該對系統的功能以及其結構有一個較高的概述。 在開始編碼之前,您將需要一個實際的Maven項目,并設置結構和所需的依賴關系。 如果您熟悉Maven,請參見下面的pom.xml文件,否則,如果您想節省一些時間,歡迎使用我為您創建的項目模板: 下載Maven項目模板 。
<?xml version='1.0' encoding='UTF-8'?> <project xmlns='http://maven.apache.org/POM/4.0.0'xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'xsi:schemaLocation='http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd'><modelVersion>4.0.0</modelVersion><groupId>spring-integration-invoices</groupId><artifactId>spring-integration-invoices</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>3.2.1.RELEASE</version></dependency><dependency><groupId>org.springframework.integration</groupId><artifactId>spring-integration-core</artifactId><version>2.2.1.RELEASE</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.16</version></dependency><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>13.0.1</version></dependency><dependency><groupId>org.testng</groupId><artifactId>testng</artifactId><version>6.5.2</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.7</source><target>1.7</target></configuration></plugin></plugins></build></project>現在,讓我們更詳細地介紹系統的六個主要組件,并獲得實際的代碼。
1.發票網關
首先,讓我們看一下Invoice的代碼-這將是系統中的核心類之一。 我將使用com.vrtoonjava軟件包作為根軟件包,使用發票和銀行業務作為子軟件包:
package com.vrtoonjava.invoices;import com.google.common.base.Objects;import java.math.BigDecimal;public class Invoice {private final String iban;private final String address;private final String account;private final BigDecimal dollars;public Invoice(String iban, String address, String account, BigDecimal dollars) {this.iban = iban;this.address = address;this.account = account;this.dollars = dollars;}public boolean isForeign() {return null != iban && !iban.isEmpty();}public String getAddress() {return address;}public String getAccount() {return account;}public BigDecimal getDollars() {return dollars;}public String getIban() {return iban;}@Overridepublic String toString() {return Objects.toStringHelper(this).add('iban', iban).add('address', address).add('account', account).add('dollars', dollars).toString();}}想象一下,我們從另一個系統(數據庫,Web服務或其他系統)獲取發票,但是我們不想將此部分耦合到集成層。 我們將為此使用網關組件。 Gateway引入了一個協議 ,該協議將客戶端代碼與集成層分離(在我們的案例中為Spring Integration依賴項)。 讓我們看一下InvoiceCollectorGateway的代碼:
package com.vrtoonjava.invoices;import java.util.Collection;/*** Defines a contract that decouples client from the Spring Integration framework.*/ public interface InvoiceCollectorGateway {void collectInvoices(Collection<Invoice> invoices);}現在,要實際使用Spring Integration,我們需要創建一個標準的Spring配置文件并使用Spring Integration名稱空間。 首先,這是invoices-int-schema.xml文件。 將其放入src / main / resources 。 請注意,我們已經定義了一個logging-channel-adapter ,這是一個特殊的通道,我們將從記錄器發送消息。 我們還使用竊聽 –您可以將其視為一種全局攔截器,它將向日志記錄器通道發送與日志記錄相關的消息。
<?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:int = 'http://www.springframework.org/schema/integration'xsi:schemaLocation = 'http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd'><!-- intercept and log every message --><int:logging-channel-adapter id='logger' level='DEBUG' /><int:wire-tap channel = 'logger' /> </beans>現在回到我們的網關。 我們已經定義了一個網關接口–這是客戶端將使用的依賴項。 當客戶端調用collectInvoices方法時,網關將向newInvoicesChannel通道發送一條新消息(包含List負載)。 這使客戶端與消息傳遞工具脫鉤,但是讓我們將結果放置到實際的消息傳遞通道中。 要配置網關,請將以下代碼添加到集成模式配置中:
<int:channel id = 'newInvoicesChannel' /><int:gateway id='invoicesGateway'service-interface='com.vrtoonjava.invoices.InvoiceCollectorGateway'><int:method name='collectInvoices' request-channel='newInvoicesChannel' /> </int:gateway>2.發票分割器
從網關,我們正在向包含發票集合的系統發送一條大消息,換句話說,消息具有“收集”類型的有效負載。 當我們要單獨處理發票時,我們將從newInvoicesChannel獲得結果并使用分離器組件,該組件將創建多條消息。 這些新消息中的每一個將具有發票類型的有效負載。 然后,我們將消息放置到新渠道– singleInvoicesChannel 。 我們將使用Spring Integration提供的默認拆分器(默認情況下,Spring Integration使用DefaultMessageSplitter來實現我們想要的功能)。 這是我們定義分離器的方式:
<int:splitterinput-channel='newInvoicesChannel'output-channel='singleInvoicesChannel' /><int:channel id = 'singleInvoicesChannel' />3.過濾一些發票
我們系統的業務用例要求我們僅自動處理發出少于$ 10,000的發票。 為此,我們將介紹一個過濾器組件。 我們將從singleInvoicesChannel抓取消息,對它們應用過濾邏輯,然后將匹配的結果寫入新的filterInvoicesChannel通道。 首先,讓我們創建一個標準的Java類,其中將包含針對單個發票的過濾邏輯。 請注意,我們使用@Component注釋(這使其成為標準的Spring bean),并使用@Filter注釋注釋過濾方法-這將告訴Spring Integration使用此方法過濾邏輯:
package com.vrtoonjava.invoices;import org.springframework.integration.annotation.Filter; import org.springframework.stereotype.Component;@Component public class InvoiceFilter {public static final int LOW_ENOUGH_THRESHOLD = 10_000;@Filterpublic boolean accept(Invoice invoice) {boolean lowEnough = invoice.getDollars().intValue() < LOW_ENOUGH_THRESHOLD;System.out.println('Amount of $' + invoice.getDollars()+ (lowEnough ? ' can' : ' can not') + ' be automatically processed by system');return lowEnough;}}請注意,這是一個標準的POJO,我們可以輕松對其進行單元測試 ! 就像我之前說過的那樣,Spring Integration并未將我們與其消息傳遞工具緊密耦合。 為了簡潔起見,我不在本教程中粘貼單元測試–但是,如果您有興趣, 請繼續下載github項目并親自查看測試 。
讓我們為消息傳遞層指定輸入/輸出通道,并將過濾器掛入。將以下代碼添加到集成模式配置中:
<int:filterinput-channel='singleInvoicesChannel'output-channel='filteredInvoicesChannel'ref='invoiceFilter' /><int:channel id = 'filteredInvoicesChannel' />4.路由發票
到目前為止,我們已經拆分并過濾了一些發票。 現在是時候更仔細地檢查每個發票的內容并決定是從當前國家(本地)還是從另一個國家(外國)發行的發票了。 為此,我們可以像以前一樣處理并將自定義類用于路由邏輯。 我們(出于演示目的)現在將采用另一種方法-我們將使用Spring Expression Language(SpEL)來完全聲明性地使用和處理路由。 還記得發票類上的isForeign方法嗎? 我們可以在路由器聲明中使用SpEL直接調用它(通過使用selector-expression屬性)! 路由器將查看有效負載,評估它是國外發票還是本地發票,并將其轉發到相應的渠道:
<int:recipient-list-router input-channel='filteredInvoicesChannel'><int:recipient channel = 'foreignTransactions' selector-expression='payload.foreign' /><int:recipient channel = 'localTransactions' selector-expression='!payload.foreign' /> </int:recipient-list-router><int:channel id = 'foreignTransactions' /> <int:channel id = 'localTransactions' /> 我們將在本教程的第二部分中繼續開發此應用程序。
參考: Spring Integration –從頭開始的應用程序,來自 vrtoonjava博客的JCG合作伙伴 Michal Vrtiak的第1部分 。
翻譯自: https://www.javacodegeeks.com/2013/03/spring-integration-application-from-scratch-part-1.html
總結
以上是生活随笔為你收集整理的Spring集成–从头开始应用程序,第1部分的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 任正非:华为要建立高端人才储备库
- 下一篇: 通过Spring Social推特Sta