【发布时间】:2013-09-04 22:55:57
【问题描述】:
我在从组件返回 MuleMessage 实例集合时遇到了困难。
骡子 3.3.1.
以下代码有效(即,在组件之后,带有记录器的 foreach 组件按照我的预期转储出“abc”和“def”)。
public Object onCall( MuleEventContext eventContext ) throws Exception
{
MuleMessage message = eventContext.getMessage();
MuleMessageCollection collection = new DefaultMessageCollection( message.getMuleContext() );
String s1 = "abc";
String s2 = "def";
DefaultMuleMessage m1 = new DefaultMuleMessage( s1, message.getMuleContext() );
DefaultMuleMessage m2 = new DefaultMuleMessage( s2, message.getMuleContext() );
List<MuleMessage> list = new ArrayList<MuleMessage>();
list.add( m1 );
list.add( m2 );
collection.addMessages( list );
return collection;
}
但是,如果我用我自己的类代替字符串,如下所示:
public Object onCall( MuleEventContext eventContext ) throws Exception
{
MuleMessage message = eventContext.getMessage();
MuleMessageCollection collection = new DefaultMessageCollection( message.getMuleContext() );
LicenseRequest s1 = new LicenseRequest();
LicenseRequest s2 = new LicenseRequest();
DefaultMuleMessage m1 = new DefaultMuleMessage( s1, message.getMuleContext() );
DefaultMuleMessage m2 = new DefaultMuleMessage( s2, message.getMuleContext() );
List<MuleMessage> list = new ArrayList<MuleMessage>();
list.add( m1 );
list.add( m2 );
collection.addMessages( list );
return collection;
}
我得到一个例外:
org.mule.transport.http.HttpsConnector Work caused exception on 'workCompleted'. Work being executed was: org.mule.transport.http.HttpsMessageReceiver$HttpsWorker@7b921c57
org.mule.exception.DefaultSystemExceptionStrategy Caught exception in Exception Strategy: Payload was invalidated calling setPayload and the message is not collection anymore.
java.lang.IllegalStateException: Payload was invalidated calling setPayload and the message is not collection anymore.
at org.mule.DefaultMessageCollection.checkValidPayload(DefaultMessageCollection.java:107)
at org.mule.DefaultMessageCollection.newThreadCopy(DefaultMessageCollection.java:312)
at org.mule.DefaultMuleEvent.newThreadCopy(DefaultMuleEvent.java:779)
at org.mule.RequestContext.newEvent(RequestContext.java:140)
at org.mule.RequestContext.setExceptionPayload(RequestContext.java:121)
at org.mule.exception.AbstractSystemExceptionStrategy.handleException(AbstractSystemExceptionStrategy.java:54)
at org.mule.exception.AbstractSystemExceptionStrategy.handleException(AbstractSystemExceptionStrategy.java:77)
at org.mule.transport.http.HttpMessageReceiver$HttpWorker.run(HttpMessageReceiver.java:220)
at org.mule.work.WorkerContext.run(WorkerContext.java:311)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
Exception in thread "[license-generation].HTTPSConnector.receiver.02" java.lang.IllegalStateException: Payload was invalidated calling setPayload and the message is not collection anymore.
at org.mule.DefaultMessageCollection.checkValidPayload(DefaultMessageCollection.java:107)
at org.mule.DefaultMessageCollection.newThreadCopy(DefaultMessageCollection.java:312)
at org.mule.DefaultMuleEvent.newThreadCopy(DefaultMuleEvent.java:779)
at org.mule.RequestContext.newEvent(RequestContext.java:140)
at org.mule.RequestContext.setExceptionPayload(RequestContext.java:121)
at org.mule.exception.AbstractSystemExceptionStrategy.handleException(AbstractSystemExceptionStrategy.java:54)
at org.mule.exception.AbstractSystemExceptionStrategy.handleException(AbstractSystemExceptionStrategy.java:77)
at org.mule.transport.AbstractConnector.handleWorkException(AbstractConnector.java:2099)
at org.mule.transport.AbstractConnector.workCompleted(AbstractConnector.java:2067)
at org.mule.work.WorkerContext.run(WorkerContext.java:338)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
在我的测试中,LicenseRequest 只是一个空类,其 toString() 方法返回“ghi”。
我做错了什么?
我应该补充一点,我的目标是返回从传入有效负载创建的对象集合。然后,我可以在调用流程中迭代这些对象并为每个对象采取适当的操作。
编辑:看来我可以在变压器中做我想做的事,而不是一个组件。这是为什么呢?
【问题讨论】:
-
将流程中的 ForEach 元素添加到这篇文章中。
-
ForEach 元素对此没有影响。我已将其删除,但问题仍然存在。这只是暂时的调试。
标签: mule transformer