TCP 接続インターセプター

TcpConnectionInterceptorFactoryChain への参照を使用して接続ファクトリを構成できます。インターセプターを使用して、ネゴシエーション、セキュリティ、その他のオプションなどの動作を接続に追加できます。現在、フレームワークによってインターセプターは提供されていませんが、例についてはソースリポジトリの InterceptedSharedConnectionTests  [GitHub] (英語) を参照してください。

テストケースで使用される HelloWorldInterceptor は、次のように機能します。

インターセプターは、最初にクライアント接続ファクトリで構成されます。最初のメッセージがインターセプトされた接続を介して送信されると、インターセプターは接続を介して "Hello" を送信し、"world!" を受信することを期待します。それが発生すると、ネゴシエーションが完了し、元のメッセージが送信されます。さらに、同じ接続を使用するメッセージは、追加のネゴシエーションなしで送信されます。

サーバー接続ファクトリで構成されている場合、インターセプターは最初のメッセージが "Hello" であることを要求し、そうである場合は "world!" を返します。それ以外の場合は、接続を閉じる原因となる例外をスローします。

すべての TcpConnection メソッドがインターセプトされます。インターセプターインスタンスは、インターセプターファクトリによって接続ごとに作成されます。インターセプターがステートフルの場合、ファクトリは接続ごとに新しいインスタンスを作成する必要があります。状態がない場合、同じインターセプターが各接続をラップできます。インターセプターファクトリは、インターセプターファクトリチェーンの構成に追加されます。チェーンは、interceptor-factory 属性を設定することで接続ファクトリに提供できます。インターセプターは TcpConnectionInterceptorSupport を継承する必要があります。ファクトリは TcpConnectionInterceptorFactory インターフェースを実装する必要があります。TcpConnectionInterceptorSupport にはパススルーメソッドがあります。このクラスを継承することにより、インターセプトするメソッドのみを実装する必要があります。

次の例は、接続インターセプターファクトリチェーンを構成する方法を示しています。

<bean id="helloWorldInterceptorFactory"
    class="o.s.i.ip.tcp.connection.TcpConnectionInterceptorFactoryChain">
    <property name="interceptors">
        <array>
            <bean class="o.s.i.ip.tcp.connection.HelloWorldInterceptorFactory"/>
        </array>
    </property>
</bean>

<int-ip:tcp-connection-factory id="server"
    type="server"
    port="12345"
    using-nio="true"
    single-use="true"
    interceptor-factory-chain="helloWorldInterceptorFactory"/>

<int-ip:tcp-connection-factory id="client"
    type="client"
    host="localhost"
    port="12345"
    single-use="true"
    so-timeout="100000"
    using-nio="true"
    interceptor-factory-chain="helloWorldInterceptorFactory"/>