mule数据库迭代数据和映射

mule数据库迭代数据和映射,mule,Mule,我正在尝试从数据库中获取数据,对数据库中的每条记录逐一进行映射并上传到云。我采取了以下方法: 从数据库中选择数据,映射数据库中的每条记录,然后上载 骡流: <flow name="psi2sfdcFlow2" doc:name="psi2sfdcFlow2"> <http:inbound-endpoint exchange-pattern="request-response" host="${hostname}" port="${port}" path="psi2sfd

我正在尝试从数据库中获取数据,对数据库中的每条记录逐一进行映射并上传到云。我采取了以下方法:

从数据库中选择数据,映射数据库中的每条记录,然后上载

骡流:

<flow name="psi2sfdcFlow2" doc:name="psi2sfdcFlow2">
    <http:inbound-endpoint exchange-pattern="request-response" host="${hostname}" port="${port}" path="psi2sfdc" doc:name="HTTP"/>
    <flow-ref name="psi-update-Reading" doc:name="Flow Reference"/>
    <db:select config-ref="PostgreSQL" doc:name="PSI-Select">
        <db:parameterized-query><![CDATA[SELECT * FROM clients_int WHERE int_status = 'Reading']]></db:parameterized-query>
    </db:select>
    <object-to-string-transformer returnClass="java.lang.Object" doc:name="Object to String"/>
    <foreach doc:name="For Each">
        <invoke name="db2sfdcmapping" object-ref="createAccount" method="getPayloadData" methodArguments="#[message.payload]" doc:name="Invoke"/>
        <logger message="===Uplaod each row from db to cloud==== " level="INFO" doc:name="Logger"/>
    </foreach>
</flow>
Java文件:

public class Db2sfdc {

    public List<Map<String, Object>> getPayloadData(@Payload String src){
            System.out.println("Src-->"+src);
            Map<String, Object> sfdcFields = new HashMap<String, Object>();
            List<Map<String, Object>> accountList = new ArrayList<Map<String,Object>>();
            sfdcFields.put("ID", "001m000000In0p5AAB");
            sfdcFields.put("Current_WSE_Count__c", "20");
            accountList.add(sfdcFields);
            return accountList ;
    }
}
**

编辑:2

已解决,在以下更改后:我已在选择查询为后转换为json对象:

<db:select config-ref="PostgreSQL" doc:name="PSI-Select">
   <db:parameterized-query><![CDATA[SELECT * FROM clients_int WHERE int_status = 'Reading']]></db:parameterized-query>
 </db:select>
 <foreach doc:name="For Each">
        <json:object-to-json-transformer returnClass="java.lang.Object" doc:name="Object to JSON"/>
        <logger message="===Main Flow #[payload]===" level="INFO" doc:name="Logger"/>
 </foreach>

删除
对象到字符串转换器
:它将行枚举转换为字符串,从而阻止每个
工作

编辑:此外,由于入站HTTP端点是
请求-响应
,因此它需要向客户端返回响应。Mule将使用当前有效负载(一个
Jdbc4Array
实例)作为HTTP响应的有效负载,并将失败

您需要添加一个
set payload
,将HTTP响应的主体设置为您想要返回给调用方的任何内容。使用
http:response builder
设置响应头、缓存指令。。。还有


或者,您可以将HTTP入站端点切换为单向。这将立即向客户端返回
OK
,以及流下发生的事情是成功还是失败。

我想从select query转换为json数据,并逐个循环每个数据并上传,我该怎么做?。更新了上面的问题。如果您在
foreach
之前转换为JSON(一个字符串),您将能够对其进行迭代。您需要分别将每个记录转换为JSON,即在
foreach
中现在我已经删除了JSON转换器并将其放在foreach中,它说:找不到一个转换器来将“SimpleDataType{type=java.lang.String,MimetType='/'}”转换为“SimpleDataType{type=java.util.Map,MimetType='/'}”。若我将json transformer放在foreach之前,我会得到错误,因为对象“java.lang.String”的类型不正确。它必须是类型“{interface java.lang.Iterable,interfaceIt似乎在
db:选择
之后和
之前仍然有一个转换器,用于将有效负载错误地转换为字符串…是的,现在已解决。谢谢。按照您建议的解决方案更新了以上内容。
ERROR 2015-06-17 15:02:09,954 [[psi2sfdc].connector.http.mule.default.receiver.02] org.mule.exception.DefaultMessagingExceptionStrategy: 
********************************************************************************
Message               : java.io.NotSerializableException: org.postgresql.jdbc4.Jdbc4Array (org.apache.commons.lang.SerializationException). Message payload is of type: HttpResponse
Type                  : org.mule.execution.ResponseDispatchException
Code                  : MULE_ERROR--2
Payload               : org.mule.transport.http.HttpResponse@65b9ccef
JavaDoc               : http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/execution/ResponseDispatchException.html
********************************************************************************
Exception stack is:
1. org.postgresql.jdbc4.Jdbc4Array (java.io.NotSerializableException)
  java.io.ObjectOutputStream:1183 (null)
2. java.io.NotSerializableException: org.postgresql.jdbc4.Jdbc4Array (org.apache.commons.lang.SerializationException)
  org.apache.commons.lang.SerializationUtils:111 (null)
3. java.io.NotSerializableException: org.postgresql.jdbc4.Jdbc4Array (org.apache.commons.lang.SerializationException). Message payload is of type: HttpResponse (org.mule.execution.ResponseDispatchException)
  org.mule.transport.http.HttpMessageProcessTemplate:139 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/execution/ResponseDispatchException.html)
********************************************************************************
Root Exception stack trace:
java.io.NotSerializableException: org.postgresql.jdbc4.Jdbc4Array
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1183)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)
    at org.apache.commons.collections.map.AbstractHashedMap.doWriteObject(AbstractHashedMap.java:1182)
    at org.mule.util.CaseInsensitiveHashMap.writeObject(CaseInsensitiveHashMap.java:142)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1495)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177)
<db:select config-ref="PostgreSQL" doc:name="PSI-Select">
   <db:parameterized-query><![CDATA[SELECT * FROM clients_int WHERE int_status = 'Reading']]></db:parameterized-query>
 </db:select>
 <foreach doc:name="For Each">
        <json:object-to-json-transformer returnClass="java.lang.Object" doc:name="Object to JSON"/>
        <logger message="===Main Flow #[payload]===" level="INFO" doc:name="Logger"/>
 </foreach>