2013-09-03 4 views
0

구성 요소에서 MuleMessage 인스턴스 콜렉션을 반환하는 데 문제가 있습니다.구성 요소에서 MessageCollection을 반환하는 뮬

뮬 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: [email protected]7 
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"를 반환하는 빈 클래스입니다.

내가 뭘 잘못하고 있니?

내 목표는 수신 페이로드에서 생성 된 개체 모음을 반환하는 것입니다. 그런 다음 호출 흐름에서 해당 객체를 반복하고 각각에 대해 적절한 조치를 취할 수 있습니다.

EDIT : 내가 변압기에 원하는 부품을 만들 수 있습니다. 부품이 아닙니다. 왜 이런거야?

+0

흐름의 ForEach 요소를이 게시물에 추가하십시오. – user1760178

+0

ForEach 요소는 아무런 차이가 없습니다. 나는 그것을 제거하고 여전히 문제가 있습니다. 그것은 디버깅을위한 일시적인 것입니다. – Tad

답변

1

각 LicenseRequest 객체를 뮬 메시지에 래핑하고 컬렉션에 추가 할 필요가 없다고 생각합니다. 콜렉션을 직접 작성하여 onCall 메소드에서 리턴하십시오.

public Object onCall(MuleEventContext eventContext) throws Exception 
{ 
    MuleMessage message = eventContext.getMessage(); 

    LicenseRequest s1 = new LicenseRequest(); 
    LicenseRequest s2 = new LicenseRequest(); 

    List<LicenseRequest> list = new ArrayList<LicenseRequest>(); 
    list.add(s1); 
    list.add(s2); 

    return list; 
} 

희망이 있습니다.

관련 문제