【问题标题】:Merging 2 JSON data into one generating exception将 2 个 JSON 数据合并为一个生成异常
【发布时间】: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 消息中...... 我尝试了以下方法:- 在每个子流中我使用&lt;json:json-to-object-transformer returnClass="java.util.HashMap" /&gt; 然后I used &lt;set-payload value="#[groovy:payload.inject([:]) {result, part -&gt; result.putAll(part); result}]" /&gt; 我已将以下内容作为参考:- 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 端点的数据。

标签: java json mule


【解决方案1】:

JDBC 端点生成映射列表,而不是 JSON 字符串,因此 json-to-object-transformer 可能无法工作。只需删除它们,然后让 scatter-gather 为您提供来自 JDBC 端点的数据。

【讨论】:

    【解决方案2】:

    所以,按照大卫的建议,最终的工作代码是:-

     <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)"/>
                <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)"/>
              <logger message="MSSQL Data :- #[message.payload]" level="INFO" doc:name="Logger"/>
           </sub-flow>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-12
      • 2021-09-22
      • 2019-08-30
      • 2017-12-07
      相关资源
      最近更新 更多