【问题标题】:Data insert into DB using Mule esb使用 Mule esb 将数据插入数据库
【发布时间】:2016-08-13 01:46:29
【问题描述】:

我想做一些 POC,在这里我从 Rest api 获取数据。我正在获取 Json 格式的数据,然后放入一个文本文件。现在我尝试在数据库中存储该文件数据。下面找到 Mule 流的 XML 格式。

<?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:file="http://www.mulesoft.org/schema/mule/file" xmlns:metadata="http://www.mulesoft.org/schema/mule/metadata" xmlns:json="http://www.mulesoft.org/schema/mule/json" xmlns:dw="http://www.mulesoft.org/schema/mule/ee/dw" xmlns:db="http://www.mulesoft.org/schema/mule/db" xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
    xmlns:spring="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/db http://www.mulesoft.org/schema/mule/db/current/mule-db.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/ee/dw http://www.mulesoft.org/schema/mule/ee/dw/current/dw.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/json http://www.mulesoft.org/schema/mule/json/current/mule-json.xsd
http://www.mulesoft.org/schema/mule/file http://www.mulesoft.org/schema/mule/file/current/mule-file.xsd">
    <http:listener-config name="HTTP_Listener_Configuration" host="0.0.0.0" port="8082" doc:name="HTTP Listener Configuration"/>
    <http:request-config name="HTTP_Request_Configuration" host="$host" port="$port" doc:name="HTTP Request Configuration"/>
    <db:generic-config name="Generic_Database_Configuration" url="localDB Connection" driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" doc:name="Generic Database Configuration"/>
    <file:connector name="File" autoDelete="true" streaming="true" validateConnections="true" doc:name="File"/>

    <flow name="Flowname">
        <http:listener config-ref="HTTP_Listener_Configuration" path="/Customer" doc:name="HTTP" />
        <http:request config-ref="HTTP_Request_Configuration" path="/Services/Customers/api/2.0/search/{a}" method="GET" doc:name="HTTP">
            <http:request-builder>
                <http:uri-param paramName="a" value="s"/>
            </http:request-builder>
        </http:request>
        <file:outbound-endpoint path="D:\Docs" outputPattern="test.txt" responseTimeout="10000" doc:name="File"/>
        <json:json-to-object-transformer returnClass="java.util.HashMap" mimeType="text/plain" doc:name="JSON to Object"/>
        <logger message="#[message.payload]" level="INFO" doc:name="Logger"/>
        <set-payload value="#[message.payload.CustomerID],#[message.payload.Address],#[message.payload.DOB],#[message.payload.FirstName],#[message.payload.LastName],#[message.payload.MiddleName],#[message.payload.PhoneNo]" doc:name="Set Payload"/>
        <db:insert config-ref="Generic_Database_Configuration" doc:name="Database">
            <db:parameterized-query><![CDATA[INSERT INTO dbo.tblCustomer (Customerid,Address,Dob,Firstname,LastName,Middlename,Phoneno) VALUES (#[Message.payload.CustomerID],#[Message.payload.Address],#[Message.payload.DOB],#[Message.payload.FirstName],#[Message.payload.LastName],#[Message.payload.MiddleName],#[Message.payload.PhoneNo])]]></db:parameterized-query>
        </db:insert>
    </flow>
</mule>

像这样从服务中获取数据

[{
    "Address": "372 Willene Drive",
    "CustomerID": 1010007031,
    "DOB": "1981-09-19",
    "FirstName": "Aaliyah",
    "LastName": "Gonzalez",
    "MiddleName": "R",
    "PhoneNumber": "7775271592"
}, {
    "Address": null,
    "CustomerID": 1010007743,
    "DOB": "1937-05-28",
    "FirstName": "Aaron",
    "LastName": "Green",
    "MiddleName": "T",
    "PhoneNumber": "0924758727"
}, {
    "Address": "7 Country Lake Drive",
    "CustomerID": 1010004653,
    "DOB": "1936-03-07",
    "FirstName": "Aaron",
    "LastName": "Gutierrez",
    "MiddleName": "Q",
    "PhoneNumber": "9919500942"
}, {
    "Address": "157 Tamir Avenue",
    "CustomerID": 1010005851,
    "DOB": "1955-12-19",
    "FirstName": "Abigail",
    "LastName": "Garcia",
    "MiddleName": "G",
    "PhoneNumber": "4695049914"
}, {
    "Address": "5 Cross Road",
    "CustomerID": 1010007962,
    "DOB": "1939-07-23",
    "FirstName": "Abigail",
    "LastName": "Gomez",
    "MiddleName": "R",
    "PhoneNumber": "6267010014"
}]

你能帮忙吗?

【问题讨论】:

    标签: mule esb mule-component


    【解决方案1】:

    我也在学习 Mule,有成千上万的问题,但我想我可以回答你的问题。

    您的流程中有一些流程。你一次提出了太多问题。

    这是您的流程(我为 cmets 的 HTTP 添加了 1/2)

    第一个问题是我们有 3 个入口点。 2 个 HTTPs 和 1 个文件。 HTTP1 等待一个 http 调用。 HTTP2 等待另一个,但两者都不做任何事情,因为我们有文件组件,它实际上假设要获取数据。

    让我们摆脱不必要的 HTTPs 并重新配置文件以从本地目录中获取一些文件。你可以添加流程的另一部分以从 HTTP 获取文件(存储在文件中,这不是必需的)然后使用它。我跳过这个,因为它不适合将数据插入数据库的问题主题。

    配置中的第二个问题是将 JSON 映射到 Map。你有数组。所以,让我们将它映射到数组。查看代码。

    第三个问题是你有一个数据库连接器,它可以处理一条记录,但你在 Arry 中有很多。因此,让我们对 Array 使用 ForEach 循环并一一处理记录。

    为了证明它有效,我添加了几个 Logger。

    这是不言自明的流程

    这是代码

        <?xml version="1.0" encoding="UTF-8"?>
    
    <mule xmlns:file="http://www.mulesoft.org/schema/mule/file" xmlns:metadata="http://www.mulesoft.org/schema/mule/metadata" xmlns:json="http://www.mulesoft.org/schema/mule/json" xmlns:dw="http://www.mulesoft.org/schema/mule/ee/dw" xmlns:db="http://www.mulesoft.org/schema/mule/db" xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
        xmlns:spring="http://www.springframework.org/schema/beans" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
    http://www.mulesoft.org/schema/mule/db http://www.mulesoft.org/schema/mule/db/current/mule-db.xsd
    http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
    http://www.mulesoft.org/schema/mule/ee/dw http://www.mulesoft.org/schema/mule/ee/dw/current/dw.xsd
    http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
    http://www.mulesoft.org/schema/mule/json http://www.mulesoft.org/schema/mule/json/current/mule-json.xsd
    http://www.mulesoft.org/schema/mule/file http://www.mulesoft.org/schema/mule/file/current/mule-file.xsd">
        <db:generic-config name="Generic_Database_Configuration" url="localDB Connection" driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" doc:name="Generic Database Configuration"/>
        <file:connector name="File" autoDelete="true" streaming="true" validateConnections="true" doc:name="File"/>
    
        <flow name="Flowname">
            <file:inbound-endpoint path="C:\tmp" responseTimeout="10000" doc:name="FileIn">
                <file:filename-regex-filter pattern="text.txt" caseSensitive="true"/>
            </file:inbound-endpoint>
    
            <file:file-to-string-transformer doc:name="File to String"/>
    
            <json:json-to-object-transformer returnClass="java.util.ArrayList" mimeType="text/plain" doc:name="JSON to Object"/>
            <logger message="#[payload]" level="INFO" doc:name="Log Whole Payload"/>
            <foreach doc:name="For Each">
                <logger message="#[payload]" level="INFO" doc:name="Log one Record"/>
                <logger message="#[payload.Address] #[payload.CustomerID]" level="INFO" doc:name="Log two fields"/>
                <db:insert config-ref="Generic_Database_Configuration" doc:name="Database">
                <db:parameterized-query><![CDATA[INSERT INTO dbo.tblCustomer (Customerid,Address,Dob,Firstname,LastName,Middlename,Phoneno) VALUES (#[Message.payload.CustomerID],#[Message.payload.Address],#[Message.payload.DOB],#[Message.payload.FirstName],#[Message.payload.LastName],#[Message.payload.MiddleName],#[Message.payload.PhoneNo])]]></db:parameterized-query>
    
            </db:insert>
                <logger message="Record succesfull" level="INFO" doc:name="Log Success"/>
    
            </foreach>
    
        </flow>
    </mule>
    

    localDB Connection 更改为真实的 url,例如

    jdbc:sqlserver://myserver:1433;数据库名称=我的数据库;用户=myid;密码=我的密码;

    你可以走了。

    运行应用程序。

    将数据文件复制到 c:\tmp\text.txt

    应用程序将抓取文件,转换为字符串(删除文件以准备下一个),将字符串转换为对象数组,并为每个对象(即您的行)记录它,记录两个字段,存储记录和制作成功的日志消息。

    然后应用程序将等待另一个 text.txt 继续进行。

    当然,所有这些步骤都不是必需的,但它们可以帮助您了解正在发生的事情、发生的时间和发生的事情。

    【讨论】:

    • 谢谢亚历克斯,我的问题可能不清楚,但你明白我想要什么。我会尝试这种方法,如果有任何疑问,请告诉您。
    • 非常感谢亚历克斯。我已经按照你的建议完成了我的 POC。再次感谢您的快速回复。
    • 这是使用 Mule 插入数据库的最有效方法吗?为什么不使用数据编织和映射到数据库?不知何故,在遍历对象并一一插入时不出售
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多