【发布时间】:2015-08-07 21:12:44
【问题描述】:
我遇到了一个小问题..我有以下 Mule 流程:-
<flow name="PostgresSQLFlow1" doc:name="PostgresSQLFlow1">
<http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8082" doc:name="HTTP" path="db"/>
<scatter-gather doc:name="Scatter-Gather">
<processor-chain>
<flow-ref name="PostgresSQLSub-Flow" doc:name="Flow Reference"/>
<logger message="PostgresSql Done !!!" level="INFO" doc:name="Logger"/>
</processor-chain>
<processor-chain>
<flow-ref name="MSSQLSub-Flow" doc:name="Flow Reference"/>
<logger message="MSSQL Done !!!" level="INFO" doc:name="Logger"/>
</processor-chain>
</scatter-gather>
<set-payload value="....... Process Complete !!!! #[message.payload]" doc:name="Set Payload"/>
</flow>
<sub-flow name="PostgresSQLSub-Flow" doc:name="PostgresSQLSub-Flow">
<jdbc-ee:outbound-endpoint exchange-pattern="request-response" connector-ref="Database_Global2" queryKey="RetriveQuery" queryTimeout="-1" doc:name="Database (JDBC)"/>
<json:object-to-json-transformer doc:name="Object to JSON"/>
<logger message="Postgres Data :- #[message.payload]" level="INFO" doc:name="Logger"/>
</sub-flow>
<sub-flow name="MSSQLSub-Flow" doc:name="MSSQLSub-Flow">
<jdbc-ee:outbound-endpoint exchange-pattern="request-response" connector-ref="Database_Global" queryKey="RetriveQuery" queryTimeout="-1" doc:name="Database (JDBC)"/>
<json:object-to-json-transformer doc:name="Object to JSON"/>
<logger message="MSSQL Data :- #[message.payload]" level="INFO" doc:name="Logger"/>
</sub-flow>
现在我从两个子流中获取 JSON 数据,如下所示:-
MSSQL Data :- [{"AGE":5,"DESIGNATION":"Software Engineer","NAME":"Sidray","ID":288},{"AGE":55,"DESIGNATION":"Software Engineer"}]
Postgres Data :- [{"AGE":33,"DESIGNATION":"Software Engineer","NAME":"Anil","ID":2}]
现在我想将它合并到一个 JSON 消息中......
我尝试了以下方法:- 在每个子流中我使用<json:json-to-object-transformer returnClass="java.util.HashMap" /> 然后I used <set-payload value="#[groovy:payload.inject([:]) {result, part -> result.putAll(part); result}]" />
我已将以下内容作为参考:- I merge two different payloads into one payload
但没用..我得到以下异常:-
org.mule.routing.CompositeRoutingException: Exception was found for route(s): 0, 1. Message payload is of type: String
at org.mule.routing.CollectAllAggregationStrategy.aggregateWithFailedRoutes(CollectAllAggregationStrategy.java:51)
at org.mule.routing.CollectAllAggregationStrategy.aggregate(CollectAllAggregationStrategy.java:38)
at org.mule.routing.ScatterGatherRouter.processResponses(ScatterGatherRouter.java:197)
+ 3 more (set debug level logging or '-Dmule.verbose.exceptions=true' for everything)
请帮助我如何将这 2 个 json 数据合并到一个 json 中??
更新流程:-
<flow name="PostgresSQLFlow1" doc:name="PostgresSQLFlow1">
<http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8082" doc:name="HTTP" path="db"/>
<scatter-gather doc:name="Scatter-Gather">
<processor-chain>
<flow-ref name="PostgresSQLSub-Flow" doc:name="Flow Reference"/>
<logger message="PostgresSql Done !!!" level="INFO" doc:name="Logger"/>
</processor-chain>
<processor-chain>
<flow-ref name="MSSQLSub-Flow" doc:name="Flow Reference"/>
<logger message="MSSQL Done !!!" level="INFO" doc:name="Logger"/>
</processor-chain>
</scatter-gather>
<set-payload value="#[groovy:payload.inject([:]) {result, part -> result.putAll(part); result}]" />
</flow>
<sub-flow name="PostgresSQLSub-Flow" doc:name="PostgresSQLSub-Flow">
<jdbc-ee:outbound-endpoint exchange-pattern="request-response" connector-ref="Database_Global2" queryKey="RetriveQuery" queryTimeout="-1" doc:name="Database (JDBC)"/>
<json:json-to-object-transformer returnClass="java.util.HashMap" />
<logger message="Postgres Data :- #[message.payload]" level="INFO" doc:name="Logger"/>
</sub-flow>
<sub-flow name="MSSQLSub-Flow" doc:name="MSSQLSub-Flow">
<jdbc-ee:outbound-endpoint exchange-pattern="request-response" connector-ref="Database_Global" queryKey="RetriveQuery" queryTimeout="-1" doc:name="Database (JDBC)"/>
<json:json-to-object-transformer returnClass="java.util.HashMap" />
<logger message="MSSQL Data :- #[message.payload]" level="INFO" doc:name="Logger"/>
</sub-flow>
我得到的异常:-
INFO 2014-09-17 22:00:08,380 [[MultipleDBWithMSSQLAndPostgresSQL].ScatterGatherWorkManager.01] org.mule.lifecycle.AbstractLifecycleManager: Initialising: 'Database_Global2.dispatcher.1519448919'. Object is: EEJdbcMessageDispatcher
INFO 2014-09-17 22:00:08,380 [[MultipleDBWithMSSQLAndPostgresSQL].ScatterGatherWorkManager.02] org.mule.lifecycle.AbstractLifecycleManager: Initialising: 'Database_Global.dispatcher.1649935156'. Object is: EEJdbcMessageDispatcher
INFO 2014-09-17 22:00:08,381 [[MultipleDBWithMSSQLAndPostgresSQL].ScatterGatherWorkManager.02] org.mule.lifecycle.AbstractLifecycleManager: Starting: 'Database_Global.dispatcher.1649935156'. Object is: EEJdbcMessageDispatcher
INFO 2014-09-17 22:00:08,381 [[MultipleDBWithMSSQLAndPostgresSQL].ScatterGatherWorkManager.01] org.mule.lifecycle.AbstractLifecycleManager: Starting: 'Database_Global2.dispatcher.1519448919'. Object is: EEJdbcMessageDispatcher
ERROR 2014-09-17 22:00:08,586 [[MultipleDBWithMSSQLAndPostgresSQL].connector.http.mule.default.receiver.02] org.mule.exception.DefaultMessagingExceptionStrategy:
********************************************************************************
Message : Exception was found for route(s): 0, 1. Message payload is of type: String
Code : MULE_ERROR--2
--------------------------------------------------------------------------------
Exception stack is:
1. Exception was found for route(s): 0, 1. Message payload is of type: String (org.mule.routing.CompositeRoutingException)
org.mule.routing.CollectAllAggregationStrategy:51 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/routing/CompositeRoutingException.html)
--------------------------------------------------------------------------------
Root Exception stack trace:
org.mule.routing.CompositeRoutingException: Exception was found for route(s): 0, 1. Message payload is of type: String
at org.mule.routing.CollectAllAggregationStrategy.aggregateWithFailedRoutes(CollectAllAggregationStrategy.java:51)
at org.mule.routing.CollectAllAggregationStrategy.aggregate(CollectAllAggregationStrategy.java:38)
at org.mule.routing.ScatterGatherRouter.processResponses(ScatterGatherRouter.java:197)
+ 3 more (set debug level logging or '-Dmule.verbose.exceptions=true' for everything)
********************************************************************************
【问题讨论】:
-
你把合并逻辑放在哪里了?它似乎破坏了
scatter-gather。 -
我在每个子流程中在 object-to-json-transformer 之后使用了 json-to-object-transformer,然后我使用了 set-payload value="#[groovy:payload.inject([:] ) {result, part -> result.putAll(part); result}]" 在 PostgresSQLFlow1 中分散和聚集后
-
实际上,为什么要从对象到 JSON 再返回到对象?为什么不直接使用 JDBC 端点返回的映射列表?
-
请检查我更新的流程
-
JDBC 端点生成地图列表,而不是 JSON 字符串,因此
json-to-object-transformer不可能工作。只需删除它们,让scatter-gather为您提供来自 JDBC 端点的数据。