在Spring Integration 2.0 M3中使用UDP和TCP适配器

工程 | Gary Russell | 2010年3月29日 | ...

Spring Integration 2.0里程碑版本3中引入的UDP和TCP通道适配器提供了轻量级通信,这些通信可以在两个或多个Spring Integration应用程序之间进行,也可以在Spring Integration应用程序与其他平台之间进行。

Oleg关于贷款经纪人的博客之后,我使用相同的示例来演示如何使用M3中提供的新的UDP适配器。假设贷款经纪公司首席执行官收到了部分客户的投诉,称几家银行报出的利率过高。他询问首席信息官是否可以暂时监控从银行返回的报价。

由于贷款经纪应用程序是使用Spring Integration构建的,因此可以轻松地拦截报价、过滤报价,并使用M3中的新IP适配器将它们发送到另一个应用程序。这可以通过最少的重新配置来完成;下图显示了如何使用多播将高利率报价发送到一个简单的Spring Roo应用程序以及Groovy和Perl脚本,或者实际上发送到任何支持IP的平台。

首先,让我们显式地添加聚合通道并拦截报价……


<int:channel id="quotesAggregationChannel">
    <int:interceptors>
        <int:wire-tap channel="loanSharkDetectorChannel"/>
    </int:interceptors>
</int:channel>

这会将每个报价发送到loanSharkDetectorChannel(以及聚合器)。

下一步是设置过滤器和通道以检测放高利贷者……


<int:channel id="loanSharkDetectorChannel" />

<int:filter id="loanSharkFilter"
        input-channel="loanSharkDetectorChannel"
        output-channel="loanSharkChannel"
        expression="payload.rate > 5.2"/>

<int:channel id="loanSharkChannel" />

<int:transformer ref="udpTransformer"
        input-channel="loanSharkChannel"
        output-channel="sharkOutChannel"/>

<int:channel id="sharkOutChannel" />

过滤器丢弃非高利贷者(报价<= 5.2%;转换器只是将LoanQuote转换为包含银行名称和利率的字符串,用逗号分隔)。

最后,我们添加UDP通道适配器;选择多播以便我们可以将报价发送到多个目的地……

	<int-ip:outbound-channel-adapter id="udpOut"
		channel="sharkOutChannel"
		protocol="udp"
		host="225.6.7.8"
		multicast="true"
		port="11111"/>

此适配器会将数据多播到多播地址225.6.7.8的11111端口。

现在让我们看一下接收端。首先,我使用以下脚本创建了一个简单的Roo应用程序……

project --topLevelPackage com.springframework.integration.loanbroker.loanshark
persistence setup --provider HIBERNATE --database HYPERSONIC_IN_MEMORY
entity --class ~.domain.LoanShark
field string --fieldName name
field number --type java.lang.Long --fieldName counter
field number --type java.lang.Double --fieldName averageRate 
finder add --finderName findLoanSharksByName
controller scaffold --class ~.web.SharkController
logging setup --level DEBUG
dependency add --artifactId org.springframework.integration.ip --groupId org.springframework.integration --version 2.0.0.M3
perform eclipse

(注意,在发出perform eclipse之前,我将pom.xml中的Spring版本更改为3.0.1.RELEASE-A)。

请参考Roo文档以了解这些步骤如何生成初始Roo应用程序。

最后,我在Roo应用程序中添加了一些Spring Integration。

	<int-ip:inbound-channel-adapter id="udpIn"
		channel="channel"
		multicast="true"
		protocol="udp"
		multicast-address="225.6.7.8"
		port="11111"/>
		
	<int:channel id="channel" />
	<int:transformer ref="transformer" 
		input-channel="channel"
		output-channel="transformedChannel"/>
	<int:channel id="transformedChannel" />		
	<int:service-activator 
		id="activator" 
		input-channel="transformedChannel"
		ref="accumulator" />
		
	<bean id="accumulator" class="com.springframework.integration.loanbroker.loanshark.biz.Accumulator" />
	<bean id="transformer" class="com.springframework.integration.loanbroker.loanshark.biz.SharkTransformer" />

通道适配器接收数据包([bankName],[rate]);转换器将数据转换为SharkQuote对象,然后将其传递给累加器。这会查找银行,如有必要则创建银行,递增计数器并计算该银行的平均利率。

这是Roo应用程序的屏幕截图;点击查看更大的图像。

LoanSharkRoo

此Groovy脚本也会看到数据包……


socket = new MulticastSocket(11111)
mcast = InetAddress.getByName("225.6.7.8")
socket.joinGroup(mcast)
buffer = (' ' * 1024) as byte[]
while(true) {
    incoming = new DatagramPacket(buffer, buffer.length)
    socket.receive(incoming)
    s = new String(incoming.data, 0, incoming.length)
    println ("**Shark** " + s)
}

……此Perl脚本也是如此……


#!/usr/bin/perl -w
use strict;
use IO::Socket::Multicast;
my $socket = IO::Socket::Multicast->new(LocalPort=>11111, ReuseAddr=>1)
  or die "Can't start UDP server: $@";
$socket->mcast_add('225.6.7.8');
my ($datagram,$flags);
while ($socket->recv($datagram,1024,$flags)) {
	print "**Shark** $datagram\n";
}
$socket->close();

您可能需要安装IO::Socket::Multicast才能使此脚本运行。

以上任一脚本都会创建此输出……

perl

结论

这只是对新的IP适配器的简要介绍。代码(对贷款经纪人和贷款鲨鱼Roo应用程序的更新)可在svn中获得。

https://src.springsource.org/svn/spring-integration/trunk/spring-integration-samples/loan-broker/
https://src.springsource.org/svn/spring-integration/trunk/spring-integration-samples/loanshark/

M3中也提供了TCP适配器;此处有相关介绍。

我们正在考虑为双向通信创建TCP/IP网关。如果您需要此功能,请投票支持JIRA问题

获取Spring通讯

通过Spring通讯保持联系

订阅

领先一步

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

了解更多

获取支持

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

了解更多

即将举行的活动

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

查看全部