高度なテクニック

このセクションでは、特定の状況で役立つ高度なテクニックについて説明します。

戦略インターフェース

多くの場合、TCP/IP を介した安全な通信を可能にするために必要なのは、前述の構成だけです。ただし、Spring Integration は、ソケットファクトリとソケットのカスタマイズと変更を可能にするいくつかの戦略インターフェースを提供します。

  • TcpSSLContextSupport

  • TcpSocketFactorySupport

  • TcpSocketSupport

  • TcpNetConnectionSupport

  • TcpNioConnectionSupport

TcpSSLContextSupport 戦略インターフェース

以下のリストは、TcpSSLContextSupport 戦略インターフェースを示しています。

public interface TcpSSLContextSupport {

    SSLContext getSSLContext() throws Exception;

}

TcpSSLContextSupport インターフェースの実装は、SSLContext オブジェクトの作成を担当します。フレームワークによって提供される実装は、前述したDefaultTcpSSLContextSupport です。別の動作が必要な場合は、このインターフェースを実装し、クラス実装の Bean への参照を接続ファクトリに提供します。

TcpSocketFactorySupport 戦略インターフェース

次のリストは、TcpSocketFactorySupport 戦略インターフェースの定義を示しています。

public interface TcpSocketFactorySupport {

    ServerSocketFactory getServerSocketFactory();

    SocketFactory getSocketFactory();

}

このインターフェースの実装は、ServerSocketFactory と SocketFactory への参照を取得する責任があります。2 つの実装が提供されます。1 つ目は、非 SSL ソケット用の DefaultTcpNetSocketFactorySupport です(ssl-context-support 属性が定義されていない場合)。これは、JDK のデフォルトファクトリを使用します。2 番目の実装は DefaultTcpNetSSLSocketFactorySupport です。デフォルトでは、これは ssl-context-support 属性が定義されているときに使用されます。その Bean によって作成された SSLContext を使用して、ソケットファクトリを作成します。

このインターフェースは、using-nio が false の場合にのみ適用されます。NIO はソケットファクトリを使用しません。

TcpSocketSupport 戦略インターフェース

次のリストは、TcpSocketSupport 戦略インターフェースの定義を示しています。

public interface TcpSocketSupport {

    void postProcessServerSocket(ServerSocket serverSocket);

    void postProcessSocket(Socket socket);

}

このインターフェースの実装は、ソケットが作成され、構成されたすべての属性が適用された後、ソケットが使用される前にソケットを変更できます。これは、NIO を使用するかどうかに関係なく適用されます。例: このインターフェースの実装を使用して、SSL ソケットでサポートされている暗号スイートを変更したり、SSL ハンドシェイクの完了後に通知を受けるリスナーを追加したりできます。フレームワークによって提供される唯一の実装は DefaultTcpSocketSupport であり、ソケットを一切変更しません。

TcpSocketFactorySupport または TcpSocketSupport の独自の実装を提供するには、それぞれ socket-factory-support および socket-support 属性を設定して、接続ファクトリにカスタム型の Bean への参照を提供します。

TcpNetConnectionSupport 戦略インターフェース

次のリストは、TcpNetConnectionSupport 戦略インターフェースの定義を示しています。

public interface TcpNetConnectionSupport {

    TcpNetConnection createNewConnection(Socket socket,
            boolean server, boolean lookupHost,
            ApplicationEventPublisher applicationEventPublisher,
            String connectionFactoryName) throws Exception;

}

このインターフェースは、型 TcpNetConnection (またはそのサブクラス)のオブジェクトを作成するために呼び出されます。このフレームワークは、デフォルトで単純な TcpNetConnection オブジェクトを作成する単一の実装(DefaultTcpNetConnectionSupport)を提供します。pushbackCapable と pushbackBufferSize の 2 つのプロパティがあります。プッシュバックが有効な場合、実装は接続の InputStream を PushbackInputStream にラップするサブクラスを返します。PushbackInputStream のデフォルトに合わせて、バッファーサイズのデフォルトは 1 になります。これにより、デシリアライザーはストリームにバイトを「未読」(プッシュバック)できます。次の簡単な例は、最初のバイトを「覗き」、どのデシリアライザーを呼び出すかを決定する委譲デシリアライザーでどのように使用されるかを示しています。

public class CompositeDeserializer implements Deserializer<byte[]> {

    private final ByteArrayStxEtxSerializer stxEtx = new ByteArrayStxEtxSerializer();

    private final ByteArrayCrLfSerializer crlf = new ByteArrayCrLfSerializer();

    @Override
    public byte[] deserialize(InputStream inputStream) throws IOException {
        PushbackInputStream pbis = (PushbackInputStream) inputStream;
        int first = pbis.read();
        if (first < 0) {
            throw new SoftEndOfStreamException();
        }
        pbis.unread(first);
        if (first == ByteArrayStxEtxSerializer.STX) {
            this.receivedStxEtx = true;
            return this.stxEtx.deserialize(pbis);
        }
        else {
            this.receivedCrLf = true;
            return this.crlf.deserialize(pbis);
        }
    }

}

TcpNioConnectionSupport 戦略インターフェース

次のリストは、TcpNioConnectionSupport 戦略インターフェースの定義を示しています。

public interface TcpNioConnectionSupport {

    TcpNioConnection createNewConnection(SocketChannel socketChannel,
            boolean server, boolean lookupHost,
            ApplicationEventPublisher applicationEventPublisher,
            String connectionFactoryName) throws Exception;

}

このインターフェースは、TcpNioConnection オブジェクト(またはサブクラスのオブジェクト)を作成するために呼び出されます。Spring Integration は、DefaultTcpNioSSLConnectionSupport と DefaultTcpNioConnectionSupport の 2 つの実装を提供します。どちらが使用されるかは、SSL が使用されているかどうかによって異なります。一般的な使用例は、DefaultTcpNioSSLConnectionSupport をサブクラス化し、postProcessSSLEngine をオーバーライドすることです。SSL クライアント認証の例を参照してください。DefaultTcpNetConnectionSupport と同様に、これらの実装もプッシュバックをサポートしています。

サンプル: SSL クライアント認証の有効化

SSL を使用するときにクライアント証明書認証を有効にする方法は、NIO を使用するかどうかによって異なります。NIO を使用しない場合は、サーバーソケットを後処理するカスタム TcpSocketSupport 実装を提供します。

serverFactory.setTcpSocketSupport(new DefaultTcpSocketSupport() {

    @Override
    public void postProcessServerSocket(ServerSocket serverSocket) {
        ((SSLServerSocket) serverSocket).setNeedClientAuth(true);
    }

});

(XML 構成を使用する場合、socket-support 属性を設定して Bean への参照を提供します)。

NIO を使用する場合、次の例に示すように、SSLEngine を後処理するカスタム TcpNioSslConnectionSupport 実装を提供します。

@Bean
public DefaultTcpNioSSLConnectionSupport tcpNioConnectionSupport() {
    return new DefaultTcpNioSSLConnectionSupport(serverSslContextSupport) {

            @Override
            protected void postProcessSSLEngine(SSLEngine sslEngine) {
                sslEngine.setNeedClientAuth(true);
            }

    }
}

@Bean
public TcpNioServerConnectionFactory server() {
    ...
    serverFactory.setTcpNioConnectionSupport(tcpNioConnectionSupport());
    ...
}

(バージョン 4.3.7 以降、XML 構成を使用する場合は、nio-connection-support 属性を設定して Bean への参照を提供します)。