例: オブジェクトストアの定義

オブジェクトストアをアプリケーションでグローバルに定義して、名前による参照や、複数コンポーネント間での共有を可能にすることができます。または、特定のコンポーネント専用にオブジェクトストアを作成することができます。

すべてのオブジェクトストア操作は、グローバルオブジェクトストアを参照できます。たとえば、特定のユーザが現在認証されているかどうかを検証する監査フローが必要だとします。定義したオブジェクトストアを参照するために、次のようなコードが考えられます。

<os:contains id="#[userId]" objectStore="tokensStore" />

オブジェクトストアの定義方法

次の条件の 1 つ以上が該当する場合は、グローバルオブジェクトストアを使用する必要があります。

  • コンポーネント間で状態を共有する必要がある: オブジェクトストアは名前で参照できるため、複数のコンポーネントが使用できます。設定がわずかに異なる Salesforce コネクタの 2 つのインスタンスがあるとします。同じトークンを使用で両方のインスタンスを使用し、再度認証しなくてもすむようにできます。

  • クラスタノード間で状態を共有する必要がある: Mule をクラスタモードで使用している場合、情報をクラスタのすべてのノードで使用できるようにすることがあります。それには、グローバルオブジェクトストアが最適です。

  • アプリケーションのロジックで情報を使用する必要がある: Object Store Connector は、ストアの定義だけでなく、ストアの操作もできます。

グローバルオブジェクトストアは、最上位要素として定義され、他のコンポーネントから名前で参照できます。たとえば、次のようにアクセストークンのストアを作成するとします。

<os:object-store name="tokensStore"
   entryTtl="1"
   entryTtlUnit="HOURS"
   maxEntries="100"
   persistent="true"
   expirationInterval="30"
   expirationIntervalUnit="MINUTES" />

この例では、次の機能を持つ tokensStore という名前のオブジェクトストアを定義します。

  • 永続性 (persistent="true"): 値はディスクに保存され、システムが再起動しても存続できます。persistentfalse に設定すると、情報がメモリにのみ保存される一時的なストアになります。

  • 有効期限: 有効期限スレッドは 30 分おきに実行され、存続期間 (TTL) または maxEntries 制限を超えた要素を破棄します。

  • TTL が 1 時間: アクセストークンは非常に機密性が高いので、1 時間以上保持しない方がよいでしょう。それより古いエントリはすべて自動的に削除されます。

  • サイズの制限: ストアが 100 エントリよりも大きくなった場合、有効期限スレッドが実行されると、超過分のスレッドは破棄されます。

上記の例は、説明のみを目的としたもので、アクセストークンを保存するオブジェクトストアの推奨設定を示しているわけではありません。

次の例では、OAuth による Salesforce コネクタ認証を設定し、その後で前の例で作成したオブジェクトストア (tokensStore) にトークンを保存しています。

<sfdc:config-with-oauth name="salesforce-oauth"
  consumerKey="${salesforce.consumerKey}"
  consumerSecret="${salesforce.consumerSecret}">
    <sfdc:oauth-callback-config domain="localhost" localPort="8082"
      remotePort="8082" path="callback" connector-ref="HTTP_HTTPS" />
    <sfdc:oauth-store-config objectStore="tokensStore" />
</sfdc:config-with-oauth>

非公開オブジェクトストアの定義方法

  • 共有状態がセキュリティリスクになる場合は、非公開オブジェクトストアを使用する必要があります。

  • 誰もコネクタレベルからストアを操作できないようにする場合があります。たとえば、誰かが Clear 操作の設定をすべての認証データが削除されるように変更することは避ける必要があります。

その場合は、グローバル要素として定義されず、参照可能な名前のない非公開オブジェクトストアを定義できます。以下はその例です。

<idempotent-message-validator idExpression="#[payload]"
  valueExpression="#[payload]">
    <os:private-object-store
                entryTtl="20"
                entryTtlUnit="MILLISECONDS"
                maxEntries="20"
                persistent="false"
                expirationInterval="20"
                expirationIntervalUnit="MILLISECONDS"/>
</idempotent-message-validator>

この例では、冪等性のあるメッセージ検証機能と、その機能のみがアクセスできるカスタムストアを提供しています。

Was this article helpful?

💙 Thanks for your feedback!

Edit on GitHub