WebSockets サーバーコンポーネント - Mule 4

Inbound Listener

Inbound Listener コンポーネントは、クライアントが接続できる WebSocket エンドポイントを表します。このエンドポイントを参照して、外部クライアントは WebSocket 接続を確立し、メッセージを送信するたびにフローをトリガーします。

クライアントは、defaultGroups パラメーターでこのエンドポイントが自動的にサブスクライブするデフォルトのグループを示すこともできます。こうしたグループに対してブロードキャスト操作が実行された場合、このエンドポイントが受信して処理します。このサブスクリプションはアプリケーションドメイン内で実行されます。つまり、デフォルトのグループパラメーターを追加しても対応するアウトバウンド WebSocket にこのサブスクリプションに関する情報が送信されません。これは、グループの機能が WS プロトコルの一部ではないためです。グループに対するインバウンド WebSocket をサブスクライブする場合、アプリケーションドメイン内の 1 つの WebSocket がその他のすべての WebSockets にメッセージを送信するには、アプリケーションドメインも指定されたグループにサブスクライブされている必要があります。要するに、グループのサブスクリプションは同じアプリケーションドメイン内にある WebSockets のみに影響を及ぼし、外部アプリケーションの WebSockets は Mule アプリケーションによって他のグループにサブスクライブされません。

<flow name="onIncomingMessageFlow">
    <websocket:inbound-listener
        path="/chat"
        defaultGroups="#[['AVENGERS', 'REVENGERS']]"
        config-ref="ws" />
    <logger
        level="INFO"
        message="#['Received message ' ++ payload ++ ' from socket: ' ++ attributes.socketId]" />

    <websocket:send
        doc:name="SendResponse"
        socketId="#[attributes.socketId]"
        config-ref="ws" >
        <websocket:content>#['I'm fine, thank you!']</websocket:content>
    </websocket:send>
</flow>

<flow name="sendFriendlyMessageFlow">
    <websocket:open-outbound-socket path="/chat" config-ref="ws" />

    <websocket:send
        doc:name="SendMessage"
        socketId="#[attributes.socketId]"
        config-ref="ws" >
        <websocket:content>#['Hi! How are you?']</websocket:content>
    </websocket:send>
</flow>
xml

応答の送信

フローが終了したときに自動的に応答を送信する ​<http:listener>​ 要素とは異なり、このコンポーネントが自動的に応答を送信することはありません。これは、WebSocket プロトコルが全二重であり、そのために、応答を送信する必要があるまたは送信することを希望することが保証されないためです。ユースケースに応じて、応答を送信せずにメッセージを処理することを希望する場合もあれば、特定のケースに関する応答のみを送信することを希望する場合もあります。

応答を送信するには、​<websocket:send>​ 操作を使用します。

出力

新しいメッセージが到着するたびに、フローがメッセージを使用してトリガーされ、ペイロードにメッセージのコンテンツが含まれます。メッセージの MIME タイプは HTTP 要求の ​Content-Type​ ヘッダーから取得されます。MIME タイプが設定されていない場合、MIME タイプのデフォルトはプロトコルの DataFrame タイプに応じて次のいずれかになります。

  • バイナリの場合、MIME のデフォルトは ​application/octect-stream​ になります。

  • テキストの場合、MIME のデフォルトは ​text/plain​ になります。

属性には WebSockets 属性オブジェクトが含まれています。

インバウンド接続

これは、INBOUND WebSockets 接続が確立されるたびにトリガーされるメッセージソースです。1 つのパスに指定できるのは次のソースのうちいずれか 1 つであり、そのパスで一致するインバウンドリスナーが存在する必要があります。これは、ソケットの記録やソケットへのグループの割り当てなど、接続後のタスクを実行するために便利です。

このフローは同期的にトリガーされます。このフローが呼び出されるまでに、ソケットはすでに確立されていて、メッセージをブロードキャストまたは受信する可能性もあります。こうしたメッセージはキューに登録され、ソースによってトリガーされたイベントが完了するまでフローに配信されません。失敗すると、キューに登録されたすべてのメッセージが破棄され、接続がドロップされます。

このメッセージソースには主に 2 つのユースケースがあります。

  • 後で使用するために生成されたソケット ID を追跡する

  • WebSockets がアプリケーションで使用できるようになる前に拒否できる検証ポイントを設定する

たとえば、次のフローでは要求の発生元の属性を検証し、検証に合格しなかった場合に接続を終了することを決定します。