Pedidos Java simultâneos podem partilhar as definições de proxy erradas
Veja porque é que alterar uma propriedade global por pedido escapa entre threads e como manter a política de proxy no cliente.
Uma thread define uma propriedade de proxy, faz um pedido e restaura o valor antigo. Outra thread faz o mesmo com um proxy diferente. O código parece arrumado quando lido de cima para baixo, mas ambas as threads estão a alterar estado JVM partilhado.
System.setProperty() altera uma propriedade de sistema do processo. Não associa uma rota à thread que a chamou. Um pedido simultâneo pode observar um valor escrito para o trabalho de outra pessoa, e um cliente existente pode já ter capturado a sua própria configuração.
Torne a rota parte do cliente
Para o cliente HTTP do Java, crie clientes com seletores de proxy deliberados. Mantenha clientes separados quando as cargas de trabalho exigem políticas de encaminhamento distintas:
HttpClient client = HttpClient.newBuilder()
.proxy(ProxySelector.of(
new InetSocketAddress("203.0.113.10", 8080)))
.connectTimeout(Duration.ofSeconds(5))
.build();As importações são java.net, java.net.http e java.time. O endereço é ilustrativo; para testes de rotas públicas permitidos, a lista de proxies HTTP fornece pontos finais candidatos. Configure prazos de pedido e autenticação de proxy separadamente conforme as necessidades da aplicação.
O método proxy do construtor registra uma escolha ao nível do cliente. Isso torna a política mais fácil de inspecionar do que uma sequência de escritas globais em torno de operações assíncronas.
As definições globais ainda têm utilidade
Uma única política de proxy para toda a JVM pode ser apropriada quando se pretende que todos os clientes participantes a sigam. Defina essa política no arranque da aplicação e verifique que bibliotecas a respeitam.
Surgem problemas quando as propriedades globais são usadas como interruptor temporário para pedidos individuais. Num servidor, trabalhadores em segundo plano e chamadas de bibliotecas podem correr simultaneamente mesmo que o seu método pareça síncrono. Mantenha o estado de encaminhamento no cliente ou conector que é dono da ligação, para que outro pedido não o possa alterar a meio do trabalho.