如何在Mule中创建自定义聚合器?

如何在Mule中创建自定义聚合器?,mule,aggregator,Mule,Aggregator,在mule 3.x中创建完全自定义聚合器的推荐方法是什么?所谓完全定制,是指根据我自己的逻辑,不使用相关ID、消息计数等 mulesoft网站上的文档已经过时,说明使用3.x中不存在的AbstractEventAggregator: 更深入地挖掘,该类似乎已在3.x中重命名为AbstractAggregator: 但是,没有任何示例说明如何使用此功能。上面第一个链接中描述的LoanBroker示例实际上使用了一个关联聚合器(在2.x示例中,我假设文档所指的就是这个聚合器) 在某一点上,有一个

在mule 3.x中创建完全自定义聚合器的推荐方法是什么?所谓完全定制,是指根据我自己的逻辑,不使用相关ID、消息计数等

mulesoft网站上的文档已经过时,说明使用3.x中不存在的AbstractEventAggregator:

更深入地挖掘,该类似乎已在3.x中重命名为AbstractAggregator:

但是,没有任何示例说明如何使用此功能。上面第一个链接中描述的LoanBroker示例实际上使用了一个关联聚合器(在2.x示例中,我假设文档所指的就是这个聚合器)


在某一点上,有一个抽象类具有抽象方法shouldAggregate和doAggregate。这就是我想要扩展的类。

请看下面的
TestAggregator
,了解AbstractAggregator子类化的示例

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());
            }
        };
    }
}
import org.mule.DefaultMuleEvent;
导入org.mule.DefaultMuleMessage;
导入org.mule.api.MuleContext;
导入org.mule.api.MuleEvent;
导入org.mule.api.store.ObjectStoreException;
导入org.mule.api.transformer.TransformerException;
导入org.mule.routing.AbstractAggregator;
导入org.mule.routing.AggregationException;
导入org.mule.routing.EventGroup;
导入org.mule.routing.correlation.CollectionCorrelatorCallback;
导入org.mule.routing.correlation.EventCorrelatorCallback;
导入org.mule.util.concurrent.ThreadNameHelper;
导入java.util.Iterator;
公共类TestAggregator扩展了AbstractAggregator
{
@凌驾
受保护的事件CorrelatorCallback getCorrelatorCallback(MuleContext MuleContext)
{
返回新的CollectionCorrelatorCallback(muleContext、false、storePrefix)
{
@凌驾
公共多事件聚合事件(事件组事件)引发AggregationException
{
StringBuffer=新的StringBuffer(128);
尝试
{
for(Iterator Iterator=events.Iterator();Iterator.hasNext();)
{
MuleEvent event=iterator.next();
尝试
{
append(event.transformMessageToString());
}
捕获(转换异常e)
{
抛出新的AggregationException(事件,null,e);
}
}
}
捕获(ObjectStoreException e)
{
抛出新的AggregationException(事件,null,e);
}
debug(“事件负载为:”+buffer.toString());
返回新的DefaultMuleEvent(新的DefaultMuleMessage(buffer.toString(),muleContext),events.getMessageCollectionEvent());
}
};
}
}

查看下面的
TestAggregator
,了解AbstractAggregator子类化的示例

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());
            }
        };
    }
}
import org.mule.DefaultMuleEvent;
导入org.mule.DefaultMuleMessage;
导入org.mule.api.MuleContext;
导入org.mule.api.MuleEvent;
导入org.mule.api.store.ObjectStoreException;
导入org.mule.api.transformer.TransformerException;
导入org.mule.routing.AbstractAggregator;
导入org.mule.routing.AggregationException;
导入org.mule.routing.EventGroup;
导入org.mule.routing.correlation.CollectionCorrelatorCallback;
导入org.mule.routing.correlation.EventCorrelatorCallback;
导入org.mule.util.concurrent.ThreadNameHelper;
导入java.util.Iterator;
公共类TestAggregator扩展了AbstractAggregator
{
@凌驾
受保护的事件CorrelatorCallback getCorrelatorCallback(MuleContext MuleContext)
{
返回新的CollectionCorrelatorCallback(muleContext、false、storePrefix)
{
@凌驾
公共多事件聚合事件(事件组事件)引发AggregationException
{
StringBuffer=新的StringBuffer(128);
尝试
{
for(Iterator Iterator=events.Iterator();Iterator.hasNext();)
{
MuleEvent event=iterator.next();
尝试
{
append(event.transformMessageToString());
}
捕获(转换异常e)
{
抛出新的AggregationException(事件,null,e);
}
}
}
捕获(ObjectStoreException e)
{
抛出新的AggregationException(事件,null,e);
}
debug(“事件负载为:”+buffer.toString());
返回新的DefaultMuleEvent(新的DefaultMuleMessage(buffer.toString(),muleContext),events.getMessageCollectionEvent());
}
};
}
}

谢谢!我会试试这个。我应该重写CollectionCorrelatorCallback.shouldAggregateEvents()来提供我自己的逻辑,还是建议创建我自己的类来实现EventCorrelatorCallback?您更愿意实现自己的EventCorrelatorCallback,因为您根本不依赖消息计数(我理解为:您不会依赖event.getMessage().getCorrelationGroupSize()以确定要聚合的事件数)。我发现EventCorrelatorCallback由EventCorrelator调用,它假定按相关ID对事件进行分组。因此,我认为我需要通过“人为”将其设置在某个传入消息上来使用correlationId。另一个选择是维护自己的数据结构以保存事件。有更好的方法吗?实际上,您需要实现一个MessageInfoMapping,它与您正在创建的自定义EventCorrelatorCallback保持一致,并在EventCo上进行配置