对于阻塞式、非 TLS 的 AMQP 连接,Spring 的 RabbitConnectionFactoryBean 可以把一个能识别 SOCKS 的套接字工厂传给 RabbitMQ Java 客户端。

如果已经可以使用 Commons Net,那么在初始化之前配置现有的工厂 bean:

var socksProxy = new java.net.Proxy(
    java.net.Proxy.Type.SOCKS,
    new java.net.InetSocketAddress("proxy.example", 1080));
rabbitFactoryBean.setSocketFactory(
    new org.apache.commons.net.DefaultSocketFactory(socksProxy));

rabbitFactoryBean 是该应用的 RabbitConnectionFactoryBean。请保留它的 broker 主机、AMQP 端口、账户以及 Spring 的连接管理设置。broker 仍是目标;SocketFactory 负责创建经由 SOCKS 到达它的套接字。对于在允许公共中间人的公共 broker 上进行的非敏感测试,SOCKS 代理列表提供了候选;请匹配运行时支持的 SOCKS 版本,并确认能访问实际的 broker 主机和端口。

Commons Net 的工厂使用传入的 Proxy 创建一个尚未连接的 java.net.Socket。随后 RabbitMQ 的阻塞式连接代码会按常规连接路径连接该套接字。仅导出 HTTP_PROXY 并不会提供这个 AMQP 套接字工厂。

RabbitMQ 文档说明 SocketFactory 钩子适用于阻塞式 I/O。为 NIO 或其他传输方式配置的客户端需要该传输方式所支持的钩子。对于 AMQPS,请保留合适的 TLS 套接字工厂和目标验证;用上面的普通工厂替换它并不是完整的 TLS 配置。

相关文章