2017-04-04 20 views
16

Tôi đang thực hiện cuộc gọi REST tới một hệ thống bên ngoài từ Java. Nếu có bất kỳ gián đoạn kết nối nào nếu hệ thống bên ngoài ngoại tuyến, tôi cần một người nghe để phát hiện và thực hiện các hành động tương ứng. Vui lòng cho tôi biết nếu tôi có thể đạt được điều này trong Java. Tốt nhất là trong Java 8.Phát hiện gián đoạn HTTP trong Java

Hiện tại tôi không nhận được bất kỳ ngoại lệ nào nếu tôi gặp phải bất kỳ tình huống nào như vậy. Tôi có mã bên dưới hiện tại

Client client = ClientBuilder.newClient(); 
    WebTarget target = client.target(HOSTNAME); 
    Invocation.Builder requestBuilder; 

    requestBuilder = target.path(URL).request(MediaType.APPLICATION_JSON) 
               .header(HEADER_AUTHORIZATION, AUTH_TOKEN);  
    Response response = null; 
    if (HTTP_POST.equalsIgnoreCase(method)) { 
     try{ 
     response = requestBuilder.post(Entity.entity(message, MediaType.APPLICATION_JSON_TYPE)); 
     }catch(Exception ex){ 
      ex.printStackTrace(); 
     } 
    } else if (HTTP_GET.equalsIgnoreCase(method)) { 
     response = requestBuilder.get(); 
    } 

    String executeMessage = null; 
    if(response != null){ 
     if (response.getStatus() == 200) { 
      executeMessage = response.readEntity(String.class);   
      return new JSONObject(executeMessage); 
     } else { 
      executeMessage = response.readEntity(String.class); 
      final JSONObject status = new JSONObject(); 
      status.put(STATUS_CODE, response.getStatus()); 
      status.put(STATUS_INFO, response.getStatusInfo()); 
      status.put("response", executeMessage); 
      final JSONObject error = new JSONObject(); 
      error.put(ERROR, status); 
      return error; 
     } 
    } 
+1

Bạn sẽ nhận được IOException, bạn sẽ phải nắm bắt, vì vậy hãy đặt bất kỳ mã đặc biệt nào vào đó. –

+1

Một số chi tiết khác về khung công tác bạn đang sử dụng để thực hiện yêu cầu HTTP và đoạn mã của mã gọi như thế nào sẽ giúp bạn nhận được nhiều câu trả lời hữu ích hơn. –

+0

@Michael Peyper - Tôi đã cập nhật mã. Steve Smith - Hiện tại tôi không nhận được bất kỳ ngoại lệ nào, hệ thống chờ phản hồi. –

Trả lời

0

Bạn có thể tạo Trình xử lý riêng của mình và thực hiện cuộc gọi Http không đồng bộ với kết quả được chuyển về lớp gọi khi phản hồi/lỗi HTTP đã sẵn sàng. Ví dụ (với lỗi chính tả):

Tạo một giao diện mà lớp học chính của bạn sẽ thực hiện và Client Http bạn sẽ tận dụng ...

public interface MyHttpListener { 
    public httpComplete(MyHttpResults results); 
} 

Thực hiện trong lớp học chính của bạn.

public MyClass implements MyHttpListener { 

    public void processHttpRequests(){ 
     for(int i=0; i<10; i++){ 
     // instantiate your Http Client class 
     HttpClient client = new HttpClient(); 

     // register the listener 
     client.addHttpListener(this); 

     // execute whatever URL you want and you are notified later when complete 
     client.executeRequest("http://whatever"); 
    } 
    } 

    public httpRequestComplete(MyHttpResults results) { 
    // do something with the results 
    results.getResponseCode(); 
    results.getRawResponse(); 
    results.whatever(); 
    } 

}

Add phương pháp để bạn HttpClient để chấp nhận người nghe

public class MyHttpClient { 
    List<MyHttpListener> httpListenerList = new ArrayList(); 

    // register listeners 
    public void addHttpListener(MyHttpListener listener){ 
    httpListenerList.add(listener); 
    } 

    // this is the method that processes the request 
    public void executeRequest(String url) { 

    // do whatever you were doing previously here 

    // optional POJO to wrap the results and/or exceptions 
    MyHttpResults results = new MyHttpResults(); 
    results.withResponseCode(response.getResponseCode()); 
    results.withResponse(responseAsString); 
    results.withException(ex); 
    results.withWhatever(whatever); 

    // notify listeners 
    notify(results); 

    } 

    public void notify(MyHttpResults results){ 
     // notify listeners 
     for(MyHttpListener listener : httpListenerList){ 
     listener.httpComplete(results); 
     } 
    } 


} 
1

Nếu bạn sử dụng Spring Boot bạn có thể thử một khách hàng REST của declarative gọi Feign:

@FeignClient(url = "example.com", fallback = YourTestFeignClient.YourTestFeignClientFallback.class) 
public interface YourTestFeignClient { 

    @RequestMapping(method = RequestMethod.POST, value = "/example/path/to/resource/{id}") 
    YourTestResponse requestExternalResource(@RequestParam("id") Long id, SomeRequestDTO requestDTO); 

    @Component 
    public static class YourTestFeignClientFallback implements YourTestFeignClient { 

     @Override 
     public YourTestResponse requestExternalResource(Long id, SomeRequestDTO requestDTO) { 
      YourTestResponse testResponse = new YourTestResponse(); 
      testResponse.setMessage("Service unavailable"); 
      return testResponse; 
     } 

    } 
} 

Tất cả bạn cần làm ở đây là tiêm YourTestFeignClient vào mã của bạn d gọi phương thức requestExternalResource trên đó. Điều này sẽ gọi POST example.com/example/path/to/resource/34 với phần thân JSON được lấy từ SomeRequestDTO. Trong trường hợp yêu cầu không thành công phương thức dự phòng bên trong YourTestFeignClientFallback sẽ được gọi, sau đó sẽ trả về một số dữ liệu mặc định.

0

Nếu bạn muốn liên tục kiểm tra dịch vụ REST bên ngoài cho dù đó là ngoại tuyến, bạn phải thiết lập một số loại yêu cầu ping định kỳ. Mọi phản hồi sẽ có nghĩa là dịch vụ đó trực tuyến. Sự vắng mặt của phản ứng trong một khoảng thời gian sẽ có nghĩa là có điều gì đó sai.

Vấn đề bạn đang phải đối mặt tăng lên từ đó java TCP Socket connect phương pháp chặn và ổ cắm java mặc định kết nối thời gian chờ là 0, mà thực sự là vô như người ta nói trong javadoc.

Điều đó có nghĩa là bạn sẽ không nhận được bất kỳ phản hồi nào theo mặc định nếu dịch vụ ngoại tuyến.

Tùy chọn chính xác và đơn giản nhất ở đây là đặt thời gian chờ. Trong trường hợp của bạn theo cách đơn giản nhất là nên sử dụng Jersey Client thiết lập tài sản, như thế này:

Client client = ClientBuilder.newClient(); 
// One second timeout may not be a really good choice unless your network is really fast 
client.property(ClientProperties.CONNECT_TIMEOUT, 1000); 

Và chỉ trong trường hợp này bạn sẽ nhận được một ngoại lệ, mà sẽ chỉ ra, rằng dịch vụ REST bạn đang cố gắng ping là không chấp nhận kết nối.

Đặt thời gian chờ cẩn thận theo khả năng mạng thực, trong một số trường hợp, nó phải dài hơn 5 hoặc thậm chí 15 giây (ví dụ: kết nối WiFi và GPRS).

Các vấn đề liên quan