そごうソフトウェア研究所

SOA、開発プロセス、ITアーキテクチャなどについて書いています。Twitterやってます@rsogo

Mule ESB 3.7 メッセージ変換

使えるメッセージ変換の機能は下記のマニュアルを参照。

  • 用意されている変換機能

Objectと、JSONXMLの変換なんかは自動でやってくれる。 いざとなったら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にアクセスするための設定の記事を書きました。

begirama.hatenablog.com

今回は、JSONで受け取って、Oracle DBにInsertするまでを書きます。

まず、メインのmule-config.xml

gist.github.com

前回の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

Mule ESBまとめ

本ブログ内のMule ESBについてのまとめです。

Mule ESBはオープンソースのESB製品です。 オープンソースのCommunity Editionでも、基本的な機能やプロトコルに対応しています。

コネクタの一覧は下記のサイトから調べることができます。 Anypoint Exchange

パッケージ製品用のアダプターを使いたい、GUIで開発したいという場合にはEnterprise Editionが用意されています。

起動

begirama.hatenablog.com

Groovyスクリプト

begirama.hatenablog.com

Database Connector

begirama.hatenablog.com

begirama.hatenablog.com

begirama.hatenablog.com

フロー定義

begirama.hatenablog.com

begirama.hatenablog.com

サンプル

begirama.hatenablog.com

古い記事

有償版についている、Anypoint Studioを使ったエントリ。

begirama.hatenablog.com