Spring Integration完整示例

本文展示了如何使用Spring Integration与多个外部系统(包括HTTP和SOAP服务)交互,构建一个用户选择剧院并获取电影列表的应用。系统涵盖错误处理,记录用户请求,将消息存储到MongoDB以及发送错误通知邮件等功能。
摘要由CSDN通过智能技术生成

本文是我们名为“ Spring Integration for EAI ”的学院课程的一部分。

在本课程中,向您介绍了企业应用程序集成模式以及Spring Integration如何解决它们。 接下来,您将深入研究Spring Integration的基础知识,例如通道,转换器和适配器。 在这里查看

1.简介

本教程将详细介绍一个应用程序的完整示例,该应用程序使用Spring Integration提供的多个组件来为其用户提供服务。 该服务由一个系统提示用户选择不同的剧院组成。 选择后,系统将向所选剧院的外部系统发出请求,并返回其可用电影的列表。 每个电影院通过不同的API提供服务; 我们将在解释每个外部系统的部分(第三部分和第四部分)中看到这一点。

2.系统概述

以下活动图显示了系统的高级视图。

图1

图1

  • 用户界面 :在图的左侧,我们开始了流程; 请求用户条目。 系统显示的该进入请求以及对用户的系统响应都是与流集成的示例。
  • 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
下面是一个简单的Spring Integration MQTT示例代码: ```java @Configuration @EnableIntegration public class MqttConfiguration { @Value("${mqtt.broker.url}") private String brokerUrl; @Value("${mqtt.broker.username}") private String username; @Value("${mqtt.broker.password}") private String password; @Value("${mqtt.topic}") private String topic; @Value("${mqtt.client.id}") private String clientId; @Value("${mqtt.qos}") private int qos; @Bean public MqttConnectOptions mqttConnectOptions() { MqttConnectOptions mqttConnectOptions = new MqttConnectOptions(); mqttConnectOptions.setCleanSession(true); mqttConnectOptions.setUserName(username); mqttConnectOptions.setPassword(password.toCharArray()); return mqttConnectOptions; } @Bean public MqttPahoClientFactory mqttClientFactory() { DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory(); factory.setConnectionOptions(mqttConnectOptions()); return factory; } @Bean public MessageChannel mqttInputChannel() { return new DirectChannel(); } @Bean public MessageProducer inbound() { MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter( clientId, mqttClientFactory(), topic); adapter.setCompletionTimeout(5000); adapter.setConverter(new DefaultPahoMessageConverter()); adapter.setQos(qos); adapter.setOutputChannel(mqttInputChannel()); return adapter; } @Bean @ServiceActivator(inputChannel = "mqttInputChannel") public MessageHandler handler() { return new MessageHandler() { @Override public void handleMessage(Message<?> message) throws MessagingException { System.out.println(message.getPayload()); } }; } @Bean public MessageChannel mqttOutboundChannel() { return new DirectChannel(); } @Bean @ServiceActivator(inputChannel = "mqttOutboundChannel") public MessageHandler mqttOutbound() { MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler( clientId + "_out", mqttClientFactory()); messageHandler.setAsync(true); messageHandler.setDefaultQos(qos); return messageHandler; } @Bean public IntegrationFlow mqttOutFlow() { return IntegrationFlows .from(mqttOutboundChannel()) .handle(mqttOutbound()) .get(); } } ``` 其中,`mqtt.broker.url`、`mqtt.broker.username`、`mqtt.broker.password`、`mqtt.topic`、`mqtt.client.id`、`mqtt.qos`这些都是配置参数,需要在配置文件中进行配置。在这个示例代码中,我们使用了两个消息通道,`mqttInputChannel`和`mqttOutboundChannel`,用于接收和发送消息。使用`MqttPahoMessageDrivenChannelAdapter`来实现接收MQTT消息,使用`MqttPahoMessageHandler`来实现发送MQTT消息。在`handler()`方法中,我们将消息输出到控制台上。在`mqttOutbound()`方法中,我们配置发送消息的相关属性。 需要注意的是,这个示例代码并没有提供完整的配置,需要根据自己的实际情况进行修改和完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值