我创建了一个Mule3简单前端Web服务,它应该将XML消息传递给子流并将成功返回给它的调用者。
骡-config.xml中
<flow name="webserviceTestFlow">
<http:inbound-endpoint address="${webservicetest.env.endpoint}" exchange-pattern="request-response" doc:name="HTTP"/>
<cxf:simple-service serviceClass="com.test.WebserviceTest" doc:name="SOAP"/>
<component class="com.test.WebserviceTestImpl" />
</flow>
示例webservice方法
public class WebserviceTestImpl implements WebserviceTest,Serializable {
@Override
public String test(String requestMessage) throws Exception{
// sends XML message to a sub-flow
return "success";
}
问题是我找不到使用webservice方法调用子流的mule api。
答案 0 :(得分:1)
从代码中调用sub-flow
并不是一件容易的事。
这是一个测试组件,它会调用注入其中的sub-flow
:
public class TestComponent implements MuleContextAware, FlowConstructAware { private MuleContext muleContext; private FlowConstruct flowConstruct; private MessageProcessor subFlow; public void initialize() throws MuleException { muleContext.getRegistry().applyProcessorsAndLifecycle(subFlow); } public String test(final String requestMessage) throws Exception { final MuleEvent muleEvent = new DefaultMuleEvent(new DefaultMuleMessage(requestMessage, muleContext), MessageExchangePattern.REQUEST_RESPONSE, flowConstruct); final MuleEvent resultEvent = subFlow.process(muleEvent); return resultEvent.getMessageAsString(); } public void setMuleContext(final MuleContext muleContext) { this.muleContext = muleContext; } public void setFlowConstruct(final FlowConstruct flowConstruct) { this.flowConstruct = flowConstruct; } public void setSubFlow(final MessageProcessor subFlow) { this.subFlow = subFlow; } }
组件以这种方式配置:
<spring:beans>
<spring:bean name="testComponent" class="com.example.TestComponent"
p:subFlow-ref="testSubFlow" init-method="initialize" />
</spring:beans>
...
<component>
<spring-object bean="testComponent" />
</component>
答案 1 :(得分:0)
我通过使用单例实例在WebserviceTestImpl类的test()方法中存储requestMessage并在TestSubflow组件中检索它来解决了这个问题。我不确定它是否完美。但它有效:)
我是这样做的..
骡配置:
<flow name="webserviceTestFlow">
<http:inbound-endpoint address="${webservicetest.env.endpoint}" exchange-pattern="request-response" doc:name="HTTP"/>
<cxf:simple-service serviceClass="com.test.WebserviceTest" doc:name="SOAP"/>
<component class="com.test.WebserviceTestImpl" />
<flow-ref name="testSubflow"/>
</flow>
<sub-flow name="testSubflow">
<pooled-component class="com.test.TestSubflow">
<pooling-profile exhaustedAction="WHEN_EXHAUSTED_FAIL" initialisationPolicy="INITIALISE_ALL" maxActive="1" maxIdle="2" maxWait="3" />
</pooled-component>
</sub-flow>
WebserviceTestImpl和TestSubflow代码段
public class WebserviceTestImpl implements WebserviceTest,Serializable {
private static final long serialVersionUID = 1L;
private TestMessageProxy testMessageProxy;
public TriggerTestImpl() {
this.testMessageProxy = TestMessageProxy.getInstance();
}
@Override
public String test(String requestMessage) throws Exception{
this.testMessageProxy.setTestMessage(requestMessage);
return "success";
}
}
public class TestSubflow implements Callable{
private TestMessageProxy testMessageProxy;
public TestSubflow() {
this.testMessageProxy = TestMessageProxy.getInstance();
}
@Override
public Object onCall(MuleEventContext context) throws Exception {
String testMessage = this.testMessageProxy.getTestMessage();
}
}