2012-07-12 5 views
0

흐름에 #[process:processName:valueToProcess]이라는 표현식을 사용하려고합니다.Mule : 프로세스 표현식 계산기

이 내 흐름 설정입니다 :

<flow name="exampleFlow"> 
    <quartz:inbound-endpoint jobName="job1" cronExpression="0/5 * * * * ?" connector-ref="quartzConnector"> 
    <quartz:event-generator-job> 
     <quartz:payload>foo</quartz:payload> 
    </quartz:event-generator-job> 
    </quartz:inbound-endpoint> 

    <logger message="#[process:test:#[payload]]" level="INFO"/> 
</flow> 

<sub-flow name="test" doc:name="test"> 
    <component class="com.myComp.ComponentTest" doc:name="Java"/> 
</sub-flow> 

그리고 이것은 내 자바 구성 요소입니다

package com.myComp; 

public class ComponentTest 
{ 
    public String test(String s) 
    { 
    return s + "bar"; 
    } 
} 

표현 #[process:test:#[payload]] 평가 때 문제가 온다. 이 예외가 throw됩니다.

java.lang.NullPointerException 
    at org.mule.component.AbstractComponent.invokeInternal(AbstractComponent.java:112) 
    at org.mule.component.AbstractComponent.process(AbstractComponent.java:156) 
    at org.mule.processor.chain.DefaultMessageProcessorChain.doProcess(DefaultMessageProcessorChain.java:99) 
    at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:66) 
    at org.mule.processor.chain.InterceptingChainLifecycleWrapper.doProcess(InterceptingChainLifecycleWrapper.java:56) 
    at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:66) 
    at org.mule.processor.chain.InterceptingChainLifecycleWrapper.process(InterceptingChainLifecycleWrapper.java:87) 
    at org.mule.api.processor.MessageProcessors$LifecyleAwareMessageProcessorWrapper.process(MessageProcessors.java:114) 
    at org.mule.expression.MessageProcessorExpressionEvaluator.evaluate(MessageProcessorExpressionEvaluator.java:87) 
    at org.mule.expression.DefaultExpressionManager.evaluate(DefaultExpressionManager.java:273) 
    at org.mule.expression.DefaultExpressionManager.evaluate(DefaultExpressionManager.java:209) 
    at org.mule.expression.DefaultExpressionManager$1.match(DefaultExpressionManager.java:399) 
    at org.mule.util.TemplateParser.parse(TemplateParser.java:156) 
    at org.mule.util.TemplateParser.parse(TemplateParser.java:133) 
    at org.mule.expression.DefaultExpressionManager.parse(DefaultExpressionManager.java:395) 
    at org.mule.expression.DefaultExpressionManager.parse(DefaultExpressionManager.java:379) 
    at org.mule.api.processor.LoggerMessageProcessor.log(LoggerMessageProcessor.java:89) 
    at org.mule.api.processor.LoggerMessageProcessor.process(LoggerMessageProcessor.java:71) 
    at org.mule.processor.chain.DefaultMessageProcessorChain.doProcess(DefaultMessageProcessorChain.java:99) 
    at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:66) 
    at org.mule.processor.AbstractInterceptingMessageProcessorBase.processNext(AbstractInterceptingMessageProcessorBase.java:105) 
    at org.mule.interceptor.AbstractEnvelopeInterceptor.process(AbstractEnvelopeInterceptor.java:55) 
    at org.mule.processor.AsyncInterceptingMessageProcessor.processNextTimed(AsyncInterceptingMessageProcessor.java:111) 
    at org.mule.processor.AsyncInterceptingMessageProcessor$AsyncMessageProcessorWorker.doRun(AsyncInterceptingMessageProcessor.java:158) 
    at org.mule.work.AbstractMuleEventWork.run(AbstractMuleEventWork.java:43) 
    at org.mule.work.WorkerContext.run(WorkerContext.java:310) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 

다른 스크립트 구성 요소에서도 마찬가지입니다. 구성 요소 수명주기와 관련이 있다고 생각하지만 작동하도록 할 수는 없습니다. 구성 요소를 다른 Mule 프로세서 (예 : logger, stringAppend)로 교체하면 정상적으로 작동합니다.

도움이 될 것입니다!

답변

0

초기화 문제라고 할 때 당신이 옳습니다. 어떤 이유로 든 하위 흐름의 구성 요소는 흐름과 동일한 방식으로 초기화되지 않습니다. 이 작품 :

<flow name="test" doc:name="test"> 
    <component class="com.myComp.ComponentTest" doc:name="Java"/> 
</flow> 

나는이 버그 때문에 I reported it 믿습니다. 문제를 upvote하시기 바랍니다.

Quartz 인바운드 종점이 생성하는 것과 같은 비동기 이벤트와 함께 작동 시키려면 동 기적으로 호출하기 위해 processingStrategy="synchronous"을 호출 된 플로우에 추가해야합니다. 그렇지 않으면 기본적으로 비동기 적으로 호출됩니다 process:test:#[payload]은 동기식 응답을 기대합니다). 즉

뮬 3.

에서 알려진 특질은 그래서 결국 솔루션입니다 것 :

<flow name="test" processingStrategy="synchronous" doc:name="test"> 
    <component class="com.myComp.ComponentTest" doc:name="Java"/> 
</flow> 
+0

이 답변 데이비드 주셔서 감사합니다! 불행히도 개인 흐름을 사용하면 결과가 주요 흐름 표현 평가에 반영되지 않습니다. 다른 프로세서/구성 요소에서도 마찬가지입니다. – Daniel

+0

Darn, 나는 테스트를 쉽게하기 위해 쿼츠 인바운드를 VM으로 대체했으며 문제를 해결하는 개인 흐름을 사용했다. 쿼츠 엔드 포인트로 어떤 일이 일어나는지 보도록하겠습니다. 제 생각과는 다른 문제입니다. –

+0

문제를 찾아 내 대답을 수정했습니다. –