领先一步
VMware提供培训和认证,以加速您的进步。
了解更多在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应用程序的屏幕截图;点击查看更大的图像。
此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才能使此脚本运行。
以上任一脚本都会创建此输出……
结论
这只是对新的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问题。