2011-10-01 3 views
1

mule 3.x에서 완전히 맞춤형 어 그리 게이터를 생성하기위한 권장 방법은 무엇입니까? 완전히 사용자 정의, 나는 상관 ID를, 메시지 수, 등을 사용하지, 내 자신의 논리에 따라 의미Mule에서 커스텀 어 그리 게이터를 만드는 방법은?

mulesoft 사이트의 문서 오래된, 3.X에 존재하지 않는 AbstractEventAggregator를 사용하여 말하고있다 :

http://www.mulesoft.org/docs/site/3.2.0/apidocs/org/mule/routing/AbstractAggregator.html

그러나, 아니이 있습니다 :이 클래스는 3.X에 AbstractAggregator로 이름이 바뀌 었습니다처럼 깊이 파고

http://www.mulesoft.org/documentation/display/MULE3USER/Message+Splitting+and+Aggregatio

, 그것은 보인다 이것을 사용하는 방법을 보여주는 예제. 위의 첫 번째 링크에서 설명한 LoanBroker 예제는 실제로 상관 어 그리 게이터를 사용합니다 (2.x 예에서는 문서가 참조하는 것으로 가정합니다).

한순간에 추상 메소드 shouldAggregate 및 doAggregate를 가진 추상 클래스가있었습니다. 이것은 내가 확장하고 싶은 종류의 수업입니다.

답변

4

AbstractAggregator의 서브 클래 싱 예제는 아래 TestAggregator을 참조하십시오.

import org.mule.DefaultMuleEvent; 
import org.mule.DefaultMuleMessage; 
import org.mule.api.MuleContext; 
import org.mule.api.MuleEvent; 
import org.mule.api.store.ObjectStoreException; 
import org.mule.api.transformer.TransformerException; 
import org.mule.routing.AbstractAggregator; 
import org.mule.routing.AggregationException; 
import org.mule.routing.EventGroup; 
import org.mule.routing.correlation.CollectionCorrelatorCallback; 
import org.mule.routing.correlation.EventCorrelatorCallback; 
import org.mule.util.concurrent.ThreadNameHelper; 

import java.util.Iterator; 

public class TestAggregator extends AbstractAggregator 
{ 
    @Override 
    protected EventCorrelatorCallback getCorrelatorCallback(MuleContext muleContext) 
    { 
     return new CollectionCorrelatorCallback(muleContext,false,storePrefix) 
     { 
      @Override 
      public MuleEvent aggregateEvents(EventGroup events) throws AggregationException 
      { 
       StringBuffer buffer = new StringBuffer(128); 

       try 
       { 
        for (Iterator<MuleEvent> iterator = events.iterator(); iterator.hasNext();) 
        { 
         MuleEvent event = iterator.next(); 
         try 
         { 
          buffer.append(event.transformMessageToString()); 
         } 
         catch (TransformerException e) 
         { 
          throw new AggregationException(events, null, e); 
         } 
        } 
       } 
       catch (ObjectStoreException e) 
       { 
        throw new AggregationException(events,null,e); 
       } 

       logger.debug("event payload is: " + buffer.toString()); 
       return new DefaultMuleEvent(new DefaultMuleMessage(buffer.toString(), muleContext), events.getMessageCollectionEvent()); 
      } 
     }; 
    } 
} 
+0

감사합니다. 나는 이것을 밖으로 시험 할 것이다. 내 자신의 논리를 제공하기 위해 CollectionCorrelatorCallback.shouldAggregateEvents()를 재정의해야합니까? 아니면 EventCorrelatorCallback을 구현하는 자체 클래스를 만들 것을 권장합니까? – awynne

+0

메시지 수에 전혀 의지하지 않기 때문에 eventCorrelatorCallback을 구현하는 것이 좋습니다. event.getMessage(). getCorrelationGroupSize()를 사용하여 집계 할 이벤트 수를 결정하지 않습니다.). –

+0

EventCorrelatorCallback이 EventCorrelator에 의해 호출됨을 알게되었습니다. EventCorrelator는 상관 ID로 이벤트를 그룹화한다고 가정합니다. 그래서 나는 correlId를 "인위적으로"어딘가에 들어오는 메시지에 설정하여 사용해야한다고 생각한다. 다른 옵션은 이벤트를 보관하기 위해 자체 데이터 구조를 유지하는 것입니다. 더 좋은 방법이 있습니까? – awynne

관련 문제