是的。您可以一步完成此操作。我曾在一个项目之前,这样做: 这里是你可以按照如下步骤:
1. ws1 and ws2 are both have "endpoints" defined in the ESB.
2. In the ws1 proxy, define a target inSequence to point to a "sequence"
for example "ws1InSequence"
3. In the "ws1InSequence", you can use <filter> to make sure the value is exists.
Then you can <send> to the ws1 <endpoint> with "receive" attribute point to
a sequence for example "ws1ResultSequence"
4. In the ws1ResultSequence, you can again use the <filter> to make sure
it has the parameter/value you need. Then you can use param/value to format a request message.
<payloadFactory>
<format>
<ns1: ws2Operation
xmlns:ns1="ws2Namespace">
<element1 xmlns="">$1</element1>
<!-- Note $1 will have the //paramName value from the ws1 Result message -->
<element2 xmlns="">$2</element2>
<!-- Note $2 will have the //paramName2 value from the ws1 Result message -->
</format>
<args>
<arg expression="//paramName" />
<arg expression="//paramName2" />
</args>
</payloadFactory>
5. Still in ws1ResultSequence, after you create the request message,
you <send> it to the ws2 proxy. Then in the ws2 proxy, in the <outSequence>
you can juse use <send/> to send the response to the client.
注意,你可能需要包括异常(faultSequence)处理。
WSO2ESB使用Apache Synapse进行配置。您可以在其文档中找到大多数语法和示例用法:http://synapse.apache.org/userguide/config.html
UPDATE:您可以使用此示例作为示例。注意,这可能不是您需要的完整代码,您可能需要添加异常处理。
<sequence xmlns="http://ws.apache.org/ns/synapse" name="ws1ResultSequence"
trace="enable" onError="ws1ResultSequenceErrorHandler">
<log level="custom">
<property name="sequence" value="INVOCATION START: ws1ResultSequence" />
</log>
<!-- record the original message for future reference -->
<enrich>
<source clone="true" type="envelope" />
<target action="replace" type="property" property="ORIGINAL" />
</enrich>
<!-- Check if the ws1 result message has the value -->
<property
xmlns:ns1="ws1Namespace"
name="valueExists" expression="//ns1:element1" />
<!--Note here, element1 is the element name which has the value: output1 -->
<filter xpath="fn:boolean(get-property('valueExists'))">
<then>
<!-- create the request message to invoke ws2 -->
<payloadFactory>
<format>
<ns1:ws2OperationName
xmlns:ns1="ws2Namespace">
<element2 xmlns="">$1</element2>
</ns1:ws2OperationName>
</format>
<args>
<arg expression="//ns1:element1" />
</args>
</payloadFactory>
<log level="custom">
<property name="inInvokeWS2" value="INVOCATION START: value from ws1 result exists" />
</log>
<send>
<endpoint key="ws2Sequence" />
</send>
<drop/>
</then>
</filter>
<!-- No result value found from the ws1 result message -->
<send>
<endpoint key="DoSomethingElseOrThrowError" />
</send>
来源
2013-01-04 05:33:33
Don
谢谢唐先生您的回应。
也许我理解错误(由于我的经验不足):
1.我必须为ws1和ws2创建代理。
2.和所有序列(ws1InSequence,ws1ResultSequence),
3. element1和element2是ws2参数的名称还是由wso2给出的静态名称?
4.这
非常感谢您的回复
– Yanni
我试过但我很困惑。我不知道每个序列中必须创建多少个和每个介体。以及每个调解员的不同论点。请您给我请每个序列的代码视图。 – Yanni
@Yanni该项目是在我的专业工作,很抱歉,我不能给你任何实际的代码视图。你如何发布你的一些代码,然后我们可以从那里谈谈。 – Don