2017-04-04 7 views
16

में HTTP बाधा का पता लगाएं मैं जावा से बाहरी सिस्टम में एक आरईएसटी कॉल कर रहा हूं। यदि बाहरी कनेक्शन ऑफ़लाइन होने पर कोई कनेक्शन बाधाएं हैं, तो मुझे इसका पता लगाने और संबंधित कार्यों को करने के लिए श्रोता की आवश्यकता है। अगर मैं जावा में इसे प्राप्त कर सकता हूं तो कृपया मुझे बताएं। पसंदीदा में जावा 8.जावा

वर्तमान में मुझे ऐसी कोई स्थिति मिलने पर कोई अपवाद नहीं मिल रहा है। मैं नीचे दिए गए कोड वर्तमान में

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

आपको एक आईओएक्सप्शन मिलेगा, जिसे आपको पकड़ना होगा, इसलिए वहां कोई विशेष कोड डालें। –

+1

HTTP अनुरोध करने के लिए आप किस ढांचे का उपयोग कर रहे हैं और कॉलिंग कोड की एक कोड स्निपेट के बारे में कुछ और विवरण आपको अधिक उपयोगी उत्तर प्राप्त करने में सहायता करेंगे। –

+0

@ माइकल पेपर - मैंने कोड के साथ अद्यतन किया है। स्टीव स्मिथ - वर्तमान में मुझे कोई अपवाद नहीं मिल रहा है, सिस्टम प्रतिक्रिया के लिए इंतजार कर रहा है। –

उत्तर

0

आप अपनी खुद की श्रोता बनाते हैं और अपने Http बुला वर्ग के लिए वापस पारित कर दिया एक बार HTTP प्रतिक्रिया/त्रुटि के लिए तैयार है परिणामों के साथ async कॉल कर सकता है हो सकता है। उदाहरण (लिखने की त्रुटियों के साथ) के लिए:

एक अंतरफलक है कि अपने मुख्य वर्ग को लागू करेगा और अपने HTTP क्लाइंट का उपयोग करना होगा ...

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

अपने मुख्य वर्ग में लागू बनाएँ।

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(); 
    } 

} को

जोड़ें विधि अपने HttpClient श्रोताओं

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

स्वीकार करने के लिए स्प्रिंग बूट का उपयोग करते हैं तो आप एक कथात्मक बाकी ग्राहक 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; 
     } 

    } 
} 

सभी आपको यहां कोड कोड YourTestFeignClient इंजेक्ट करने की आवश्यकता है डी पर विधि requestExternalResource का आह्वान करें। यह पर जेएसओएन बॉडी के साथ SomeRequestDTO से लिया जाएगा। यदि कोई अनुरोध YourTestFeignClientFallback के अंदर फ़ॉलबैक विधि विफल हो जाता है, तो उसे कुछ डिफ़ॉल्ट डेटा लौटाया जाएगा।

0

यदि आप लगातार बाहरी आरईएसटी सेवा की जांच करना चाहते हैं चाहे वह ऑफ़लाइन है, तो आपको कुछ प्रकार के आवधिक पिंग अनुरोध को सेट करना होगा। किसी भी प्रतिक्रिया का मतलब यह होगा कि सेवा ऑनलाइन है। कुछ समय के दौरान प्रतिक्रिया की अनुपस्थिति का अर्थ यह होगा कि कुछ गलत है।

समस्या आप का सामना कर रहे है कि जावा टीसीपी सॉकेट connect विधि ब्लॉक कर रहा है और जावा सॉकेट डिफ़ॉल्ट से बढ़ जाता है कनेक्ट समय-समाप्ति 0, जो वास्तव में अनंत है, क्योंकि यह javadoc में कहा जाता है।

तो इसका मतलब है कि सेवा ऑफ़लाइन होने पर आपको डिफ़ॉल्ट रूप से कोई प्रतिक्रिया नहीं मिलेगी।

एकमात्र सही और सरल विकल्प यहां एक टाइमआउट सेट करना है। आपके मामले में सबसे आसान तरीका जर्सी Client संपत्ति सेटअप का उपयोग करने के लिए, इस तरह होगा:

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); 

और केवल इस मामले में आप एक अपवाद है, जो इंगित करेंगे, कि बाकी सेवा आप पिंग की कोशिश कर रहे हो जाएगा कनेक्शन स्वीकार नहीं कर रहा है।

वास्तविक नेटवर्क क्षमताओं के अनुसार सावधानी के साथ टाइमआउट सेट करें, कुछ मामलों में यह 5 से अधिक या 15 सेकंड (उदा। वाईफ़ाई और जीपीआरएस कनेक्शन) होना चाहिए।