2013-01-13 2 views
4

나는 Spring REST 서비스에 대한 REST 호출을하는 여러 가지 메소드가있는 서비스 클래스를 가지고있다. 방법의 각은 다음과 같습니다저지 클라이언트 서비스 - 닫는 자원

public void getUser() { 

     ClientConfig config = new DefaultClientConfig(); 
     Client client = Client.create(config); 
     WebResource service = client.resource(RESOURCE_URL); 


     // Get response as String 
     String response = service.path("/addUser").accept(MediaType.TEXT_PLAIN) 
       .get(String.class); 

     return response; 
    } 

위의 작품을 잘하지만 난 메서드를 호출 할 때마다, ClientConfig, 클라이언트 및 WebResource의 새로운 인스턴스가 생성되는 것을 약간 걱정입니다. 위의 내용을 변경하고 ClientConfig, Client 및 WebResource를 클래스 수준 인스턴스 변수로 변경하면 부작용이 있습니까? 이것에 즉 변화 :

ClientConfig config = new DefaultClientConfig(); 
Client client = Client.create(config); 
WebResource service = client.resource(RESOURCE_URL); 

public void getUser() {   

     // Get response as String 
     String response = service.path("/addUser").accept(MediaType.TEXT_PLAIN) 
       .get(String.class); 

     return response; 
    } 

public void getUserAccount() {   

     // Get response as String 
     String response = service.path("/getUserAccount").accept(MediaType.TEXT_PLAIN) 
       .get(String.class); 

     return response; 
    } 

여러 사용자가 동시에 다른 방법을 호출하면 실패 할 위의 가능성이 있습니까? 위 구조를 구성하는 가장 좋은 방법은 무엇입니까?

저지 클라이언트 메서드에 close() 메서드가있는 경우 메서드를 그대로두고 메서드 내부의 리소스를 닫을 수있었습니다.

답변

10

Jersey documentation에서 :

Client 경우 :

방법은 WebResource의 인스턴스를 생성하는 스레드 안전합니다. 구성 및 필터를 수정하는 메서드는 스레드로부터 안전하게 이 될 수 있다고 보장 할 수 없습니다.

클라이언트 인스턴스를 만드는 작업은 값 비싼 작업이며 인스턴스는 많은 리소스를 사용하고 유지할 수 있습니다. 응답을 요청을 생성하고 반환

방법

스레드입니다 : 따라서 은 클라이언트 인스턴스가 동일한 구성 설정 WebResource를 들어

을 필요로 WebResource 인스턴스의 생성을 위해 다시 사용하는 것이 좋습니다 -안전한. 필터를 수정 방법이 ClientConfig에 대한 명시 적 동시성 문서 없지만 스레드 안전

이 보장되지 않으며, 그것의 안전은 다중 스레드 환경에서 사용하는 것을 소스 코드에서 분명하다. Client 클래스는 스레드로부터 안전하므로 WebResource 만 고려해야합니다. 설명서의 내용을 바탕으로 좀 더 같이해야 코드를 의미하는 각 스레드에 새 WebResource을 바칠 :

ClientConfig config = new DefaultClientConfig(); 
Client client = Client.create(config); 

public void getUser() {   
    WebResource service = client.resource(RESOURCE_URL); 

    // Get response as String 
    String response = service 
     .path("/addUser") 
     .accept(MediaType.TEXT_PLAIN) 
     .get(String.class); 

     return response; 
} 
+0

감사합니다. 답장에서 인용 한 문서로 나를 안내 할 수 있습니까? – ziggy

+0

링크 추가를 잊어 버렸습니다. 편집을 참조하십시오. – Perception

+0

완벽한 감사합니다. – ziggy