我有这个代理服务将两个xml消息聚合成一个。
我的代理配置:
<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
name="prescription"
transports="https http jms"
startOnLoad="true"
trace="disable">
<description/>
<target>
<inSequence>
<aggregate>
<completeCondition>
<messageCount min="2" max="2"/>
</completeCondition>
<onComplete expression="//soapenv:Envelope//f:Prescription//f:identifier//f:id//@value">
<send>
<endpoint>
<address uri="jms:/report?transport.jms.ConnectionFactoryJNDIName=QueueConnectionFactory&java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory&java.naming.provider.url=tcp://localhost:61616"/>
</endpoint>
</send>
</onComplete>
</aggregate>
</inSequence>
<outSequence>
<drop/>
</outSequence>
<faultSequence/>
</target>
<parameter name="transport.jms.ContentType">
<rules>
<jmsProperty>contentType</jmsProperty>
<default>application/xml</default>
</rules>
</parameter>
</proxy>
我的输入消息如下所示:(我想根据患者ID汇总)
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://isova.wipro.com/">
<Prescription xmlns="http://hl7.org/fhir">
<identifier>
<id value="A0001"/>
</identifier>
<status value="active"/>
<patient>
<type value="Patient"/>
<url value="Bhavani"/>
</patient>
<prescriber>
<type value="Provider"/>
<url value="Dr.Mathews"/>
</prescriber>
<medicine>
<identification>
<text value="Zintac"/>
</identification>
</medicine>
</Prescription></soapenv:Envelope>
有什么建议吗?
此致 领袖 @gnanagurus
我无法帮助解决这个问题。这是我最新的WSO2代理。
这些是“处方”队列中存在的两条消息。
消息1:
<?xml version='1.0' encoding='UTF-8'?><soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"><soapenv:Body><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://isova.wipro.com/">
<Prescription xmlns="http://hl7.org/fhir">
<identifier>
<id value="A0001"/>
</identifier>
<status value="active"/>
<patient>
<type value="Patient"/>
<url value="Bhavani"/>
</patient>
<prescriber>
<type value="Provider"/>
<url value="Dr.Mathews"/>
</prescriber>
<medicine>
<identification>
<text value="Zintac"/>
</identification>
</medicine>
</Prescription></soapenv:Envelope></soapenv:Body></soapenv:Envelope>
消息2:
<?xml version='1.0' encoding='UTF-8'?><soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"><soapenv:Body><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://isova.wipro.com/">
<Prescription xmlns="http://hl7.org/fhir">
<identifier>
<id value="A0001"/>
</identifier>
<status value="active"/>
<patient>
<type value="Patient"/>
<url value="Bhavani"/>
</patient>
<prescriber>
<type value="Provider"/>
<url value="Dr.John"/>
</prescriber>
<medicine>
<identification>
<text value="tintac"/>
</identification>
</medicine>
</Prescription></soapenv:Envelope></soapenv:Body></soapenv:Envelope>
代理:
<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
name="prescription"
transports="https http jms"
startOnLoad="true"
trace="disable">
<description/>
<target>
<inSequence>
<aggregate>
<completeCondition>
<messageCount min="2"/>
</completeCondition>
<onComplete expression="/Prescription">
<send>
<endpoint>
<address uri="jms:/report?transport.jms.ConnectionFactoryJNDIName=QueueConnectionFactory&java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory&java.naming.provider.url=tcp://localhost:61616"/>
</endpoint>
</send>
</onComplete>
</aggregate>
</inSequence>
<outSequence>
<drop/>
</outSequence>
<faultSequence/>
</target>
<parameter name="transport.jms.ContentType">
<rules>
<jmsProperty>contentType</jmsProperty>
<default>application/xml</default>
</rules>
</parameter>
</proxy>
这不能解决我的聚合问题。这两条消息没有获得聚合器。我尝试使用多个xpath和命名空间。 Anyhelp非常需要。
是否有任何WSO2聚合器自定义java类可以使用而不是聚合中介?
此致 大师
答案 0 :(得分:3)
是的,您需要定义名称空间f。您可以在开头直接执行此操作:
<proxy xmlns="http://ws.apache.org/ns/synapse" xmlns:f="http://hl7.org/fhir"
然后你当然可以创建日志输出以验证你的xpath表达式(非常有用):
<log level="custom">
<property name="yourXPathTest" expression="$body/f:Prescription/f:identifier/f:id/@value"/>
</log>
答案 1 :(得分:1)
您的XPATH错误,因为您没有定义名称空间。
我相信你正在处理SOAP消息。如果是,您是否复制了上面的确切消息。我看不到SOAP的身体?您应该做的是将xml有效负载丰富到SOAP主体中,并从aggrgate介体中对它们进行聚合。在那里你只需要考虑SOAP body作为根,给XPATH。在你的情况下它应该是
<onComplete xmlns:f="http://hl7.org/fhir" expression="//f:Prescription/f:identifier/f:id/text()">
答案 2 :(得分:1)
你在做什么在逻辑上是不正确的。如果没有在inSequence中放置迭代介体,则无法在inSequence中聚合消息。 Clone / Iterate和Aggregate介体之间存在关联。您只能聚合在同一代理服务中拆分或克隆的邮件。