【问题标题】:Consume a rest webservice and persist the content to the database in mule使用 REST Web 服务并将内容保存到 mule 中的数据库
【发布时间】:2014-07-27 10:31:36
【问题描述】:

我点击了一个休息网络服务并获得了一个 JSON 对象,如下所示:

{
  "version" : "1.0.1",
  "observations" : [ {
    "id" : 2743,
    "sensor" : "RedBus-11",
    "privacy" : "public",
    "record" : [ {
      "output" : [ {
        "name" : "temperature",
        "value" : "35.0",
        "type" : "DECIMAL"
      } ],
      "starttime" : "06-JUN-2014 11:09:39 IST",
      "position-global" : {
        "latitude" : "19.066680908203125",
        "longitude" : "72.86734008789062",
        "altitude" : "2m"
      }
    } ]
  }]
}

在将 JSON 转换为对象时,我得到了一个链接的 HashMap。我需要将高度、开始时间、纬度等链接哈希图中的内容保存到 MySQL 数据库,但我只能将链接哈希图的值保存在数据库中。请求任何人提供帮助。

我的配置文件如下:

<jdbc-ee:mysql-data-source name="MySQL" user="user" password="password" url="jdbc:mysql://localhost:3306/TESTDB"    transactionIsolation="UNSPECIFIED" doc:name="MySQL Data Source"></jdbc-ee:mysql-data-source>
<jdbc-ee:connector name="MySQL_JDBC_Connector" dataSource-ref="MySQL" validateConnections="true" queryTimeout="-1" pollingFrequency="0" doc:name="Database"> 
    <jdbc-ee:query key="InsertRecord" value="INSERT INTO TEMP(A1) VALUES(#[message.payload])"></jdbc-ee:query>  
</jdbc-ee:connector>

<flow name="MuleRESTExperimentFlow1" doc:name="MuleRESTExperimentFlow1">   
    <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8082" doc:name="HTTP"></http:inbound-endpoint>

    <http:rest-service-component httpMethod="GET" serviceUrl="REST Webservice"></http:rest-service-component>

    <json:json-to-object-transformer returnClass="java.util.Map" doc:name="JSON to Object"></json:json-to-object-transformer>

    <expression-transformer expression="#[message.payload.observations]" doc:name="Expression"></expression-transformer>

    <jdbc-ee:outbound-endpoint exchange-pattern="one-way" queryKey="InsertRecord" queryTimeout="-1" connector-ref="MySQL_JDBC_Connector" doc:name="Destination"></jdbc-ee:outbound-endpoint> 

</flow>

请告知如何在 mule 中实现这一点。

【问题讨论】:

  • 您的 MySQL 表中只有一列,那么您希望如何存储所有三个值?
  • 我已经描述了仅使用一个值作为示例,其中只有映射中的值被持久化,而不是映射中的单个元素。如果您只想使用一个元素,那么在这种情况下使用纬度。
  • 非常感谢大卫的快速回复。 Mule & MEL 表达式对我来说是新的。我尝试了您建议的选项,但遇到了问题。我的 SQL 查询是:-INSERT INTO ABC(ID, Datetime) VALUES (ID, #[message.payload.observations.['record'].starttime])。流程已修改为 .[Error: unterminated string literal][Near:{...message.....'record'].starttime .. ..}]
  • 这是很棒的 Anirban。如果来自 REST Web 服务的结果是带有观察列表的 JSON 对象,请建议在流程中进行哪些更改。非常感谢您的回复。
  • 检查我的更新答案

标签: mule


【解决方案1】:

JSON 文件中有一个小问题。元素 position-global 中有一个 -。所以我将元素更改为 positionglobal .. 现在它工作正常.. 我可以使用 MEL 表达式单独插入每个元素值.. 还使用 MEL 通过 Logger 打印控制台中的每个元素值.. 现在所有元素值都可以使用 MEL 提取 .. 唯一的问题是元素 position-global 中的 - ,如果您从中删除该 - ..它将提取 positionglobal 值...现在您可以从这个示例中提取并插入需要插入数据库的任何值:-

<jdbc-ee:mysql-data-source name="MySQL" user="user" password="password" url="jdbc:mysql://localhost:3306/TESTDB"    transactionIsolation="UNSPECIFIED" doc:name="MySQL Data Source"></jdbc-ee:mysql-data-source>
    <jdbc-ee:connector name="MySQL_JDBC_Connector" dataSource-ref="MySQL" validateConnections="true" queryTimeout="-1" pollingFrequency="0" doc:name="Database"> 
        <jdbc-ee:query key="InsertRecord" value="INSERT INTO TEMP(A1) VALUES(#[message.payload.observations[0].id],#[message.payload.observations[0].sensor],#[message.payload.observations[0].privacy],#[message.payload.observations[0].record[0].output[0].name],#[message.payload.observations[0].record[0].output[0].value],#[message.payload.observations[0].record[0].output[0].type],#[message.payload.observations[0].record[0].starttime],#[message.payload.observations[0].record[0].positionglobal.latitude],#[message.payload.observations[0].record[0].positionglobal.longitude],#[message.payload.observations[0].record[0].positionglobal.altitude])"></jdbc-ee:query>  
    </jdbc-ee:connector>

<flow name="MuleRESTExperimentFlow1" doc:name="MuleRESTExperimentFlow1">   
        <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8082" doc:name="HTTP"></http:inbound-endpoint>

<http:rest-service-component httpMethod="GET" serviceUrl="REST Webservice"></http:rest-service-component>

       <json:json-to-object-transformer returnClass="java.util.HashMap" doc:name="JSON to Object"/>

            <logger message="ID:- #[message.payload.observations[0].id]" level="INFO" doc:name="Logger"/>
            <logger message="SENSOR #[message.payload.observations[0].sensor]" level="INFO" doc:name="Logger"/>
            <logger message="PRIVACY #[message.payload.observations[0].privacy]" level="INFO" doc:name="Logger"/>
            <logger message="NAME #[message.payload.observations[0].record[0].output[0].name]" level="INFO" doc:name="Logger"/>
            <logger message="VALUE #[message.payload.observations[0].record[0].output[0].value]" level="INFO" doc:name="Logger"/>
            <logger message="TYPE #[message.payload.observations[0].record[0].output[0].type]" level="INFO" doc:name="Logger"/>        
            <logger message="STARTTIME #[message.payload.observations[0].record[0].starttime]" level="INFO" doc:name="Logger"/>       
            <logger message="LATITUDE #[message.payload.observations[0].record[0].positionglobal.latitude]" level="INFO" doc:name="Logger"/>        
            <logger message="LONGITUDE #[message.payload.observations[0].record[0].positionglobal.longitude]" level="INFO" doc:name="Logger"/>       
            <logger message="ALTITUDE #[message.payload.observations[0].record[0].positionglobal.altitude]" level="INFO" doc:name="Logger"/>        


<jdbc-ee:outbound-endpoint exchange-pattern="one-way" queryKey="InsertRecord" queryTimeout="-1" connector-ref="MySQL_JDBC_Connector" doc:name="Destination"></jdbc-ee:outbound-endpoint> 

    </flow>

已更新观察列表:-

 <jdbc-ee:connector name="Database_Global" dataSource-ref="DB_Source" validateConnections="true" queryTimeout="-1" pollingFrequency="0" doc:name="Database">

        <jdbc-ee:query key="InsertQuery" value="INSERT INTO TEMP(A1) VALUES(#[payload.id],#[payload.sensor],#[payload.privacy],#[payload.record[0].output[0].name],#[payload.record[0].output[0].value],#[payload.record[0].output[0].type],#[payload.record[0].starttime],#[payload.record[0].positionglobal.latitude],#[payload.record[0].positionglobal.longitude],#[payload.record[0].positionglobal.altitude])"/> 

    </jdbc-ee:connector>  

    <flow name="MuleRESTExperimentFlow1" doc:name="MuleRESTExperimentFlow1">   
            <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8082" doc:name="HTTP"></http:inbound-endpoint>

    <http:rest-service-component httpMethod="GET" serviceUrl="REST Webservice"></http:rest-service-component>

           <json:json-to-object-transformer returnClass="java.util.HashMap" doc:name="JSON to Object"/>

                <logger message="ID:- #[message.payload.observations[0].id]" level="INFO" doc:name="Logger"/>
                <logger message="SENSOR #[message.payload.observations[0].sensor]" level="INFO" doc:name="Logger"/>
                <logger message="PRIVACY #[message.payload.observations[0].privacy]" level="INFO" doc:name="Logger"/>
                <logger message="NAME #[message.payload.observations[0].record[0].output[0].name]" level="INFO" doc:name="Logger"/>
                <logger message="VALUE #[message.payload.observations[0].record[0].output[0].value]" level="INFO" doc:name="Logger"/>
                <logger message="TYPE #[message.payload.observations[0].record[0].output[0].type]" level="INFO" doc:name="Logger"/>        
                <logger message="STARTTIME #[message.payload.observations[0].record[0].starttime]" level="INFO" doc:name="Logger"/>       
                <logger message="LATITUDE #[message.payload.observations[0].record[0].positionglobal.latitude]" level="INFO" doc:name="Logger"/>        
                <logger message="LONGITUDE #[message.payload.observations[0].record[0].positionglobal.longitude]" level="INFO" doc:name="Logger"/>       
                <logger message="ALTITUDE #[message.payload.observations[0].record[0].positionglobal.altitude]" level="INFO" doc:name="Logger"/>        

    <foreach collection="#[message.payload.observations]" doc:name="For Each">                     
    <jdbc-ee:outbound-endpoint exchange-pattern="one-way" queryKey="InsertRecord" queryTimeout="-1" connector-ref="MySQL_JDBC_Connector" doc:name="Destination"></jdbc-ee:outbound-endpoint> 
       </foreach>   

        </flow>

【讨论】:

  • 感谢您的回复。如前所述,如果从 REST Web 服务返回的 JSON 对象是观察列表,请建议对流程进行的更改。谢谢!
  • 如果您需要保留从 Json 请求中提取的值 .. 您可以参考流程并使用给定的 MEL 表达式 .. 我已经给出了所有 MEL 表达式来从所有 Json 中提取值元素..你可以参考这个例子来插入你需要的任何值..所有的值都是使用 MEL 表达式提取的..
  • 绝对是 Anirban。非常感谢您从 JSON 对象中提取每个元素并将其持久化。我只是想知道我们是否有办法使用 MEL 来持久化一个集合,例如在这种情况下,是观察列表以及我们需要在流程中进行的更改以适应它。
  • 检查我的 UPDATED for LIST of OBSERVATION...您需要在流程中使用每个,并且需要在顶部稍微更改 JDBC 查询......我已经更新我的回答..如果对你有用,请接受我的回答
【解决方案2】:

不确定是什么阻碍了你。

一旦您拥有Map 有效负载(事实上它是LinkedHashMap 并没有什么区别),您可以使用 MEL 表达式,例如:

#[message.payload.observations[0].record[0].['position-global'].altitude]

读取字段值。

【讨论】:

    猜你喜欢
    • 2017-08-13
    • 1970-01-01
    • 2017-02-05
    • 2011-09-27
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    相关资源
    最近更新 更多