JedisSocketFactory.createSocket 必须返回一个已连接、可直接承载 Redis 流量的 socket。在 Jedis 5.2.0 中,应用在这里同时传入该工厂和它的 Redis 客户端配置:

var jedis = new Jedis(socksSocketFactory, redisConfig);

socksSocketFactory 实现 redis.clients.jedis.JedisSocketFactory,而 redisConfig 是应用的 JedisClientConfig。构造器运行时就要准备好连接:它可能立即执行认证和其他 Redis 设置。

跟踪一个 socket 从创建到交付

对于无需认证的 SOCKS5 路径,工厂可以创建一个 java.net.Socket,其中使用显式的 Proxy.Type.SOCKS 中间人,然后连接 Redis 的主机和端口。让目标保持未解析如果应由 SOCKS 服务器解析主机名。

限制连接尝试并应用预期的读取超时。如果连接失败,关闭该 socket 并报告 JedisConnectionException;工厂接口并不声明受检的 IOException。

如果 Redis 要求 TLS,必须在交回 socket 之前建立并校验 TLS。不能假定某个单独开关会改造工厂返回的任意 socket。对于连接池,每次调用工厂都要用全新的 socket 重复这一生命周期,包括替换连接。

全局 ProxySelector 中的 HTTP 选择并不是这项工作的替代实现。Redis 通过自己的 socket 发送 RESP,不会因此变成 HTTP,也不会协商 CONNECT。

相关文章