本文是我们名为“ Spring Integration for EAI ”的学院课程的一部分。
在本课程中,向您介绍了企业应用程序集成模式以及Spring Integration如何解决它们。 接下来,您将深入研究Spring Integration的基础知识,例如通道,转换器和适配器。 在这里查看 !
目录
1.简介
本教程将详细介绍一个应用程序的完整示例,该应用程序使用Spring Integration提供的多个组件来为其用户提供服务。 该服务由一个系统提示用户选择不同的剧院组成。 选择后,系统将向所选剧院的外部系统发出请求,并返回其可用电影的列表。 每个电影院通过不同的API提供服务; 我们将在解释每个外部系统的部分(第三部分和第四部分)中看到这一点。
2.系统概述
以下活动图显示了系统的高级视图。
- 用户界面 :在图的左侧,我们开始了流程; 请求用户条目。 系统显示的该进入请求以及对用户的系统响应都是与流集成的示例。
- Web服务调用 :根据用户的选择,系统将从另一个外部系统检索影片列表。 埃及剧院通过HTTP公开其服务,而潘塔基斯剧院则通过SOAP公开其服务。
- 错误处理 :如果在流程中出现错误,可能是由于意外异常或Web服务不可用,系统会将信息发送到另外两个外部系统:noSQL数据库( MongoDB )和电子邮件地址。
下一部分将更深入地介绍该系统的每个部分。
3.埃及剧院服务
埃及剧院系统通过HTTP公开他的服务。 在本节中,我们将快速浏览该应用程序。 这是一个包含RESTful Web服务的Spring 4 MVC应用程序。
控制器将请求检索剧院中放映的所有可用电影:
@RestController
@RequestMapping(value="/films")
public class FilmController {
FilmService filmService;
@Autowired
public FilmController(FilmService service) {
this.filmService = service;
}
@RequestMapping(method=RequestMethod.GET)
public Film[] getFilms() {
return filmService.getFilms();
}
}
API很简单,并且在此示例中,服务将返回一些虚拟值,因为本节的重点是仅提供有关调用外部系统的更多细节:
@Service("filmService")
public class FilmServiceImpl implements FilmService {
@Override
public 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 {
@Autowired
private 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 {
@Override
public 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/sprin