Flex Gateway新着情報
Governance新着情報
Monitoring API Managerデータベース用 Anypoint Connector (Database Connector) の Query single 操作では、データベースから単一レコード (行) を返す SQL クエリを実行し、追加の変換なしで結果のペイロードにアクセスできます。この操作では、返された項目はストリーミングされません。クエリを実行すると、返された行のすべての値がメモリに読み込まれ、ペイロードに返されます。
ただし、注意が必要です。行が大きすぎるとメモリ不足になる可能性があります。 また、接続プーリングを使用する場合は、クエリの実行直後に接続がプールに返されるため、アプリケーションで接続が使い果たされることを心配する必要はありません。
Query single 操作を呼び出す方法は Select 操作と同じですが、Query single 操作を使用すると、実際の SQL クエリで返されるレコード数に関係なく、取得する結果は常に 1 つのみになります。
次の例は、MySQL データベースのテーブルから本の情報を取得する操作を Mule アプリケーション内で設定する方法を示しています。この例を実行するには、次の操作が必要です。
BOOK
というテーブルを作成する SQL ステートメントを実行し、7 件の本情報 (title、author、bookshopName、isbn、price) のレコードを挿入します。
SQL データベース接続を設定します。
Mule アプリケーションを作成します。
アプリケーションを実行し、curl コマンドを使用してアプリケーションをテストします。
SQL データベース接続を設定して Mule アプリケーションを作成する前に、次の SQL ステートメントを実行して BOOK
というテーブルを作成し、7 件の本レコードを挿入します。増分 id
は、テーブルに追加される新しい各本に関連付けられます。たとえば、テーブルに最初に追加された本の id
は 1
になり、2 番目の本の id
は 2
になります。
USE SYS;
CREATE TABLE BOOK(
id MEDIUMINT NOT NULL AUTO_INCREMENT,
title VARCHAR(100),
author VARCHAR(100),
bookshopName VARCHAR(100),
isbn VARCHAR(13),
price SMALLINT,
PRIMARY KEY (id)
);
INSERT INTO BOOK(title, author, bookshopName, isbn, price) VALUES('Good Omens', 'Terry Pratchett and Neil Gaiman', 'A.Z. Fell and Co.', '9780060853983', 50);
INSERT INTO BOOK(title, author, bookshopName, isbn, price) VALUES('A Wizard of Earthsea', 'Ursula K. Le Guin', 'A.Z. Fell and Co.', '9780547773742', 20);
INSERT INTO BOOK(title, author, bookshopName, isbn, price) VALUES('IT', 'Stephen King', 'A.Z. Fell and Co.', '9781508297123', 20);
INSERT INTO BOOK(title, author, bookshopName, isbn, price) VALUES('The Nice and Accurate Prophecies of Agnes Nutter', 'Agnes Nutter', 'A.Z. Fell and Co.', '000000000000', 200);
INSERT INTO BOOK(title, author, bookshopName, isbn, price) VALUES('Cujo', 'Stephen King', 'A.Z. Fell and Co.', '9781501192241', 20);
INSERT INTO BOOK(title, author, bookshopName, isbn, price) VALUES('Nation', 'Terry Pratchett', 'A.Z. Fell and Co.', '9780552557795', 30);
INSERT INTO BOOK(title, author, bookshopName, isbn, price) VALUES('The Ocean at the End of the Lane', 'Neil Gaiman', 'A.Z. Fell and Co.', '9780062459367', 30);
テーブルを作成したら、Anypoint Studio に移動して MySQL データベース接続を設定します。
Studio で新しい Mule プロジェクトを作成します。
[Global Elements (グローバル要素)] ビューに移動します。
[Create (作成)] をクリックして、[Choose Global Type (グローバル種別の選択)] ビューを開きます。
[Filter (検索条件)] 項目に「http
」と入力し、[HTTP Listener config (HTTP リスナー設定)] を選択して [OK] をクリックします。
この設定は、Mule アプリケーションフローを開始する HTTP Listener ソース用です。
[HTTP Listener config (HTTP リスナー設定)] ウィンドウで、次の項目に入力します。
Protocol (プロトコル): HTTP (Default)
Host (ホスト): All Interfaces [0.0.0.0] (default)
Port (ポート): 8081
[OK] をクリックします。
[Global Elements (グローバル要素)] ビューで [Create (作成)] をクリックして [Choose Global Type (グローバル種別の選択)] ビューを開きます。
[Filter (検索条件)] 項目に「database
」と入力し、[Database Config (データベース設定)] を選択して [OK] をクリックします。
[Database Config (データベース設定)] ウィンドウで [Name (名前)] 項目を dbConfig
に設定します。
[Connection (接続)] 項目で [MySQL Connection (MySQL 接続)] を選択します。
[Configure (設定)] をクリックし、必要な MySQL JDBC ドライバーを追加して、次のいずれかを選択します。
Add recommended library (推奨されるライブラリを追加)
推奨されるライブラリをインストールします。
Use local file (ローカルファイルを使用)
ローカルファイルを使用してライブラリをインストールします。
Add Maven dependency (Maven 連動関係を追加)
Maven 連動関係をインストールしてプロジェクトに追加します。
[Connection (接続)] セクションで、次の項目に入力します。
Host (ホスト): localhost
Port (ポート): 3306
User (ユーザー): root
Password (パスワード): mysql
Database (データベース): sys
[Advanced (詳細)] タブで [Pooling profile (プーリングプロファイル)] 項目を [Edit inline (インライン編集)] に設定します。
[Max pool size (最大プールサイズ)] 項目を 5
に設定します。
[Test Connection (接続をテスト)] をクリックして、Mule がデータベースに接続できることを確認します。
[OK] をクリックします。
次のスクリーンショットは、HTTP リスナーのグローバル要素設定を示しています。
次のスクリーンショットは、データベースのグローバル要素設定を示しています。
MySQL データベース接続を設定したら、Mule アプリケーションの作成、設定、実行、テストを行います。
Mule フローを作成する手順は、次のとおりです。
[Mule Palette (Mule パレット)] ビューで、[HTTP] の [Listener] ソースを選択してキャンバスにドラッグします。
このソースは受信 HTTP メッセージ属性をリスンすることでフローを開始します。
[Connector configuration (コネクタ設定)] 項目で HTTP_Listener_config
グローバル設定を選択します。
[Path (パス)] 項目を /select/book/{maxId}
に設定します。
maxId
値パラメーターは、データベースから取得する本レコードの数を示します。データベース接続プールに設定された最大接続数に関係なく、この値を増分できます。
[Mime Type (Mime タイプ)] タブで [Mime Type (MIME タイプ)] 項目を application/json
に設定します。
[Advanced (詳細)] タブで [Allowed methods (許可されるメソッド)] 項目を GET
に設定します。
[Set Variable] コンポーネントを [Listener] ソースの右にドラッグします。
このコンポーネントでは、Query single 操作から取得されるデータベース結果を保存するための新しい変数を作成します。
[Name (名前)] 項目を bookCollection
、[Value (値)] 項目を #[[]]
に設定します。
For Each コンポーネントを使用して、HTTP リスナーで要求された本の数まで反復処理することで、Mule アプリケーションの作成を継続します。次に、Query single 操作を使用して本の情報を取得し、結果をペイロード変数に保存します。
[For Each] コンポーネントを [Set Variable] の右にドラッグします。
[Collection (コレクション)] 項目を #[1 to attributes.uriParams.maxId as Number]
に設定します。
HTTP 要求 /select/book/{maxId}
を実行すると、この式により、テーブル内の本のコレクションが最初の本 (1
) から maxId
パラメーターに設定された本の数まで反復処理されます。
[Query single] 操作を [For Each] コンポーネントにドラッグします。
[Connector configuration (コネクタ設定)] 項目を Database_Config
に設定して、MySQL データベース設定に接続します。
[SQL Query Text (SQL クエリテキスト)] 項目を SELECT id, title, author FROM BOOK WHERE id = :id
に設定します。
このクエリでは、データベースから本の情報を選択します。
[Input Parameters (入力パラメーター)] 項目を ![CDATA[#[{'id': payload }]]]
に設定します。
この式では、(前述の [SQL Query Text (SQL クエリテキスト)] 式で参照されている) キーパラメーター id
を、SELECT
クエリを使用して取得した本情報の結果値である payload
にマップします。
別の [Set Variable] コンポーネントを [Query single] 操作の右にドラッグします。
[Name (名前)] 項目を bookCollection
、[Value (値)] 項目を #[vars.bookCollection ++ [payload]]
に設定します。
元の変数 bookCollection
に、取得した本情報の payload
が保存されるようになります。
[Set Payload] コンポーネントを [For Each] コンポーネントの右にドラッグします。
[Value (値)] 項目を #[vars.bookCollection]
に設定して、変数のコンテンツを新しい出力ペイロードとして保存します。
この例のフローをすばやく Mule アプリケーションに読み込むには、次のコードを Studio XML エディターに貼り付けます。
<?xml version="1.0" encoding="UTF-8"?>
<mule 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:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
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/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd"></mule>
<http:listener-config name="HTTP_Listener_config" doc:name="HTTP Listener config" doc:id="9501220e-fba8-440b-afdf-14b4ca010fe8" >
<http:listener-connection host="0.0.0.0" port="8081" />
</http:listener-config>
<db:config name="Database_Config" doc:name="Database Config" doc:id="20db2231-3668-48d0-bb60-66f120fc99c8" >
<db:my-sql-connection host="localhost" port="3306" user="root" password="mysql" database="sys">
<db:pooling-profile maxPoolSize="5"/>
</db:my-sql-connection>
</db:config>
<flow name="querysingleForeachFlow">
<http:listener doc:name="Listener" config-ref="HTTP_Listener_config" path="/select/book/{maxId}" outputMimeType="application/json" allowedMethods="GET"/>
<set-variable variableName="bookCollection" value="#[[]]" />
<foreach collection="#[1 to attributes.uriParams.maxId as Number]">
<db:query-single doc:name="Query single" config-ref="Database_Config">
<db:sql>SELECT id, title, author FROM BOOK WHERE id = :id</db:sql>
<db:input-parameters><![CDATA[#[{'id': payload }]]]></db:input-parameters>
</db:query-single>
<set-variable variableName="bookCollection" value="#[vars.bookCollection ++ [payload]]" />
</foreach>
<set-payload value="#[output application/json --- { books : vars.bookCollection }]" />
</flow>