无法让聚合器工作

时间:2016-07-29 21:11:24

标签: spring-integration aggregator aggregators

我试图了解Aggregator的基础知识。以下是我试图实现的用例:

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>

一条订单消息将包含多个 orderItem 。我们可以在队列中预期数百条订单消息。

2)结果结果::

a)应将每个 orderitem 写入文件。

b) 4 此类文件应写入唯一的文件夹。

举个例子,假设我们收到了两条订单消息 - 每条消息包含三个 orderitem

所以我们需要创建2个文件夹:

在&#34;文件夹1&#34;中,应该有4个文件(每个文件中1 orderitem

在&#34;文件夹2&#34;中,应该有2个文件(每个文件中1 orderitem )。为简单起见,我们假设不再有订单消息,我们可以在5分钟后写入。

实现:

  1. 我能够从队列中读取消息(websphere MQ)并成功解组消息。
  2. 使用拆分程序根据 orderitem 计数拆分邮件。
  3. 使用聚合器将邮件分组为4。
  4. 根据我的理解,我无法让聚合器工作。

    1. 当4 orderitem 时,我推送了一个订单,邮件正在正确汇总。
    2. 我用5 orderitem 推送一个订单,前4个聚合,但最后一个发送到丢弃渠道。这是预期的,因为MessageGroup已被释放,因此最后一条消息将被丢弃。
    3. 我推送两个订单,每个订单包含2个 orderitem 。最后2个 orderitem 被发送到丢弃频道 相关策略是硬编码的(OrderAggregator.java),但上述情况应该有效。
    4. 需要有关如何实现此用例的指针,我可以在其中将它们分组并写入唯一文件夹。 请注意, orderitem 都是独立的图书订单,并且它们之间没有任何关系。

      以下是配置。

      弹簧bean.xml

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

      OrderAggregator.java

      public class OrderAggregator {
      
      @Aggregator
      public List<OrderItemType> sendList(List<OrderItemType> orderItemTypeList) {
      
          return orderItemTypeList;
      }
      
      @CorrelationStrategy
      public String groupOrders( OrderItemType orderItemType) {
      
          return "items";
      }
      
      }
      

      DisplayAggregatedList.java

      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);
      }
      }   
      

2 个答案:

答案 0 :(得分:1)

您需要的是expire-groups-upon-completion

  

设置为true(默认为false)时,将从邮件存储中删除已完成的组,从而允许具有相同关联的后续邮件组成新组。默认行为是将与已完成组具有相同相关性的消息发送到丢弃信道。

如果您还需要发布未完成的群组(例如,还剩2个订单),请考虑使用group-timeouthttp://docs.spring.io/spring-integration/reference/html/messaging-routing-chapter.html#agg-and-group-to

答案 1 :(得分:0)

请使用expire-groups-upon-completion =&#34; true&#34;并考虑使用MessageCountReleaseStrategy`进行发布策略 - Artem Bilan