消息传递在 OSGi DevCon 欧洲大会上与 OSGi 相遇

工程 | Iwein Fuld | 2009 年 6 月 23 日 | ...

昨天我在 OSGi DevCon 欧洲大会上发言,讨论如何使用 Spring Integration 和 dm Server 以务实的方式解决大型应用程序中的常见问题。 在我的演讲前后,我和一些人进行了交谈,他们希望获得更多关于这些想法的信息。 这篇博客将概述我所谈论的内容。

我将直接切入正题,总结一下演讲内容。

任何项目都会在其活跃开发的生命周期中增长。 通常,开发人员通过添加代码来添加功能并修复产品所有者提出的问题。 这个过程自然会增加代码库。 随着源代码的增长,维护和修复错误通常变得更加困难。 如果不加以处理,此过程最终将导致我所说的代码超新星。 正确的模块化可以对抗这种不受控制的增长和最终的崩溃,而 OSGi 是目前可用的更引人注目的药物之一。

我谈到的第二个问题是单线程崩溃。 在像 Tomcat 这样的 Servlet 容器中,这可以通过使用线程池来为客户端提供服务来缓解,但是如果单个请求代表一个大型作业,则在单个线程中运行它是浪费的。 对于更昂贵的服务调用,您需要划分工作。 此外,在批处理或中间件聚焦的系统中,您将无法奢侈地依赖 Web 容器来为您进行线程管理,因此您必须自己解决问题,或使用一个好的框架。

第三,模块化会对系统的响应时间产生负面影响。 这尤其适用于引入网络边界的模块化。 即使没有延迟,服务调用的结果也可能包含许多后续步骤,因此简单地等待它再呈现响应需要太长时间。

后两个问题通过消息传递解决,而 OSGi 在将网络延迟保持在最低限度方面起着重要作用。

如果您想获得一些背景信息,请查看演示文稿。

我做了一个 (简单的) 示例系统的演示,以及如何使用 SpringSource Tool Suite、dm Server 和 Spring Integration 进行开发。 我已经在之前的博客中详细介绍了这个想法(参见 dm Server 上的 Spring Integration),所以在这里我不会重复。 我选择了一个与当时我使用的城镇叫卖者不同的领域。 这是关于一辆公共汽车,有一个司机和一些乘客...... 我被告知几次应该有一个严肃的例子,但我似乎无法控制自己。 也许可以成为实施虚假股票交易系统并将其提交给 Spring Integration 示例的人? 我很喜欢做演示,它甚至有 Twitter!

只需一些片段,您就可以构建自己的 Twitter 集成。 我以前见过这方面的技术,但我再也找不到了,无论如何,这很简单。 Twitterer


import java.util.concurrent.atomic.AtomicInteger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.integration.annotation.MessageEndpoint;
import twitter4j.Twitter;
import twitter4j.TwitterException;

@MessageEndpoint
public class Twitterer {
	@Autowired
	Twitter twitter;

	private AtomicInteger counter = new AtomicInteger(0);

	public void tweet(String tweet) {
		if (counter.incrementAndGet() < 3) {
			try {
				twitter.updateStatus("Announcement: \" " + 
						tweet + "\"");
			} catch (TwitterException e) {
				throw new RuntimeException(e);
			}
		}
	}
}

在应用程序上下文中(为了简洁起见,省略了命名空间)


	<integration:outbound-channel-adapter ref="twitterer"
		method="tweet" channel="intercom" />

	<context:property-placeholder 
		location="classpath:/passenger/twitter.properties" />

	<beans:bean id="twitter" class="twitter4j.Twitter" 
		p:userId="${twitter.user}"
		p:password="${twitter.password}" />

Twitterer 负责发推文。 实际上,您可以将其替换为消息过滤器,但我不会建议将通道适配器直接连接到 twitter4j.Twitter.updateStatus(..) 方法。 如果你想看看会发生什么,请看这里

如果您想知道 twitter4j 捆绑包在哪里,我只是使用 SpringSource Tool Suite 中的 Bundlor 集成自己创建了它。 我花了不到 20 分钟,而且 完全无痛。 显然,有一个 问题已提交,因此它将在未来添加到我们的存储库中。

我希望您能理解这些想法,并在我不完整的地方进行补充。 我现在要去航海了,所以我的回复必须等到我完成之后,但不要让这阻止你。 一如既往地感谢您的反馈。

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

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

了解更多

获取支持

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

了解更多

即将举行的活动

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

查看全部