Mule ESB 3.7 メッセージ変換
使えるメッセージ変換の機能は下記のマニュアルを参照。
- 用意されている変換機能
Objectと、JSON、XMLの変換なんかは自動でやってくれる。 いざとなったらJavaやGroovyも呼び出せる。
Transformers - Current Mule Documentation
MEL (Mule Expression Language)
MELというXMLベースの独自言語が用意されていて、メッセージの要素にアクセスしたり、値を評価しての条件分岐とか書ける。
概要はこっちのマニュアルを読んで、
Mule Expression Language MEL - Current Mule Documentation
どんな機能が用意されているからは、こっちのリファレンスを見ればOK。 Mule Expression Language Reference - Current Mule Documentation
後はサンプルを見て、感じをつかむのが早い。
デプロイすると、No suitable driver found
が原因のjava.sql.SQLException
が発生する。
Muleを再起動すると解消する。DB接続が絡んでいない場合は、起動中のホットデプロイができているので、DB接続がらみで何かあるのかも知れない。要調査。
org.mule.module.db.internal.domain.connection.ConnectionCreationException: java.sql.SQLException: Cannot get connection for URL jdbc:oracle:thin:CMN/CMDB01@localhost:1521:aaa : No suitable driver found for jdbc:oracle:thin:aaa/aaa@localhost:1521:aaa (java.sql.SQLException). Message payload is of type: LinkedHashMap
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