javascript
Spring Integration完整示例
本文是我們名為“ Spring Integration for EAI ”的學院課程的一部分。
在本課程中,向您介紹了企業應用程序集成模式以及Spring Integration如何解決它們。 接下來,您將深入研究Spring Integration的基礎知識,例如通道,轉換器和適配器。 在這里查看 !
目錄
1.簡介 2.系統概述 3.埃及劇院服務 4. Pantages劇院服務 5.用戶界面 6.記錄每個用戶請求 7.丟棄無效的條目 8.選擇要請求的劇院 9.請求埃及劇院 10.請求潘太及斯劇院 11.處理錯誤1.簡介
本教程將詳細介紹一個應用程序的完整示例,該應用程序使用Spring Integration提供的多個組件來為其用戶提供服務。 該服務由一個系統提示用戶選擇不同的劇院組成。 選擇后,系統將向所選劇院的外部系統發出請求,并返回其可用電影的列表。 每個電影院通過不同的API提供服務; 我們將在解釋每個外部系統的部分(第三部分和第四部分)中看到這一點。
2.系統概述
以下活動圖顯示了系統的高級視圖。
圖1
- 用戶界面 :在圖的左側,我們開始了流程; 請求用戶條目。 系統顯示的該進入請求以及對用戶的系統響應都是與流集成的示例。
- Web服務調用 :根據用戶的選擇,系統將從另一個外部系統檢索影片列表。 埃及劇院通過HTTP公開其服務,而潘塔基斯劇院則通過SOAP公開其服務。
- 錯誤處理 :如果在流程中出現錯誤,可能是由于意外異常或Web服務不可用,系統會將信息發送到另外兩個外部系統:noSQL數據庫( MongoDB )和電子郵件地址。
下一部分將更深入地介紹該系統的每個部分。
3.埃及劇院服務
埃及劇院系統通過HTTP公開他的服務。 在本節中,我們將快速瀏覽該應用程序。 這是一個包含RESTful Web服務的Spring 4 MVC應用程序。
控制器將請求檢索劇院中放映的所有可用電影:
@RestController @RequestMapping(value="/films") public class FilmController {FilmService filmService;@Autowiredpublic FilmController(FilmService service) {this.filmService = service;}@RequestMapping(method=RequestMethod.GET)public Film[] getFilms() {return filmService.getFilms();} }API很簡單,并且在此示例中,服務將返回一些虛擬值,因為本節的重點是僅提供有關調用外部系統的更多細節:
@Service("filmService") public class FilmServiceImpl implements FilmService {@Overridepublic Film[] getFilms() {Film film1 = new Film(1, "Bladerunner", "10am");Film film2 = new Film(2, "Gran Torino", "12pm");return new Film[]{film1, film2};} }Spring配置基于注釋:
<!-- Detects annotations like @Component, @Service, @Controller, @Repository, @Configuration --> <context:component-scan base-package="xpadro.spring.mvc.films.controller,xpadro.spring.mvc.films.service"/><!-- Detects MVC annotations like @RequestMapping --> <mvc:annotation-driven/>web.xml文件配置Web應用程序:
<!-- Root context configuration --> <context-param><param-name>contextConfigLocation</param-name><param-value>classpath:xpadro/spring/mvc/config/root-context.xml</param-value> </context-param><!-- Loads Spring root context, which will be the parent context --> <listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener><!-- Spring servlet --> <servlet><servlet-name>springServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:xpadro/spring/mvc/config/app-context.xml</param-value></init-param> </servlet> <servlet-mapping><servlet-name>springServlet</servlet-name><url-pattern>/spring/*</url-pattern> </servlet-mapping>因此,系統將處理發送到http://localhost:8080/rest-films/spring/films請求,其中rest-films是應用程序的上下文路徑。
4. Pantages劇院服務
Pantages Theatre服務通過SOAP公開其服務。 像埃及劇院一樣,它包含在Web應用程序中,但在這種情況下,它是通過Spring Web Services實現的 。
該終結filmRequest使用名稱空間http://www.xpadro.spring.samples.com/films服務于filmRequest請求。 響應是從電影服務收到的結果中構建的:
@Endpoint public class FilmEndpoint {@Autowiredprivate FilmService filmService;@PayloadRoot(localPart="filmRequest", namespace="http://www.xpadro.spring.samples.com/films")public @ResponsePayload FilmResponse getFilms() {return buildResponse();}private FilmResponse buildResponse() {FilmResponse response = new FilmResponse();for (Film film : filmService.getFilms()) {response.getFilm().add(film);}return response;} }電影服務也是虛擬服務,它將返回一些默認值:
@Service public class FilmServiceImpl implements FilmService {@Overridepublic List<Film> getFilms() {List<Film> films = new ArrayList<>();Film film = new Film();film.setId(new BigInteger(("1")));film.setName("The Good, the Bad and the Uggly");film.setShowtime("6pm");films.add(film);film = new Film();film.setId(new BigInteger(("2")));film.setName("The Empire strikes back");film.setShowtime("8pm");films.add(film);return films;} }Spring配置如下所示:
<!-- Detects @Endpoint since it is a specialization of @Component --> <context:component-scan base-package="xpadro.spring.ws"/><!-- detects @PayloadRoot --> <ws:annotation-driven/><ws:dynamic-wsdl id="filmDefinition" portTypeName="Films" locationUri="http://localhost:8080/ws-films"><ws:xsd location="/WEB-INF/schemas/xsd/film-service.xsd"/> </ws:dynamic-wsdl>最后, web.xml文件:
<context-param><param-name>contextConfigLocation</param-name><param-value>classpath:xpadro/spring/ws/config/root-config.xml</param-value> </context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener><servlet><servlet-name>Films Servlet</servlet-name><servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:xpadro/spring/ws/config/servlet-config.xml</param-value></init-param><load-on-startup>1</load-on-startup> </servlet><servlet-mapping><servlet-name>Films Servlet</servlet-name><url-pattern>/films/*</url-pattern> </servlet-mapping>根據此配置,Pantages Theatre應用程序將處理發送到http://localhost:8080/ws-films/films請求,其中ws-films是應用程序的上下文路徑。
5.用戶界面
一旦我們了解了將與Spring Integration應用程序進行通信的外部系統是什么,讓我們繼續看一下如何構建此應用程序。
獨立應用程序從引導Spring上下文的主要方法開始,該方法包含我們所有的集成組件。 接下來,它提示用戶輸入他的選擇:
public class TheaterApp {private static Logger logger = LoggerFactory.getLogger("mainLogger");static AbstractApplicationContext context;public static void main(String[] args) {context = new ClassPathXmlApplicationContext("classpath:xpadro/spring/integration/config/int-config.xml");context.registerShutdownHook();logger.info("\\nSelect your option (1-Egyptian Theater / 2-Pantages Theater / 0-quit):\\n");}public static void shutdown() {logger.info("Shutting down...");context.close();} }該應用程序還實現了一種關閉方法,該方法將由用戶調用。 我們將在后面的部分中更詳細地介紹這一點。
好的,現在用戶選擇將如何進入消息傳遞系統? 這是與流集成起作用的地方。 消息傳遞系統的系統條目是使用入站通道適配器實現的,該適配器將從stdin( System.in )中讀取。
<!-- System entry --> <int-stream:stdin-channel-adapter id="consoleIn" channel="systemEntry"><int:poller fixed-delay="1000" max-messages-per-poll="1" /> </int-stream:stdin-channel-adapter>通過使用輪詢器,入站通道適配器將嘗試每秒從System.read中讀取并將結果放入systemEntry通道。
現在,我們收到了一條帶有用戶條目作為其有效負載的Spring Integration消息。 我們可以使用端點來轉換數據并將其發送到所需的系統。 示例:控制臺將提示用戶在不同的劇院之間進行選擇:
2014-04-11 13:04:32,959|AbstractEndpoint|started org.springframework.integration.config.ConsumerEndpointFactoryBean#7Select your option (1-Egyptian Theater / 2-Pantages Theater / 0-quit):6.記錄每個用戶請求
系統要做的第一件事是記錄用戶選擇。 這是通過使用絲錐完成的 。 此竊聽是攔截器的實現,該攔截器將攔截通過通道(在我們的情況下為systemEntry通道)傳播的消息。 它不會改變流量; 該消息將繼續到達其目的地,但有線分流器還將其發送到另一個通道,通常用于監視。
在我們的應用程序中,該消息還將發送到日志記錄通道適配器。
<int:channel id="systemEntry"><int:interceptors><int:wire-tap channel="requestLoggingChannel"/></int:interceptors> </int:channel><int:logging-channel-adapter id="requestLoggingChannel" expression="'User selection: '.concat(payload)" level="INFO"/>日志記錄通道適配器由LoggingChannelAdapterParser實現。 它基本上創建了一個LoggingHandler ,它將使用Apache Commons Logging庫記錄消息的有效負載。 如果要記錄完整消息而不是僅記錄其有效負載,則可以將log-full-message屬性添加到log-full-message記錄通道適配器。
示例:日志顯示用戶所做的選擇
Select your option (1-Egyptian Theater / 2-Pantages Theater / 0-quit):1 2014-04-11 13:06:07,110|LoggingHandler|User selection: 17.丟棄無效的條目
看一眼用戶提示,我們看到系統接受三個有效條目:
logger.info("\\nSelect your option (1-Egyptian Theater / 2-Pantages Theater / 0-quit):\\n")無效條目的處理非常簡單; 系統將過濾無效條目,以防止它們在流程中向前移動。 這些丟棄的消息然后將被發送到discards通道。
訂閱invalidEntries丟棄通道,還有另一個流通道適配器,在這種情況下,是出站適配器:
<int:filter input-channel="systemEntry" output-channel="validEntriesChannel" ref="entryFilter" discard-channel="invalidEntries"/><!-- Invalid entries (show on console) --> <int:chain input-channel="invalidEntries"><int:transformer ref="discardsTransformer"/><int-stream:stdout-channel-adapter id="consoleOut" append-newline="true" /> </int:chain>該適配器的功能是寫入stdout( System.out ),因此用戶將收到用戶在控制臺上輸入了無效請求的信息。
要記住的一件事是我們沒有創建invalidEntries通道。 適配器將通過匿名臨時直接通道連接到過濾器。
示例:控制臺顯示用戶輸入了無效的選擇。
Select your option (1-Egyptian Theater / 2-Pantages Theater / 0-quit):8 2014-04-11 13:07:41,808|LoggingHandler|User selection: 8 Invalid entry: 88.選擇要請求的劇院
成功通過上一個過濾器的有效條目將被發送到路由器:
<!-- Valid entries (continue processing) --> <int:channel id="validEntriesChannel" /> <int:router input-channel="validEntriesChannel" ref="cinemaRedirector"/>該路由器負責確定用戶需要哪個外部系統的信息。 它還將檢測用戶何時要關閉該應用程序:
@Component("cinemaRedirector") public class CinemaRedirector {private static final String CINEMA_EGYPTIAN_CHANNEL = "egyptianRequestChannel";private static final String CINEMA_PANTAGES_CHANNEL = "pantagesRequestChannel";private static final String QUIT_REQUEST_CHANNEL = "quitRequestChannel";@Routerpublic String redirectMessage(Message<String> msg) {String payload = msg.getPayload();if ("1".equals(payload)) {return CINEMA_EGYPTIAN_CHANNEL;}else if ("2".equals(payload)) {return CINEMA_PANTAGES_CHANNEL;}return QUIT_REQUEST_CHANNEL;} }因此,這里的流程分為三個不同的通道,每個劇院的請求和完成流程的請求。
9.請求埃及劇院
為了與埃及劇院系統進行通信,我們需要發送一個HTTP請求。 我們通過使用HTTP出站網關來完成此任務。
<int-http:outbound-gateway url="http://localhost:8080/rest-films/spring/films" expected-response-type="java.lang.String" http-method="GET" charset="UTF-8"/>該網關配置了幾個屬性:
- expected-response-type :Web服務返回的返回類型將是一個字符串,其中包含帶有電影列表的JSON。
- http-method :我們正在發出GET請求。
- charset :用于將有效載荷轉換為字節的字符集。
收到響應后,我們將使用轉換器將返回的JSON轉換為Java對象。 在我們的例子中,我們將響應轉換為Film數組:
<int:json-to-object-transformer type="xpadro.spring.integration.model.Film[]"/>接下來,服務激活器將遍歷數組并構建更適合用戶的String。
<int:service-activator ref="restResponseHandler"/>實現如下所示:
@Component("restResponseHandler") public class RestResponseHandler {private static final String NEW_LINE = "\\n";@ServiceActivatorpublic String handle(Message<Film[]> msg) {Film[] films = msg.getPayload();StringBuilder response = new StringBuilder(NEW_LINE);if (films.length > 0) {response.append("Returned films:" + NEW_LINE);}else {response.append("No films returned" + NEW_LINE);}for (Film f:films) {response.append(f.getName()).append(NEW_LINE);}return response.toString();} }最后,我們將通過在控制臺上打印響應顯示給用戶。 我們正在使用與用于向用戶顯示其無效條目的通道適配器相同的通道適配器。 適配器將寫入System.out:
<int-stream:stdout-channel-adapter id="consoleOut" append-newline="true" />下一個代碼段顯示了完整的請求。 由于我不想為這些端點之間的每次交互創建消息通道,因此我使用了消息處理程序鏈。 當我們在序列中有多個端點時,這種類型的端點簡化了所需的XML配置。 通過使用消息處理程序鏈,其所有端點都通過匿名直接通道連接。
<!-- Egyptian Theater request --> <int:chain input-channel="egyptianRequestChannel"><int-http:outbound-gateway url="http://localhost:8080/rest-films/spring/films" expected-response-type="java.lang.String" http-method="GET" charset="UTF-8"/><int:json-to-object-transformer type="xpadro.spring.integration.model.Film[]"/><int:service-activator ref="restResponseHandler"/><int-stream:stdout-channel-adapter id="consoleOut" append-newline="true" /> </int:chain>示例:向用戶顯示了埃及劇院的電影列表。
1 2014-04-11 14:26:20,981|LoggingHandler|User selection: 1Returned films: Bladerunner Gran Torino10.請求潘太及斯劇院
我們將需要一個Web服務網關來與Pantages Theatre系統進行交互,但是首先,我們必須構建一個filmRequest類型的請求對象,以便由埃及Web服務端點進行服務。
我們正在使用轉換器將消息更改為電影Web服務請求:
<int:transformer ref="soapRequestTransformer"/>實現:
@Component("soapRequestTransformer") public class SoapRequestTransformer {@Transformerpublic Message<?> createRequestMessage(Message<String> msg) {return MessageBuilder.withPayload(new FilmRequest()).copyHeadersIfAbsent(msg.getHeaders()).build();} }我們獲得了請求對象,因此我們現在可以使用Web服務網關來調用Web服務:
<int-ws:outbound-gateway uri="http://localhost:8080/ws-films/films" marshaller="marshaller" unmarshaller="marshaller"/>如上一教程中所述,將需要編組器來轉換請求和響應。 對于此任務,我們將使用oxm名稱空間:
<oxm:jaxb2-marshaller id="marshaller" contextPath="xpadro.spring.integration.ws.types" />當我們收到Web服務響應時,它將采用FilmResponse的形式。 序列中的下一個端點將調整響應并返回一個String,以便在下一階段向用戶顯示:
<int:service-activator ref="soapResponseHandler"/>實現:
@Component("soapResponseHandler") public class SoapResponseHandler {private static final String NEW_LINE = "\\n";@ServiceActivatorpublic String handle(Message<FilmResponse> msg) {FilmResponse response = msg.getPayload();StringBuilder resp = new StringBuilder(NEW_LINE);if (response.getFilm().size() > 0) {resp.append("Returned films:" + NEW_LINE);}else {resp.append("No films returned" + NEW_LINE);}for (Film f : response.getFilm()) {resp.append(f.getName()).append(NEW_LINE);}return resp.toString();} }與埃及請求一樣,該請求也以另一個流出站通道適配器結束:
<int-stream:stdout-channel-adapter id="consoleOut" append-newline="true" />由于我們還有另一個端點序列,因此我們使用消息處理程序鏈來最大程度地減少所需的配置量:
<!-- Pantages Theater request --> <int:chain input-channel="pantagesRequestChannel"><int:transformer ref="soapRequestTransformer"/><int-ws:outbound-gateway uri="http://localhost:8080/ws-films/films" marshaller="marshaller" unmarshaller="marshaller"/><int:service-activator ref="soapResponseHandler"/><int-stream:stdout-channel-adapter id="consoleOut" append-newline="true" /> </int:chain>示例:向用戶顯示了Pantages Theatre電影列表。
2 2014-04-11 14:27:54,796|LoggingHandler|User selection: 2Returned films: The Good, the Bad and the Uggly The Empire strikes back11.處理錯誤
如果出現任何問題,我們需要以某種方式進行注冊。 發生這種情況時,應用程序將執行以下兩項操作:
- 將消息存儲到數據庫。
- 發送電子郵件到指定地址。
Spring Integration消息通道名為errorChannel將接收消息處理程序拋出的MessagingException類型的錯誤。 這個特殊頻道是一個發布-訂閱頻道,這意味著它可以有多個訂閱者。 我們的應用程序訂閱了兩個端點,以便執行先前指定的兩個操作。
將消息存儲到數據庫
以下服務激活器已預訂到錯誤通道,因此它將收到MessagingException:
<int:service-activator ref="mongodbRequestHandler"/>這個激活器將要做的是解決將請求發送到哪個劇院,然后它將構建一個FailedMessage對象,其中包含我們要記錄的信息:
@Component("mongodbRequestHandler") public class MongodbRequestHandler {private Logger logger = LoggerFactory.getLogger(this.getClass());@Autowiredprivate TheaterResolver theaterResolver;public FailedMessage handle(MessagingException exc) {logger.error("Request failed. Storing to the database");String theater = theaterResolver.resolve(exc);FailedMessage failedMsg = new FailedMessage(new Date(), exc.getMessage(), theater);return failedMsg;} }失敗的消息結構包含基本信息:
public class FailedMessage implements Serializable {private static final long serialVersionUID = 4411815706008283621L;private final Date requestDate;private final String messsage;private final String theater;public FailedMessage(Date requestDate, String message, String theater) {this.requestDate = requestDate;this.messsage = message;this.theater = theater;}public Date getRequestDate() {return new Date(requestDate.getTime());}public String getMessage() {return this.messsage;}public String getTheater() {return this.theater;} }構建消息后,我們將使用mongodb出站通道適配器將其存儲到數據庫中:
<int-mongodb:outbound-channel-adapter id="mongodbAdapter" collection-name="failedRequests" mongodb-factory="mongoDbFactory" />這部分流程的完整代碼如下所示:
<import resource="mongodb-config.xml"/><int:chain input-channel="errorChannel"><int:service-activator ref="mongodbRequestHandler"/><int-mongodb:outbound-channel-adapter id="mongodbAdapter" collection-name="failedRequests" mongodb-factory="mongoDbFactory" /> </int:chain>mongodb-config.xml文件包含特定于MongoDB配置的信息:
<bean id="mongoDbFactory" class="org.springframework.data.mongodb.core.SimpleMongoDbFactory"><constructor-arg><bean class="com.mongodb.Mongo"/></constructor-arg><constructor-arg value="jcgdb"/> </bean><bean id="mongoDbMessageStore" class="org.springframework.integration.mongodb.store.ConfigurableMongoDbMessageStore"><constructor-arg ref="mongoDbFactory"/> </bean>示例:以下屏幕快照顯示了兩個失敗請求后的集合,每個劇院類型一個:
圖2
向負責人發送電子郵件
訂閱錯誤通道的另一個端點是郵件請求處理程序。
<int:service-activator ref="mailRequestHandler"/>此處理程序負責創建MailMessage以便將其發送到郵件網關:
@Component("mailRequestHandler") public class MailRequestHandler {private Logger logger = LoggerFactory.getLogger(this.getClass());@Autowiredprivate TheaterResolver theaterResolver;@ServiceActivatorpublic MailMessage handle(MessagingException exc) {logger.error("Request failed. Sending mail");MailMessage mailMsg = new SimpleMailMessage();mailMsg.setFrom("Theater.System");mailMsg.setTo("my.mail@gmail.com");mailMsg.setSubject("theater request failed");String theater = theaterResolver.resolve(exc);StringBuilder textMessage = new StringBuilder("Invocation to ").append(theater).append(" failed\\n\\n").append("Error message was: ").append(exc.getMessage());mailMsg.setText(textMessage.toString());return mailMsg;} }劇院解析器檢查用戶選擇,并返回所請求劇院的名稱。
完整的配置如下:
<int:chain input-channel="errorChannel"><int:service-activator ref="mailRequestHandler"/><int-mail:outbound-channel-adapter mail-sender="mailSender" /> </int:chain><import resource="mail-config.xml"/>mail-config.xml包含Spring郵件發件人的配置:
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"><property name="host" value="smtp.gmail.com" /><property name="port" value="465" /><property name="username" value="my.mail@gmail.com" /><property name="password" value="myPassword" /><property name="javaMailProperties"><props><prop key="mail.smtp.starttls.enable">true</prop><prop key="mail.smtp.auth">true</prop><prop key="mail.smtp.socketFactory.class">javax.net.ssl.SSLSocketFactory</prop></props></property> </bean>示例:郵件發送到gmail帳戶:
圖3
12.關閉應用程序
出現提示時,用戶可以通過輸入零來決定完成應用程序的執行。 當他決定這樣做時,路由器會將消息重定向到quitRequestChannel通道(請參閱第8節)。 訂閱此頻道,我們已經配置了消息處理程序鏈:
<!-- Quit message (shutdown application) --> <int:chain input-channel="quitRequestChannel"><int:service-activator ref="shutdownActivator"/><int-event:outbound-channel-adapter/> </int:chain>服務激活器將創建一個ShutdownEvent并將其返回,以便由消息處理程序鏈的下一個端點進行處理:
@Component("shutdownActivator") public class ShutdownActivator {@ServiceActivatorpublic ShutdownEvent createEvent(Message<String> msg) {return new ShutdownEvent(this);} }ShutdownEvent是ApplicationEvent的實例。
public class ShutdownEvent extends ApplicationEvent {private static final long serialVersionUID = -198696884593684436L;public ShutdownEvent(Object source) {super(source);}public ShutdownEvent(Object source, String message) {super(source);}public String toString() {return "Shutdown event";} }事件出站通道適配器將發布為ApplicationEvent ,將發送到訂閱該通道的任何消息。 這樣,它們將由在應用程序上下文中注冊的任何ApplicationListener實例處理。 但是,如果消息的有效負載是ApplicationEvent的實例,則它將按原樣傳遞。 如前面的代碼所示,我們的ShutdownEvent是ApplicationEvent一個實例。
偵聽此類事件,我們已經注冊了一個偵聽器:
@Component("shutdownListener") public class ShutdownListener implements ApplicationListener<ShutdownEvent> {@Overridepublic void onApplicationEvent(ShutdownEvent event) {TheaterApp.shutdown();} }偵聽器用于關閉應用程序。 如果您記得第五節中的關閉方法, Theater應用程序將關閉應用程序上下文。
13.看一看完整的流程
為了簡化起見,我將所有集成元素都放在同一個文件中,但是我們可以考慮將其拆分為較小的文件:
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:int="http://www.springframework.org/schema/integration"xmlns:int-jms="http://www.springframework.org/schema/integration/jms"xmlns:int-stream="http://www.springframework.org/schema/integration/stream"xmlns:int-event="http://www.springframework.org/schema/integration/event"xmlns:int-http="http://www.springframework.org/schema/integration/http"xmlns:int-ws="http://www.springframework.org/schema/integration/ws"xmlns:int-mongodb="http://www.springframework.org/schema/integration/mongodb"xmlns:int-mail="http://www.springframework.org/schema/integration/mail"xmlns:oxm="http://www.springframework.org/schema/oxm"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration-3.0.xsdhttp://www.springframework.org/schema/integration/jms http://www.springframework.org/schema/integration/jms/spring-integration-jms-3.0.xsdhttp://www.springframework.org/schema/integration/stream http://www.springframework.org/schema/integration/stream/spring-integration-stream-3.0.xsdhttp://www.springframework.org/schema/integration/event http://www.springframework.org/schema/integration/event/spring-integration-event-3.0.xsdhttp://www.springframework.org/schema/integration/http http://www.springframework.org/schema/integration/http/spring-integration-http-3.0.xsdhttp://www.springframework.org/schema/integration/ws http://www.springframework.org/schema/integration/ws/spring-integration-ws-3.0.xsdhttp://www.springframework.org/schema/integration/mongodb http://www.springframework.org/schema/integration/mongodb/spring-integration-mongodb-3.0.xsdhttp://www.springframework.org/schema/integration/mail http://www.springframework.org/schema/integration/mail/spring-integration-mail-3.0.xsdhttp://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-3.0.xsd"><context:component-scan base-package="xpadro.spring.integration"/><!-- System entry --><int-stream:stdin-channel-adapter id="consoleIn" channel="systemEntry"><int:poller fixed-delay="1000" max-messages-per-poll="1" /></int-stream:stdin-channel-adapter><int:channel id="systemEntry"><int:interceptors><int:wire-tap channel="requestLoggingChannel"/></int:interceptors></int:channel><int:logging-channel-adapter id="requestLoggingChannel" expression="'User selection: '.concat(payload)" level="INFO"/><int:filter input-channel="systemEntry" output-channel="validEntriesChannel" ref="entryFilter" discard-channel="invalidEntries"/><!-- Invalid entries (show on console) --><int:chain input-channel="invalidEntries"><int:transformer ref="discardsTransformer"/><int-stream:stdout-channel-adapter id="consoleOut" append-newline="true" /></int:chain><!-- Valid entries (continue processing) --><int:channel id="validEntriesChannel" /><int:router input-channel="validEntriesChannel" ref="cinemaRedirector"/><!-- Quit message (shutdown application) --><int:chain input-channel="quitRequestChannel"><int:service-activator ref="shutdownActivator"/><int-event:outbound-channel-adapter/></int:chain><!-- Continue processing (get data) --><!-- Pantages Theater request --><int:chain input-channel="pantagesRequestChannel"><int:transformer ref="soapRequestTransformer"/><int-ws:outbound-gateway uri="http://localhost:8080/ws-films/films" marshaller="marshaller" unmarshaller="marshaller"/><int:service-activator ref="soapResponseHandler"/><int-stream:stdout-channel-adapter id="consoleOut" append-newline="true" /></int:chain><oxm:jaxb2-marshaller id="marshaller" contextPath="xpadro.spring.integration.ws.types" /><!-- Egyptian Theater request --><int:chain input-channel="egyptianRequestChannel"><int-http:outbound-gateway url="http://localhost:8080/rest-films/spring/films" expected-response-type="java.lang.String" http-method="GET" charset="UTF-8"/><int:json-to-object-transformer type="xpadro.spring.integration.model.Film[]"/><int:service-activator ref="restResponseHandler"/><int-stream:stdout-channel-adapter id="consoleOut" append-newline="true" /></int:chain><!-- Error handling --><import resource="mongodb-config.xml"/><int:chain input-channel="errorChannel"><int:service-activator ref="mongodbRequestHandler"/><int-mongodb:outbound-channel-adapter id="mongodbAdapter" collection-name="failedRequests" mongodb-factory="mongoDbFactory" /></int:chain><int:chain input-channel="errorChannel"><int:service-activator ref="mailRequestHandler"/><int-mail:outbound-channel-adapter mail-sender="mailSender" /></int:chain><import resource="mail-config.xml"/></beans>14.技術版本
對于此應用程序,我使用了Spring框架的3.2.8發行版和Spring Integration的最新3.0.2發行版。
完整的依賴項列表如下所示:
<properties><spring-version>3.2.8.RELEASE</spring-version><spring-integration-version>3.0.2.RELEASE</spring-integration-version><slf4j-version>1.7.5</slf4j-version><jackson-version>2.3.0</jackson-version><javax-mail-version>1.4.1</javax-mail-version> </properties><dependencies><!-- Spring Framework - Core --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring-version}</version></dependency><!-- Spring Framework - Integration --><dependency><groupId>org.springframework.integration</groupId><artifactId>spring-integration-core</artifactId><version>${spring-integration-version}</version></dependency><dependency><groupId>org.springframework.integration</groupId><artifactId>spring-integration-jms</artifactId><version>${spring-integration-version}</version></dependency><dependency><groupId>org.springframework.integration</groupId><artifactId>spring-integration-stream</artifactId><version>${spring-integration-version}</version></dependency><dependency><groupId>org.springframework.integration</groupId><artifactId>spring-integration-event</artifactId><version>${spring-integration-version}</version></dependency><dependency><groupId>org.springframework.integration</groupId><artifactId>spring-integration-http</artifactId><version>${spring-integration-version}</version></dependency><dependency><groupId>org.springframework.integration</groupId><artifactId>spring-integration-ws</artifactId><version>${spring-integration-version}</version></dependency><dependency><groupId>org.springframework.integration</groupId><artifactId>spring-integration-mongodb</artifactId><version>${spring-integration-version}</version></dependency><dependency><groupId>org.springframework.integration</groupId><artifactId>spring-integration-mail</artifactId><version>${spring-integration-version}</version></dependency><!-- javax.mail --><dependency><groupId>javax.mail</groupId><artifactId>mail</artifactId><version>${javax-mail-version}</version></dependency><!-- Jackson --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>${jackson-version}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>${jackson-version}</version></dependency><!-- Logging --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>${slf4j-version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>${slf4j-version}</version></dependency> </dependencies>翻譯自: https://www.javacodegeeks.com/2015/09/spring-integration-full-example.html
總結
以上是生活随笔為你收集整理的Spring Integration完整示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机笔记干货如何用电脑记笔记
- 下一篇: 怎么突破路由器网速限制如何破解路由器wi