한 스레드가 프록시 속성을 설정하고 요청을 보낸 뒤 이전 값을 복원합니다. 다른 스레드가 다른 프록시로 같은 일을 합니다. 위에서 아래로 읽으면 코드는 깔끔해 보이지만, 두 스레드 모두 공유된 JVM 상태를 바꾸고 있습니다.

System.setProperty()는 프로세스의 시스템 속성을 바꿉니다. 그것을 호출한 스레드에 경로를 붙이지는 않습니다. 동시 요청은 다른 작업을 위해 기록된 값을 볼 수 있고, 이미 존재하는 클라이언트는 자체 구성을 이미 캡처했을 수 있습니다.

경로를 클라이언트의 일부로 만들기

Java의 HTTP 클라이언트에서는 의도한 프록시 선택기로 클라이언트를 만드세요. 작업에 서로 다른 라우팅 정책이 필요하면 클라이언트를 분리해 두세요:

HttpClient client = HttpClient.newBuilder()
    .proxy(ProxySelector.of(
        new InetSocketAddress("203.0.113.10", 8080)))
    .connectTimeout(Duration.ofSeconds(5))
    .build();

가져오기는 java.net, java.net.http, java.time입니다. 주소는 예시이며, 허용된 공용 경로 테스트에는 HTTP 프록시 목록이 후보 엔드포인트를 제공합니다. 요청 기한과 프록시 인증은 애플리케이션 요구에 맞게 따로 구성하세요.

빌더의 proxy 메서드는 클라이언트 수준 선택을 기록합니다. 그래서 비동기 작업을 감싼 일련의 전역 쓰기보다 정책을 검사하기 쉽습니다.

전역 설정에도 용도는 있습니다

참여하는 모든 클라이언트가 그것을 따르도록 의도된 경우라면 JVM 전체의 단일 프록시 정책이 적절할 수 있습니다. 그 정책은 애플리케이션 시작 시 설정하고, 어떤 라이브러리가 이를 존중하는지 확인하세요.

전역 속성을 개별 요청을 위한 임시 스위치로 사용할 때 문제가 생깁니다. 서버에서는 여러분의 메서드가 동기식으로 보이더라도 백그라운드 워커와 라이브러리 호출이 동시에 실행될 수 있습니다. 라우팅 상태를 연결을 소유한 클라이언트나 커넥터에 두어, 다른 요청이 작업 도중에 그것을 바꿀 수 없게 하세요.

관련 글