Flex Gateway新着情報
Governance新着情報
Monitoring API ManagerMule 4 の Object Store Connector は、Mule 3 の Object Store Connector と非常に似ています。これらのメジャーバージョンの主な違いは次のとおりです。
カスタムオブジェクトストアの作成方法。Mule 4 でのカスタムオブジェクトストアの作成では、Spring の使用や、特定の Java クラスの存在を知っている必要がありません。
キーは必ず文字列であること。以前の Object Store Connector では Serializable
をキーとして使用できました。
Mule 4 では、すべてのキーは String
型である必要があります。
Mule 3 の Object Store Connector で使用されていた名前空間は objectstore
でした。Mule 4 の新しいコネクタでは、この名前空間が os
に変更されました。
<objectstore:contains config-ref="ObjectStoreConnector" key="#[flowVars.userId]"/>
<os:contains key="#[vars.userId]" objectStore="customObjectStore"/>
前述の例では、config-ref
パラメーターが削除され、代わりに objectStore
パラメーターが使用されていました。これは、Mule 3 ではほとんどのコネクタ操作にコネクタ設定の参照が必要であるのに対し、Mule 4 のほとんどの操作では代わりに Object Store の最上位レベルの要素の参照を受け取るからです。
カスタムオブジェクトストアは、操作で使用するために名前で参照できる OS のグローバル定義で、オブジェクトストアの動作をニーズに応じて調整し、設定することができます。
Mule 3 では、新しい ObjectStore を作成するには、Spring bean を作成し、ObjectStore に使用する特定の Java クラスを知っている必要がありました。Mule 4 では、これがかなり容易になり、os:object-store
コンポーネントを使用して ObjectStore を宣言するグローバル要素を作成するだけですみます。
次の例は、永続的なカスタムオブジェクトストアを使用して HTTP エンドポイント経由で store
と retrieve
が公開される簡単なケースを、Mule 3 で行われていた方法と Mule 4 で行う方法を示しています。
<spring:beans>
<spring:bean id="myCustomObjectStore" class="org.mule.util.store.SimpleMemoryObjectStore"/> (1)
</spring:beans>
<objectstore:config name="ObjectStoreConnector" objectStore-ref="myCustomObjectStore" partition="users" entryTtl="3600000" expirationInterval="10000" maxEntries="1000" persistent="true"/> (2)
<http:listener-config name="HTTP_Listener_Configuration" host="0.0.0.0" port="8080"/>
<flow name="storeBook">
<http:listener config-ref="HTTP_Listener_Configuration" path="/store"/>
<dw:transform-message>
<dw:set-payload><![CDATA[%dw 1.0 (3)
%output application/java
---
{
id: inboundProperties.'http.query.params'.id,
book: inboundProperties.'http.query.params'.book,
author: inboundProperties.'http.query.params'.author
}]]></dw:set-payload>
</dw:transform-message>
<objectstore:store config-ref="ObjectStoreConnector" key="#[payload.id]" value-ref="#[payload]"/> (4)
</flow>
<flow name="retrieveBook">
<http:listener config-ref="HTTP_Listener_Configuration" path="/retrieve"/>
<objectstore:retrieve config-ref="ObjectStoreConnector" key="#[message.inboundProperties.'http.query.params'.id]"/>
<json:object-to-json-transformer/>
</flow>
このスニペットでは、次の点に注目します。
1 | Spring bean と Java クラスへの参照を使用してカスタムオブジェクトストアを作成します。 |
2 | 設定でカスタムオブジェクトストアを参照します。 |
3 | store 操作を使用する前に DataWeave 変換を使用して、ペイロードに何が保存されるのかを設定します。 |
4 | ペイロードはオブジェクトストアに保存されます。 |
Mule 4 で同じアプリケーションを実装すると次のようになります。
<http:listener-config name="HTTP_Listener_config">
<http:listener-connection host="localhost" port="8080" />
</http:listener-config>
<os:object-store name="booksObjectStore" maxEntries="1000" entryTtl="1" entryTtlUnit="HOURS" expirationIntervalUnit="SECONDS" expirationInterval="10"/> (1)
<flow name="storeBook">
<http:listener config-ref="HTTP_Listener_config" path="/store"/>
<os:store key="#[attributes.queryParams.id]" objectStore="booksObjectStore" failIfPresent="true"> (2)
<os:value>
#[{
id: attributes.queryParams.id,
book: attributes.queryParams.book,
author: attributes.queryParams.author
}]
</os:value>
</os:store>
</flow>
<flow name="retrieveBook">
<http:listener config-ref="HTTP_Listener_config" path="/retrieve"/>
<os:retrieve key="#[attributes.queryParams.id]" objectStore="booksObjectStore"/>
<set-payload value="#[output application/json --- payload]">
</flow>
主な違いは次のとおりです。
1 | 新しいオブジェクトは Spring bean と Java クラスを知らずに作成されます。ここで定義されているのは、設定ではなく、オブジェクトストアの最上位レベルの要素です。 |
2 | 変数またはペイロードに値を保存する必要がなく、インライン記述でオブジェクトストアに何が保存されるのかが定義されます。 |
Mule 3 では、オブジェクトストアのパーティションを指定する必要がありました。Mule 4 では、パーティションを指定する必要がなくなり、代わりに別のオブジェクトストアを使用します。 また、エントリの存続時間と、エントリの有効期限またはエントリ最大数を超えたどうかをチェックする頻度の両方に、時間単位を指定することができます。
Mule 3 では、オブジェクトストアの値を参照するために使用するキーに任意の Serializable
を使用できました。Mule 4 では、この目的に使用できるのは String
オブジェクトのみです。
String
ではなく Serializable
をキーとして使用している場合は、String
値に変換してください。
Mule 4 では、値のパラメーターがコンテンツのパラメーターとして取得されるようになりました。つまり、インラインで定義する必要があります。これは、Mule 3 では属性として設定されていました。
また、オブジェクトストアの値を更新する方法が若干変更されました。Mule 3 には、デフォルトで false になる overwrite
というフラグがありました。Mule 4 には、デフォルトで false になる failIfPresent
というフラグがあります。つまり、すでに使用されているキーを指定した store 操作を使用する場合、デフォルトの動作はその値の上書きです。
Mule 4 では、キーがすでに存在し、フラグ failIfPresent が true に設定されると、OS:KEY_ALREADY_EXISTS エラーがスローされます。
|
移行するときには、デフォルトの動作が異なるため、フラグがどのように設定されているかに注意してください。
<http:listener-config name="HTTP_Listener_Configuration" host="0.0.0.0" port="8080"/>
<objectstore:config name="ObjectStoreConnector" partition="users"/>
<flow name="storeClient">
<http:listener config-ref="HTTP_Listener_Configuration" path="/put"/>
<dw:transform-message>
<dw:set-variable variableName="client"><![CDATA[%dw 1.0
%output application/java
---
{
id: payload.id,
name: payload.name,
lname: payload.lname
}]]></dw:set-variable>
</dw:transform-message>
<objectstore:store config-ref="ObjectStoreConnector" key="#[flowVars.client.id]" value-ref="#[flowVars.client]"/> (1)
</flow>
1 | Mule 3 では DataWeave 式をインラインで挿入できないので、コンテンツを変数に保存するか、ペイロードを変更するかのいずれかになります。この例では、クライアント変数に割り当てられました。 |
<http:listener-config name="HTTP_Listener_config">
<http:listener-connection host="localhost" port="8080" />
</http:listener-config>
<os:object-store name="Object_store" persistent="false"/>
<flow name="storeClient">
<http:listener config-ref="HTTP_Listener_config" path="/put"/>
<os:store key="#[payload.id]" objectStore="Object_store" failIfPresent="true">
<os:value >#[{ (1)
id: payload.id,
name: payload.name,
lname: payload.lname,
age: payload.age
}]</os:value>
</os:store>
</flow>
1 | Mule 4 では、保存するコンテンツをインラインで挿入できます。この操作の後、ペイロードは変更されないままです。 |
Mule 4 のオブジェクトストアはデフォルトで永続的なのに対し、Mule 3 Connector ではデフォルトでオンメモリに保存されます。このため、実装を移行するときには注意が必要です。オブジェクトストアの永続性を明示的に指定しないと、違うことを意味するようになります。
この例は、移行後に persistent (永続) 属性をどのように明示的に追加する必要があるかを示しています。
<objectstore:config name="ObjectStoreConnector" partition="users"/>
<os:object-store name="customObjectStore" persistent="false"/>
オブジェクトストアの特定のパーティションをクリアするには、Mule 3 では dispose 操作が使用されていました。 Mule 4 には、オブジェクトストア全体をクリアする clear 操作があります。パーティションという概念は使用されなくなりした。
<objectstore:dispose-store config-ref="ObjectStoreConnector" partitionName="users"/>
<os:clear objectStore="customObjectStore"/>
Mule 4 の clear 操作は、オブジェクトストア全体をクリアします。 |