领先一步
VMware 提供培训和认证,以加快您的进度。
了解更多昨天上午,我在Spring 体验大会上做了一个两部分的演讲,题目是“使用 Spring 的企业集成模式”。第一个演讲包括对 Spring 对企业集成的核心支持的概述——包括 JMS、远程调用、JMX、调度和电子邮件。该演讲还对 Gregor Hohpe 和 Bobby Woolf 在同名书籍中介绍的几种企业集成模式进行了高级讨论。在第二个演讲中,我正式发布了“Spring 集成”——Spring 产品组合中的一个新成员。Spring 集成在 Spring 的核心支持的基础上构建,同时提供更高层次的抽象,很大程度上受到这些模式的启发。在这里,我想简要概述一下我在该演讲中讨论的主题。您还可以阅读昨天发表在eWeek和InfoWorld上的两篇关于 Spring 集成的文章。
首先,我描述了 Spring 集成的目标和动机——即实现模型应该简单且非侵入式——与 Spring 的核心原则保持一致。业务组件应该与底层消息基础设施解耦,因此可以在隔离状态下进行测试。框架应该隐藏线程管理的复杂性,同时仍然能够完全配置线程池、队列容量和调度参数。自定义扩展点应作为定义明确的策略接口提供。应该可以使用动态语言进行集成逻辑,例如路由和转换。配置选项应包括通用 XML、特定于领域的命名空间支持和注解。在构建这些 Spring 核心原则的同时,实现将利用 Spring 的核心特性,包括生命周期管理、任务执行、面向方面的编程、事务管理、动态语言支持、JMS、远程调用、邮件和调度。
通过遵循这些目标和动机,Spring 集成将简化企业集成解决方案的开发。由于概念和实现非常一致,因此它将促进现有 Spring 用户开始探索 SOA 和 EDA 的增量采用。最后,作为 Spring 产品组合的成员,它将提供与 Spring 产品组合中其他产品的无缝兼容性和及时的协同演进。
在讨论了这些目标和动机之后,我介绍了 API。核心组件是 Message、MessageChannel 和 MessageEndpoint。Message 是任何类型数据的容器,以及提供通用消息属性(ID、相关 ID、过期时间、返回地址、序列信息等)的 header。MessageChannel 提供发送和接收方法,这些方法接受超时。receive 方法还接受具有单个方法的 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 是一个通用接口,它为转换器、路由器以及任何其他处理传入 Message 的组件提供了基础。
public interface MessageHandler {
Message handle(Message message);
}
通道适配器用于向外部数据源发送和接收数据。例如,为了发送 JMS 消息,提供了 OutboundJmsChannelAdapter。在配置消息系统时,可以像对待另一个通道一样向该适配器发送消息。MessageBus 将各种端点和通道连接在一起。这与 Spring ApplicationContext 将对象连接在一起的方式一致。实际上,MessageBus 本身就是一个 ApplicationContextAware 对象,并从其上下文中检测各种消息组件。这与 Spring MVC 应用程序中 DispatcherServlet 的行为非常相似。Spring 集成的命名空间支持提供了一种简洁的方式来配置组件。
<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=“inputChannel”, defaultOutput=“outputChannel”)”
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)”
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=“testChannel”)”
public void test(String s) {
â¦
}
该注解和相应的 @Publisher 都通过 Spring 集成命名空间中的单个“annotation-driven”元素启用。@Publisher 在 Spring AOP 的基础上构建,以便发布方法的返回值。它还将支持其他 advice 类型,例如“before”和“after-throwing”。
以上示例基于 0.5 版本的 Spring 集成。因此,这些接口和注解可能会发生变化。事实上,在这个早期阶段,我们特别希望得到反馈。我已经与 Spring 体验大会的几位与会者进行了多次有趣的讨论,他们对这个新产品的可能性非常兴奋。1.0 里程碑 1 版本将于 1 月初发布,1.0 正式版将于 2008 年第二季度发布。1.0 正式版将支持多种配置格式(XML、命名空间和注解)、点对点和发布/订阅通道以及多个适配器(至少:JMS、RMI、HttpInvoker、Hessian/Burlap、文件、电子邮件、JDBC、流和 Spring ApplicationEvents)。它还将与 Spring 的事务管理和动态语言支持无缝协作。最后,它将与 Spring 产品组合中的其他产品集成,例如 Spring Web Services、Spring Web Flow、Spring MVC、Spring Batch 和 Spring Security。当然,我们还将与 Spring 动态模块项目紧密合作,以支持 OSGi 消息组件。
请继续关注此博客,以便在接下来的几天内了解更多信息,包括代码存储库的公开可用性。此外,请务必阅读昨天在eWeek和InfoWorld上发表的文章。