2016-04-20 8 views
2

アグリゲータにタイムアウトを設定すると、メッセージグループ全体が将来(メモリ内に)格納され、ストレージには格納されないことに気づきました。これにより、高スループットが発生した場合に「Out Of Memory」例外が発生します。メモリ内のアグリゲータを使用したSpring統合タイムアウト

これを処理するより良い方法はありますか?

<aggregator input-channel="orderNotificationLoadBalancedExecutorChannelLATAM" output-channel="orderNotificationConverterChannelLATAM" 
      message-store="orderNotificationGroupStoreLATAM" 
      send-partial-result-on-expiry="true" 
      ref="firstOnlyPrimaryKeyMessageAggregator" 
      method="aggregate" 
      correlation-strategy-expression="headers['erpKeyMap']['erpKey']" 
      release-strategy-expression="#this[0].headers['tableName'].topLevel and #this[0].headers['operationType'].operationTypeDelete" 
      expire-groups-upon-completion="true" 
      expire-groups-upon-timeout="true" 
      group-timeout="5000"> 
</aggregator> 

答えて

2

おっと!

バグのようです。私はちょうど問題についてJIRAを提起しました。

有罪コードは次のようになります。だから、

private void scheduleGroupToForceComplete(final MessageGroup messageGroup) { 
... 
    ScheduledFuture<?> scheduledFuture = this.getTaskScheduler() 
     .schedule(new Runnable() { 

      @Override 
      public void run() { 
       try { 
        forceReleaseProcessor.processMessageGroup(messageGroup); 
        } 
        catch (MessageDeliveryException e) { 
         if (logger.isDebugEnabled()) { 
          logger.debug("The MessageGroup [ " + messageGroup + 
           "] is rescheduled by the reason: " + e.getMessage()); 
         } 
         scheduleGroupToForceComplete(messageGroup); 
        } 
       } 
      }, new Date(System.currentTimeMillis() + groupTimeout)); 

ScheduledFutureは、そのインラインRunnableコールバックを経由してfinal MessageGroupへの参照を保持しています。

私はgroupIdのみを使用して修正すると思います。

申し訳ありませんが、彼は永続的なメッセージストアを持っていますが、オプションのタイムアウトパラメータが設定されると、そのメッセージはまた、今度はメモリ内にあり、今後、内に保存されて何の回避策...

1

メッセージストアを設定できます。 hereを参照してください。それらが完了するまで

  • MessageGroupStoreへの言及は、それらの相関キーの下メッセージ のグループを格納するために使用されます。オプションで、 デフォルトでは、メモリ内の揮発性ストアです。
  • +0

    はありません。 – Benno

    +0

    上記設定を追加しました – Benno

    関連する問題