领先一步
VMware 提供培训和认证,以加速您的进步。
了解更多昨天我在 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 分钟,而且 完全无痛。 显然,有一个 问题已提交,因此它将在未来添加到我们的存储库中。
我希望您能理解这些想法,并在我不完整的地方进行补充。 我现在要去航海了,所以我的回复必须等到我完成之后,但不要让这阻止你。 一如既往地感谢您的反馈。