领先一步
VMware提供培训和认证,以加速您的进步。
了解更多Spring Integration 1.0 GA版本在2个月前的SpringOne Americas上发布,从那时起我就一直想写一篇新的、最新的“入门”博客文章。好吧,每年的年初总是很忙碌,所以我的目标是提供一个包含10个步骤的实践示例。每个步骤大约需要一分钟...除非你停下来思考;)。所以,事不宜迟,我们开始吧!
您可以在这里获取最新版本(我写这篇文章时是1.0.1):http://www.springsource.com/download/community?project=Spring%20Integration
下载完成后,解压缩文件。您将看到一个“dist”目录,其中包含构成Spring Integration项目的JAR文件。您还会看到一个“lib”目录,其中包含依赖项。
我将使用Eclipse作为示例,但您当然可以在其他IDE中执行此操作。您也可以使用Maven或Ivy,但此处的示例非常简单,只需创建一个目录并添加JAR文件就足够了。
创建一个新的“Java项目”(在“Package Explorer”视图中,右键单击,然后“新建 -> Java项目),并在其中创建一个“lib”目录。然后,将以下JAR文件从Spring Integration的“dist”和“lib”目录复制到项目的“lib”中。**来自dist:**
刷新Eclipse中的“lib”目录(按F5),并将这些JAR文件添加到构建路径(选择JAR文件,右键单击,然后选择“构建路径 -> 添加到构建路径”)。最后,在“src”目录中创建一个“blog”包。
如果您使用的是Spring IDE或SpringSource 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>
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)。
现在,我们可以从上下文中访问通道并发送消息。因为我们还没有任何订阅者(将在接下来的几个步骤中介绍),所以我们也将从同一个通道接收。这将证明一切配置正确。修改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()方法的结果打印到控制台。
Spring Integration旨在实现非侵入性。这意味着我们现在将逐步修改示例,以便您没有代码直接绑定到框架。但是,我们要做的第一件事是添加一个POJO服务,该服务将成为我们消息的订阅者。此示例将简单地将字符串转换为大写并添加一些感叹号
public class Shouter {
public String shout(String s) {
return s.toUpperCase().concat("!!!");
}
}
服务可以作为一个普通的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"/>
修改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);
}
而不是在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”的文件中看到输出(您可以添加文件名生成器策略,但这超出了本文的范围)。
最后一步将实现完全非侵入性的目标。与其将消息发送到消息通道,不如将字符串作为参数发送到简单的接口会更简洁。在“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的主页上找到更多信息。