2015-09-03 7 views
7

मेरे पास 2 स्प्रिंग वेब अनुप्रयोग हैं: एप्लिकेशन 1 और एप्लिकेशन 2। एप्लिकेशन 1 में, मेरे पास "http://application1/getbigcsv" पर एक एंडपॉइंट है जो उपयोगकर्ता को एक विशाल 150 एमबी सीएसवी फ़ाइल की सेवा करने के लिए स्ट्रीमिंग का उपयोग करता है यदि वे उस यूआरएल को दबाते हैं।स्ट्रीमिंग आराम पर विशाल फ़ाइल कैसे सेवा करें?

मैं नहीं चाहता कि उपयोगकर्ता सीधे एप्लिकेशन 1 को हिट करें, लेकिन इसके बजाय एप्लिकेशन 2 दबाएं। अगर मैं Application2

@RequestMapping(value = "/large.csv", method = GET, produces = "text/csv") 
@ResponseStatus(value = HttpStatus.OK) 
public String streamLargeCSV() { 
    // Make an HTTP Request to http://application1/getbigcsv 
    // Return its response 
} 

में मेरी नियंत्रक में निम्न विधि है मेरी चिंता से ऊपर नहीं कर रहा है "स्ट्रीमिंग" Application1 स्ट्रीमिंग कर रही है, जबकि है। क्या कोई तरीका है कि मैं यह सुनिश्चित कर सकता हूं कि एप्लिकेशन 2 स्ट्रीमिंग फैशन में एप्लिकेशन 1 के बाकी एंडपॉइंट से उसी डेटा को वापस दे रहा है? या वास्तव में "स्ट्रीमिंग" विधि में वास्तव में चीजों को वापस करने के ऊपर की विधि है क्योंकि एप्लिकेशन 1 स्ट्रीमिंग के रूप में अपना एंडपॉइंट सेवा कर रहा है?

+0

आप के लिए मेरा उत्तर कार्य किया? –

उत्तर

13

सबसे पहले: आप उस विधि हस्ताक्षर के साथ नहीं कर सकते हैं।

दुर्भाग्य से, आपने यह नहीं दिखाया है कि आप उस सीएसवी फ़ाइल को एप 1 में कैसे बनाते हैं, भले ही यह वास्तव में स्ट्रीमिंग हो। आइए मान लें कि यह है।

आप हस्ताक्षर इस तरह दिखेगा:

@RequestMapping(value = "/large.csv", method = GET, produces = "text/csv") 
@ResponseStatus(value = HttpStatus.OK) 
public void streamLargeCSV(OutputStream out) { 
    // Make an HTTP Request to http://application1/getbigcsv 
    // Return its response 
} 

अब हम पहले APP1 से इनपुट धारा हड़पने के लिए की है। Apache HttpClient का उपयोग get पर अपने HttpEntity पर करें। इस इकाई में writeTo(OutputStream) विधि है जो आपके out पैरामीटर प्राप्त करेगी। यह तब तक अवरुद्ध होगा जब तक सभी बाइट खपत न हो जाएं। जब आप पूरा कर लेंगे, तो सभी HttpClient संसाधनों को मुक्त करें।

पूरा कोड:

@RequestMapping(value = "/large.csv", method = GET, produces = "text/csv") 
@ResponseStatus(value = HttpStatus.OK) 
public void streamLargeCSV(OutputStream out) { 
    // Make an HTTP Request to http://application1/getbigcsv 
    CloseableHttpClient httpclient = HttpClients.createDefault(); 
    HttpGet httpGet = new HttpGet("http://application1/getbigcsv"); 
    CloseableHttpResponse response = httpclient.execute(httpGet); 
    try { 
     HttpEntity entity = response.getEntity(); 
     // Return its response 
     entity.writeTo(out); 
    } finally { 
     response.close(); 
    } 
} 

Here मेरी असली दुनिया उदाहरण है। "इस बात से दिलचस्प है कि मैंने विशेष रूप से यह हासिल किया है:"

+0

आप कम बॉयलरप्लेट के लिए CloseableHttpResponse पर प्रयास-संसाधनों का उपयोग कर सकते हैं। – approxiblue

+0

@approxiblue यह सच है। जावा 7 पर अपना कोड रीफिट करने के लिए स्वतंत्र महसूस करें। –

0

java.ws.rs.core पैकेज में आपके पास कक्षाएं हैं: StreamingOutput और ResponseBuilder

सुनिश्चित नहीं है कि यह आपकी मदद करेगा, लेकिन आप कोशिश कर सकते हैं।

उदाहरण:

@Produces("application/octet-stream") 
public Response doThings() { 
...  
    StreamingOutput so; 
    try { 
     so = new StreamingOutput() { 
      public void write(OutputStream output) { 
       … 
      } 
     }; 
    } catch (Exception e) { 
     ... 
    } 

    ResponseBuilder response = Response.ok(so); 
    response.header("Content-Type", ... + ";charset=utf-8"); 
    return response.build(); 
} 
+0

वह जर्सी/जेएक्स-डब्ल्यूएस का उपयोग नहीं कर रहा है। –

0

बदले अपने तरीके ResponseEntity<?> पर लौटने के प्रकार और निम्नलिखित के रूप में वापसी:

@GetMapping("/download") 
public ResponseEntity<?> fetchActivities(
     @RequestParam("filename") String filename) { 

    String string = "some large text" 
    InputStream is = new ByteArrayInputStream(string.getBytest()); 

    HttpHeaders headers = new HttpHeaders(); 
    headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=large.txt"); 
    headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_OCTET_STREAM_VALUE); 
    return ResponseEntity.ok().headers(headers).body(new InputStreamResource(is)); 
} 
संबंधित मुद्दे