Spring Integration:Spring 家族的新成员

工程 | Mark Fisher | 2007年12月14日 | ...

昨天早上,我在 The Spring Experience 会议上做了两个部分的演讲,题为“使用 Spring 实现企业集成模式”。第一个演讲概述了 Spring 对企业集成的核心支持,包括 JMS、remoting、JMX、调度和电子邮件。该演讲还高级别讨论了 Gregor Hohpe 和 Bobby Woolf 在同名书籍中介绍的几种企业集成模式。在第二个演讲中,我正式发布了“Spring Integration”,这是 Spring 家族的新成员。Spring Integration 在 Spring 的核心支持基础上构建,并提供了很大程度上受这些模式启发的更高抽象层次。在此,我想简要回顾一下我在该演讲中讨论的主题。您还可以阅读昨天发表在 eWeekInfoWorld 上的两篇关于 Spring Integration 的文章。

首先,我阐述了 Spring Integration 的目标和动机——即实现模型应该简单且无侵入性,从而与核心 Spring 原则保持哲学上的一致性。业务组件应与底层消息基础设施解耦,从而能够独立测试。框架应隐藏线程管理的复杂性,同时仍然允许完全配置线程池、队列容量和调度参数。定制扩展点应以良好定义的策略接口形式提供。应可能使用动态语言来实现集成逻辑,例如路由和转换。配置选项应包括通用 XML、特定领域命名空间支持和注解。在这些核心 Spring 原则的基础上,实现将利用核心 Spring 特性,包括生命周期管理、任务执行、面向切面编程、事务管理、动态语言支持、JMS、remoting、邮件和调度。

遵循这些目标和动机,Spring Integration 将简化企业集成解决方案的开发。由于概念和实现如此一致,这将方便那些开始探索 SOA 和 EDA 的现有 Spring 用户逐步采用。最后,作为 Spring 家族的一员,它将与 Spring 家族中的其他产品提供无缝兼容和及时的协同演进。

在讨论了这些目标和动机之后,我介绍了 API。核心组件是 Message、MessageChannel 和 MessageEndpoint。Message 是任何类型数据的容器,同时也是一个包含常见消息属性(ID、关联 ID、过期时间、返回地址、序列信息等)的消息头。MessageChannel 提供发送和接收方法,这些方法接受超时参数。接收方法还接受一个 MessageSelector,它有一个方法:boolean accept(Message message)。这是 MessageChannel 的基本接口定义。


public interface MessageChannel {
    boolean send(Message message);
    boolean send(Message message, long timeout);
    Message receive();
    Message receive(long timeout);
    Message receive(MessageSelector selector);
    Message receive(MessageSelector selector, long timeout); 
}

MessageEndpoint 连接一个 MessageHandler 到一个入站 MessageChannel 和/或一个出站 MessageChannel。MessageHandler 是一个通用接口,为转换器、路由器以及任何其他处理传入消息的组件提供了基础。


public interface MessageHandler {
    Message handle(Message message);
}

Channel Adapter 用于与外部数据源进行发送和接收。例如,要发送 JMS 消息,提供了 OutboundJmsChannelAdapter。在配置消息系统时,可以像向其他通道发送消息一样向该适配器发送消息。MessageBus 将各种端点和通道连接起来。这与 Spring ApplicationContext 连接对象的方式一致。实际上,MessageBus 本身是一个 ApplicationContextAware 对象,并从其上下文中检测各种消息组件。这与 Spring MVC 应用程序中 DispatcherServlet 的行为非常相似。Spring Integration 的命名空间支持提供了一种简洁的方式来配置组件。


<integration:message-bus/>

<integration:channel id="quotes"/>

<integration:endpoint input-channel="quotes" handler-ref="logger" handler-method="log">
   <integration:consumer period="1000"/>
</integration:endpoint>

另外,还支持注解。


@MessageEndpoint(input=&ldquo;inputChannel&rdquo;, defaultOutput=&ldquo;outputChannel&rdquo;)&rdquo;
public class SimpleAnnotatedEndpoint {

    @Handler
    public String sayHello(String name) {
        return "Hello " + name;
    }
}

转换和路由的注解(例如 @Router、@Splitter 和 @Aggregator)也将得到支持。此外,还可以使用注解创建“通道适配器”,例如用于输入的 @Polled 和用于输出的 @DefaultOutput(如果处理器返回消息且该消息未提供自己的“返回地址”)。例如,以下端点将每隔 5 秒打印“Hello World”。


@MessageEndpoint
public class SampleAnnotatedEndpoint {

    @Polled(period=5000)&rdquo;
    public String getName() {
        return "World";
    }

    @Handler
    public String sayHello(String name) {
        return "Hello " + name;
    }

    @DefaultOutput
    public void display(String message) {
        System.out.println(message);
    }
}

@MessageEndpoint 也与 Spring 2.5 的新组件检测能力“开箱即用”。因此,上述示例根本不需要任何 XML 配置。对于为单个方法创建端点而言,更简单的方式是使用该方法上的 @Subscriber 注解。


@Subscriber(channel=&ldquo;testChannel&rdquo;)&rdquo;
public void test(String s) {
    …
}

该注解和相应的 @Publisher 都可以通过 Spring Integration 命名空间中的一个 'annotation-driven' 元素启用。@Publisher 基于 Spring AOP 构建,用于发布方法的返回值。它还将支持其他通知类型,例如 'before' 和 'after-throwing'。

上述示例基于 Spring Integration 的 0.5 版本。因此,这些接口和注解可能会发生变化。事实上,我们特别希望在此早期阶段获得反馈。我已经在这里的 The Spring Experience 会议上与几位与会者进行了有趣的讨论,他们对这项新功能感到非常兴奋。1.0 里程碑 1 版本将于一月初发布,1.0 正式版将于 2008 年第二季度发布。1.0 正式版将支持多种配置格式(XML、命名空间和注解)、点对点和发布/订阅通道,以及多种适配器(最少包括:JMS、RMI、HttpInvoker、Hessian/Burlap、File、电子邮件、JDBC、流和 Spring ApplicationEvents)。它还将与 Spring 的事务管理和动态语言支持无缝协作。最后,它将与 Spring 家族中的其他产品集成,例如 Spring Web Services、Spring Web Flow、Spring MVC、Spring Batch 和 Spring Security。当然,我们还将与 Spring Dynamic Modules 项目密切合作,使消息组件支持 OSGi。

请继续关注本博客,未来几天将发布更多信息,包括代码仓库的公开可用性。另外,务必阅读昨天发表在 eWeekInfoWorld 上的那些文章。

订阅 Spring 新闻通讯

订阅 Spring 新闻通讯,保持联系

订阅

抢占先机

VMware 提供培训和认证,助您加速发展。

了解更多

获取支持

Tanzu Spring 通过一项简单的订阅,为 OpenJDK™、Spring 和 Apache Tomcat® 提供支持和二进制文件。

了解更多

近期活动

查看 Spring 社区的所有近期活动。

查看全部