Flex Gateway新着情報
Governance新着情報
Monitoring API ManagerInbound 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 がアプリケーションで使用できるようになる前に拒否できる検証ポイントを設定する
たとえば、次のフローでは要求の発生元の属性を検証し、検証に合格しなかった場合に接続を終了することを決定します。
<flow name="onNewInboundConnection">
<websocket:on-inbound-connection
doc:name="On Inbound Connection"
config-ref="WebSockets_Config"
path="/chat"/>
<choice doc:name="Choice" >
<when expression="#[contains(attributes.headers.alias, 'admin')]">
<websocket:close socketId="#[attributes.socketId]"
reason="Cannot impersonate the admin"
config-ref="WebSockets_Config"/>
</when>
<otherwise >
<logger
level="INFO"
doc:name="Logger"
message="Successfully connected to WebSocket #[attributes.socketId]" />
</otherwise>
</choice>
</flow>
<flow name="chat">
<websocket:inbound-listener
doc:name="Inbound listener"
path="/chat"
config-ref="WebSockets_Config"/>
<logger
level="INFO"
doc:name="Logger"
message="#['Received message' ++ payload]"/>
</flow>
xml