Spring integration 无法使聚合器工作
我试图了解聚合器的基本知识。下面是我尝试实现的用例: 1) 从队列中读取消息(订单详细信息)Spring integration 无法使聚合器工作,spring-integration,aggregator,aggregators,Spring Integration,Aggregator,Aggregators,我试图了解聚合器的基本知识。下面是我尝试实现的用例: 1) 从队列中读取消息(订单详细信息) <?xml version="1.0" encoding="UTF-8"?> <order xmlns="http://www.example.org/orders"> <orderItem> <isbn>12333454443</isbn> <quantity>4</quantity> <
<?xml version="1.0" encoding="UTF-8"?>
<order xmlns="http://www.example.org/orders">
<orderItem>
<isbn>12333454443</isbn>
<quantity>4</quantity>
</orderItem>
<orderItem>
<isbn>545656777</isbn>
<quantity>50</quantity>
</orderItem>
..
..
</order>
12333454443
4.
545656777
50
..
..
一条订单消息将包含多条订单项。我们可以预期队列中会有数百条订单消息
2) 最终结果:
a) 每个订单项都应写入一个文件
b) 4此类文件应写入唯一文件夹
举个例子,假设我们得到了两条order消息,每条消息包含三条orderitem
因此,我们需要创建两个文件夹:
在“文件夹1”中,应该有4个文件(每个文件中有1个orderitem)
在“文件夹2”中,应该有2个文件(每个文件中有1个orderitem)。这里为了简单起见,我们假设不再有订单消息出现,我们可以在5分钟后写作
实施:
关联策略是硬编码的(OrderAggregator.java),但是上面的案例应该已经起作用了
...
....
OrderAggregator.java
公共类OrderAggregator{
@聚合器
公共列表sendList(列表orderItemTypeList){
返回orderItemTypeList;
}
@相关策略
公共字符串groupOrders(OrderItemType OrderItemType){
返回“项目”;
}
}
DisplayAggregatedList.java
公共类显示聚合列表{
公共无效显示(列表orderItemTypeList){
System.out.println(“显示聚合”;
for(OrderItemType oit:orderItemTypeList){
System.out.println(“###Isbn:+oit.getIsbn()+”::数量:+oit.getQuantity());
}
}
公共无效显示已放弃(消息消息){
System.out.println(“显示已丢弃的信息”);
}
}
您需要的是:
设置为true(默认为false)时,将从消息存储中删除已完成的组,从而允许具有相同相关性的后续消息形成新组。默认行为是将与已完成组具有相同相关性的消息发送到丢弃通道
如果您需要释放未完成的组(例如,2个订单),请考虑使用<代码>组超时:
< P>请在完成时使用Excel组=“true”,并考虑使用MasaGeCeTeLeaseEngult'用于发布策略- Artem Bilan < /P>谢谢。聚合器似乎在为我的代码工作时不一致。根据我推送的消息数量,有时它会起作用。但是,下面的消息序列不起作用。1) 使用3个orderitem发布订单消息。(isbn#:001、002、003)2)使用1个orderitem发布订单消息。(isbn#:004)应在第二条消息之后释放消息。但是,第二条消息(Isbn:004)出现在discard频道中。下面的场景工作:1)带有5个orderitem的Post order消息。(isbn#:011012013 014015)2)使用5个orderitem发布订单消息。(isbn#:016、017、018、019、020)3)使用2个orderitem发布订单消息。(isbn#:021022)发布了三个消息组。第一组(0110103014)、第二组(015016017018)、第三组(019020021022)。但是,由于某些原因,在上次注释中共享的较早序列(3订单项+ 1订单项)不工作,请在完成时使用<代码>到期组=“true”,并考虑使用< /Cord> MeasAgEngReTeLeaseTebug > <代码>发布策略< /代码>。<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans">
<int:channel id="mqInbound"/>
<int:channel id="item"/>
<int:channel id="itemList"/>
<int:channel id="aggregatorDiscardChannel"/>
<int-jms:message-driven-channel-adapter id="jmsIn"
channel="mqInbound"
destination="requestQueue"
message- converter="orderMessageConverter"/>
<int:splitter input-channel="mqInbound" output-channel="item" expression="payload.orderItem"/>
<int:chain id="aggregateList" input-channel="item" output-channel="itemList" >
<int:header-enricher>
<int:header name="sequenceSize" expression="4" overwrite="true"/>
</int:header-enricher>
<int:aggregator correlation-strategy="orderAggregator" correlation-strategy-method="groupOrders" discard-channel="aggregatorDiscardChannel" />
</int:chain>
<int:service-activator input-channel="itemList" ref="displayAggregatedList" method="display"/>
<int:service-activator input-channel="aggregatorDiscardChannel" ref="displayAggregatedList" method="displayDiscarded"/>
<bean id="orderAggregator" class="com.samples.Aggregator.OrderAggregator"/>
<bean id="displayAggregatedList" class="com.samples.Aggregator.DisplayAggregatedList"/>
...
....
</beans>
public class OrderAggregator {
@Aggregator
public List<OrderItemType> sendList(List<OrderItemType> orderItemTypeList) {
return orderItemTypeList;
}
@CorrelationStrategy
public String groupOrders( OrderItemType orderItemType) {
return "items";
}
}
public class DisplayAggregatedList {
public void display(List <OrderItemType> orderItemTypeList) {
System.out.println("######## Display Aggregated ##############");
for(OrderItemType oit : orderItemTypeList) {
System.out.println("### Isbn :" + oit.getIsbn() + ":: Quantity :" + oit.getQuantity());
}
}
public void displayDiscarded(Message<?> message) {
System.out.println("######## Display Discarded ##############" + message);
}
}