JedisSocketFactory.createSocket は、Redis のトラフィックを運べる接続済みのソケットを返さなければなりません。Jedis 5.2.0 では、アプリケーションがそのファクトリと Redis クライアント設定をここで渡します:

var jedis = new Jedis(socksSocketFactory, redisConfig);

socksSocketFactory は redis.clients.jedis.JedisSocketFactory を実装し、redisConfig はアプリケーションの JedisClientConfig です。コンストラクタの実行時には接続できる状態にしてください。認証やその他の Redis 設定を即座に行う場合があります。

ソケットを生成から受け渡しまで追う

認証なしの SOCKS5 経路では、ファクトリは java.net.Socket を明示的な Proxy.Type.SOCKS 仲介付きで生成し、その後 Redis のホストとポートへ接続できます。宛先は未解決のままにしてください。SOCKS サーバーにホスト名を解決させる場合です。

接続の試行には上限を設け、意図した読み取りタイムアウトを適用します。接続に失敗したらそのソケットを閉じ、JedisConnectionException を報告してください。ファクトリのインターフェースは検査済みの IOException を宣言しません。

Redis が TLS を要求する場合は、ソケットを返す前に TLS を確立して検証します。別のフラグが、ファクトリが返す任意のソケットを変換すると仮定することはできません。プールの場合は、代替接続も含め、ファクトリ呼び出しごとに新しいソケットでこのライフサイクルを繰り返します。

グローバルな ProxySelector での HTTP 選択は、この作業の代替実装ではありません。Redis は自分のソケットで RESP を送ります。それによって HTTP になるわけでも、CONNECT を交渉するわけでもありません。

関連記事