10分钟快速上手Spring Integration

工程 | Mark Fisher | 2009年2月13日 | ...

Spring Integration 1.0 GA版本在2个月前的SpringOne Americas上发布,从那时起我就一直想写一篇新的、最新的“入门”博客文章。好吧,每年的年初总是很忙碌,所以我的目标是提供一个包含10个步骤的实践示例。每个步骤大约需要一分钟...除非你停下来思考;)。所以,事不宜迟,我们开始吧!

步骤1:下载Spring Integration发行版

您可以在这里获取最新版本(我写这篇文章时是1.0.1):http://www.springsource.com/download/community?project=Spring%20Integration

下载完成后,解压缩文件。您将看到一个“dist”目录,其中包含构成Spring Integration项目的JAR文件。您还会看到一个“lib”目录,其中包含依赖项。

步骤2:创建项目

我将使用Eclipse作为示例,但您当然可以在其他IDE中执行此操作。您也可以使用Maven或Ivy,但此处的示例非常简单,只需创建一个目录并添加JAR文件就足够了。

创建一个新的“Java项目”(在“Package Explorer”视图中,右键单击,然后“新建 -> Java项目),并在其中创建一个“lib”目录。然后,将以下JAR文件从Spring Integration的“dist”和“lib”目录复制到项目的“lib”中。**来自dist:**

  • org.springframework.integration-1.0.1.RELEASE.jar
  • org.springframework.integration-file-1.0.1.RELEASE.jar
来自lib
  • com.springsource.org.aopalliance-1.0.0.jar
  • com.springsource.org.apache.commons.logging-1.1.1.jar
  • org.springframework.aop-2.5.6.A.jar
  • org.springframework.beans-2.5.6.A.jar
  • org.springframework.context-2.5.6.A.jar
  • org.springframework.core-2.5.6.A.jar
  • org.springframework.transaction-2.5.6.A.jar

刷新Eclipse中的“lib”目录(按F5),并将这些JAR文件添加到构建路径(选择JAR文件,右键单击,然后选择“构建路径 -> 添加到构建路径”)。最后,在“src”目录中创建一个“blog”包。

步骤3:开始Spring配置

如果您使用的是Spring IDESpringSource Tool Suite,您可以添加Spring项目特性,只需右键单击“blog”包即可创建新的bean定义文件。否则,只需创建以下文件并将其命名为“config.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:si="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-1.0.xsd">

</beans>

我们现在将添加一个单独的元素。这定义了一个消息通道,该通道由Java内存队列支持,并且一次最多可以容纳10条消息


<si:channel id="channel">
    <si:queue capacity="10"/>
</si:channel>

步骤4:定义一个Bootstrap Java类

Spring Integration组件只是嵌入到任何Spring ApplicationContext中。因此,我们只需根据此配置文件创建一个即可。如果在Web应用程序中运行,您可以使用Spring的ContextLoaderListener引导,或者如果您在dm Server中运行,它也会为您处理此操作。对于此简单示例,我们只需在名为Bootstrap(在“blog”包中)的类中创建一个main()方法


public class Bootstrap {

    public static void main(String[] args) {
        new ClassPathXmlApplicationContext("blog/config.xml");
    }

}

(在任何时候,要快速解析Eclipse中的导入,您可以使用Ctrl+Shift+O“组织导入”...或在Mac上使用Command+Shift+O)。

步骤5:发送和接收Spring Integration消息

现在,我们可以从上下文中访问通道并发送消息。因为我们还没有任何订阅者(将在接下来的几个步骤中介绍),所以我们也将从同一个通道接收。这将证明一切配置正确。修改main()方法,使其如下所示


public static void main(String[] args) {
    ApplicationContext context = new ClassPathXmlApplicationContext("blog/config.xml");
    PollableChannel channel = (PollableChannel) context.getBean("channel");
    channel.send(new StringMessage("Spring Integration rocks"));
    Message<?> reply = channel.receive();
    System.out.println("received: " + reply);
}

运行该代码时,您应该会看到消息的toString()方法的结果打印到控制台。

步骤6:创建服务

Spring Integration旨在实现非侵入性。这意味着我们现在将逐步修改示例,以便您没有代码直接绑定到框架。但是,我们要做的第一件事是添加一个POJO服务,该服务将成为我们消息的订阅者。此示例将简单地将字符串转换为大写并添加一些感叹号


public class Shouter {

    public String shout(String s) {
        return s.toUpperCase().concat("!!!");
    }

}

步骤7:将服务添加到Spring配置中

服务可以作为一个普通的bean添加


<bean id="shouter" class="blog.Shouter"/>

接下来,我们将添加一个“Service Activator”来连接服务bean到输入和输出通道。我们需要将现有的“channel”重命名为“output”,然后为输入添加一个简单的非缓冲通道。整个配置应如下所示


<si:channel id="input"/>

<si:channel id="output">
    <si:queue capacity="10"/>
</si:channel>

<si:service-activator input-channel="input"
                      output-channel="output"
                      ref="shouter"
                      method="shout"/>

<bean id="shouter" class="blog.Shouter"/>

步骤8:通过发送消息来调用服务

修改main()方法以将消息发送到输入通道并从输出通道接收。请注意,我们还在修改依赖项查找,并且通道被转换为不同的类型('input'通道是非缓冲的,因此它不是像输出通道那样的PollableChannel


public static void main(String[] args) {
    ApplicationContext context = new ClassPathXmlApplicationContext("blog/config.xml");
    MessageChannel input = (MessageChannel) context.getBean("input");
    PollableChannel output = (PollableChannel) context.getBean("output");
    input.send(new StringMessage("Spring Integration rocks"));
    Message<?> reply = output.receive();
    System.out.println("received: " + reply);
}

步骤9:将输出发送到文件

而不是在main()方法中轮询输出,我们可以通过添加Channel Adapter将结果直接发送到文件。首先,您可以从输出通道中删除queue子元素,因为不需要轮询


<si:channel id="output"/>

添加Channel Adapter。您可以指定任何现有目录,在Windows上,您应该包含驱动器盘符(例如,“C:/tmp”)


<file:outbound-channel-adapter channel="output" directory="/tmp"/>

接下来,您可以更新Bootstrap的main()方法,使其仅发送


public static void main(String[] args) {
    ApplicationContext context = new ClassPathXmlApplicationContext("blog/config.xml");
    MessageChannel input = (MessageChannel) context.getBean("input");
    input.send(new StringMessage("Spring Integration rocks"));
}

您还需要将'file'命名空间添加到XSD配置中。顶级'beans'元素应如下所示


<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:si="http://www.springframework.org/schema/integration"
       xmlns:file="http://www.springframework.org/schema/integration/file"
       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-1.0.xsd
            http://www.springframework.org/schema/integration/file
            http://www.springframework.org/schema/integration/file/spring-integration-file-1.0.xsd">

运行示例,您应该会在扩展名为“.msg”的文件中看到输出(您可以添加文件名生成器策略,但这超出了本文的范围)。

步骤10:创建网关接口

最后一步将实现完全非侵入性的目标。与其将消息发送到消息通道,不如将字符串作为参数发送到简单的接口会更简洁。在“blog”包中创建以下接口


public interface Gateway {

    void send(String s);

}

然后,将以下元素添加到您的配置中


<si:gateway id="gateway" service-interface="blog.Gateway" default-request-channel="input"/>

最后,在main方法中使用Gateway代替通道。现在,您只需传递一个字符串即可


public static void main(String[] args) {
    ApplicationContext context = new ClassPathXmlApplicationContext("blog/config.xml");
    Gateway gateway = (Gateway) context.getBean("gateway");
    gateway.send("Spring Integration rocks");
}

结论

希望这能提供一个对Spring Integration的不错介绍。需要记住的主要要点是,您可以轻松地创建一个专门的集成层,该层使用非侵入式的Spring编程模型。当您开始添加多个端点时,其真正价值就会显而易见。然后,您可能需要添加过滤器、转换器和路由器。

Spring Integration提供的功能远不止此示例中演示的功能。要了解更多信息,请查看'org.springframework.integration.samples'模块中的各种项目(源代码可在发行版的'src'目录中找到),并阅读参考文档。当然,您可以在Spring Integration的主页上找到更多信息。

获取Spring时事通讯

与Spring时事通讯保持联系

订阅

领先一步

VMware提供培训和认证,以加速您的进步。

了解更多

获取支持

Tanzu Spring在一个简单的订阅中提供对OpenJDK™、Spring和Apache Tomcat®的支持和二进制文件。

了解更多

即将举行的活动

查看Spring社区中所有即将举行的活动。

查看全部