在mule3 webservice中调用子流

时间:2013-05-13 19:43:30

标签: mule

我创建了一个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。

2 个答案:

答案 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();
    }
}