领先一步
VMware 提供培训和认证,助您加速进步。
了解更多昨天上午,我在The Spring Experience上进行了两次演讲,主题是“使用Spring进行企业集成模式”。第一次演讲概述了Spring对企业集成的核心支持,包括JMS、远程调用、JMX、调度和邮件。该演讲还高级讨论了几种由Gregor Hohpe和Bobby Woolf合著的同名书籍中介绍的企业集成模式。在第二次演讲中,我正式推出了“Spring Integration”,这是Spring产品组合中的一个新成员。Spring Integration建立在Spring的核心支持之上,提供了一个更高层次的抽象,很大程度上受到这些模式的启发。在这里,我想简要概述一下我在该会议上讨论的主题。你也可以阅读昨天在eWeek和InfoWorld上发表的两篇关于Spring Integration的文章。
首先,我描述了Spring Integration的目标和动机——即实现模型应该简单且非侵入性——与核心Spring原则保持哲学上的一致性。业务组件应该与底层消息传递基础设施解耦,从而可以独立进行测试。该框架应该隐藏线程管理的复杂性,同时仍然能够完全配置线程池、队列容量和调度参数。应提供自定义扩展点作为定义明确的策略接口。应该可以使用动态语言来实现集成逻辑,如路由和转换。配置选项应包括通用XML、特定于域的命名空间支持和注解。在构建这些核心Spring原则的同时,实现将利用核心Spring功能,包括生命周期管理、任务执行、面向切面的编程、事务管理、动态语言支持、JMS、远程调用、邮件和调度。
通过遵循这些目标和动机,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是一个通用接口,为转换器、路由器以及任何“处理”入站Message的组件提供基础。
public interface MessageHandler {
Message handle(Message message);
}
Channel Adapters用于向外部数据源发送和从外部数据源接收。例如,要发送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=“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 Integration命名空间中的一个“annotation-driven”元素启用。@Publisher基于Spring AOP来发布方法的返回值。它还将支持其他Advice类型,如“before”和“after-throwing”。
上面的示例基于Spring Integration的0.5版本。因此,这些接口和注解可能会发生变化。事实上,在这个早期阶段,我们特别关注反馈。我已经在The Spring Experience上与与会者进行了一些有趣的讨论,他们对这个新产品的前景非常兴奋。1.0 Milestone 1版本将于1月初发布,1.0最终版本将于2008年第二季度发布。1.0最终版本将支持多种配置格式(XML、命名空间和注解)、点对点和发布/订阅通道,以及多个适配器(最少包括:JMS、RMI、HttpInvoker、Hessian/Burlap、File、EMail、JDBC、stream和Spring ApplicationEvents)。它还将与Spring的事务管理和动态语言支持无缝集成。最后,它将与其他Spring产品组合中的产品集成,如Spring Web Services、Spring Web Flow、Spring MVC、Spring Batch和Spring Security。当然,我们还将与Spring Dynamic Modules项目紧密合作,使消息组件支持OSGi。
请继续关注此博客,了解未来几天更多信息,包括代码仓库的公开可用性。另外,请务必阅读昨天在eWeek和InfoWorld上发表的文章。