Mule ESB 3.7のDatabase Connectorを試す2(INSERT)
先日、Muleを使ってOracle Databaseにアクセスするための設定の記事を書きました。
今回は、JSONで受け取って、Oracle DBにInsertするまでを書きます。
前回のSELECTだけやるフローを改良しています。
まず、HTTPメソッドに応じて動かすフローを分けています。
GETメソッドで動かすフロー
<flow name="GetFlow"> <http:listener config-ref="HTTP_Listener_Configuration" path="/" doc:name="Recieve HTTP request" allowedMethods="GET"/>
中身は前回のフローとほぼ同様で、データベースに対してSELECT文を発行して、結果をJSONにして返します。
レスポンスのサンプルはこんな感じ。
[ { "VALUE": "foo", "NAME": "SATO" }, { "VALUE": "bar", "NAME": "SUZUKI" } ]
POSTメソッドで動かすフロー
<flow name="PostFlow" doc:name="PostFlow"> <http:listener config-ref="HTTP_Listener_Configuration" path="/" doc:name="Recieve HTTP request" allowedMethods="POST"/>
中身の処理は
デバッグ用にTransformerの前後でPayloadの中身をログにダンプ
<logger doc:name="Log the payload" level="INFO" message="About to echo #[message.payload]"/>
変換前後のログの出力結果はこんな感じ。
INFO 2015-08-06 08:51:47,892 [[database_update].HTTP_Listener_Configuration.worker.01] org.mule.api.processor.LoggerMessageProcessor: About to echo org.glassfish.grizzly.utils.BufferInputStream@386d562 INFO 2015-08-06 08:51:47,973 [[database_update].HTTP_Listener_Configuration.worker.01] org.mule.api.processor.LoggerMessageProcessor: About to echo [{VALUE=foo, NAME=SATO}, {VALUE=bar, NAME=SUZUKI}]
JSONをObjectに変換
この時の変換先のクラスはjava.util.ArrayList
ということを指定しています。
今回は、この後でループ処理をやるためにArrayListに変換していますが、<byte-array-to-string-transformer doc:name="Convert Byte Array to String"/>
とかで、一つのStringオブジェクトに変換してもOK。
<json:json-to-object-transformer returnClass="java.util.ArrayList" doc:name="JSON to Object"/>
INSERTの発行
リクエストに含まれる件数分ループで回しつつ、Insert文を発行。
<foreach collection="#[message.payload]" doc:name="For Each"> <db:insert config-ref="Oracle_Configuration" doc:name="Database"> <db:parameterized-query><![CDATA[INSERT INTO TEST(NAME, VALUE) VALUES (#[payload.NAME], #[payload.VALUE])]]></db:parameterized-query> </db:insert> </foreach>
マニュアル
あんまり読んで無いけど、JDBC周りのリファレンス。
JDBC Transport Reference - Current Mule Documentation
HTTPリスナでリクエストを受け付けるところはこのマニュアルを読んでおけばOK。
HTTP Listener Connector - Current Mule Documentation
Payloadからの値の取り方について
あと、これも参考にした。
JSON Payload ingested into MySQL database using Mule ESB - Stack Overflow