Spring integration 无法使聚合器工作

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> <

我试图了解聚合器的基本知识。下面是我尝试实现的用例:

1) 从队列中读取消息(订单详细信息)

<?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分钟后写作

实施:


  • 我能够从队列(websphere MQ)读取消息并成功地解组消息
  • 使用拆分器根据orderitem计数拆分邮件
  • 使用聚合器将邮件按4的大小分组
  • 我无法让聚合器按照我的理解工作

  • 我按下一个订单当4个订单项时,消息正确聚合
  • 我用5个订单项推一个,前4个被聚合,但最后一个被发送到丢弃通道。这是预期的,因为MessageGroup被释放,所以最后一条消息被丢弃
  • 我推送两个订单,每个订单包含2个订单项。最后2个订单项将被发送到丢弃频道。
    关联策略是硬编码的(OrderAggregator.java),但是上面的案例应该已经起作用了
  • 需要关于如何实现这个用例的指针,在这个用例中,我可以将它们分成4组,并写入唯一的文件夹。 请注意,订单项都是独立的图书订单,它们之间没有关系

    下面是配置

    spring-bean.xml
    
    ...
    ....
    
    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);
    }
    }