मेरे पास एक जर्सी क्लाइंट है जिसे प्रगति पट्टी की आवश्यकता के लिए पर्याप्त फ़ाइल अपलोड करने की आवश्यकता है।
समस्या यह है कि, अपलोड के लिए कुछ मिनटों की आवश्यकता होती है, मुझे लगता है कि जैसे ही एप्लिकेशन शुरू हो गया है, मुझे बाइट्स 100% पर स्थानांतरित करने के लिए स्थानांतरित किया गया है। फिर "समाप्त" स्ट्रिंग को मुद्रित करने में कुछ मिनट लगते हैं।
ऐसा लगता है जैसे बाइट को बफर में भेजा गया था, और मैं वास्तविक अपलोड गति की बजाय ट्रांसफर-टू-द बफर गति पढ़ रहा था। इससे प्रगति पट्टी बेकार हो जाती है।जर्सी क्लाइंट अपलोड प्रगति
यह बहुत ही सरल कोड है:
ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);
WebResource resource = client.resource("www.myrestserver.com/uploads");
WebResource.Builder builder = resource.type(MediaType.MULTIPART_FORM_DATA_TYPE);
FormDataMultiPart multiPart = new FormDataMultiPart();
FileDataBodyPart fdbp = new FileDataBodyPart("data.zip", new File("data.zip"));
BodyPart bp = multiPart.bodyPart(fdbp);
String response = builder.post(String.class, multiPart);
प्रगति राज्य प्राप्त करने के लिए मैं एक ContainerListener फिल्टर जोड़ दिया है, obviouslt बुला builder.post से पहले:
final ContainerListener containerListener = new ContainerListener() {
@Override
public void onSent(long delta, long bytes) {
System.out.println(delta + " : " + long);
}
@Override
public void onFinish() {
super.onFinish();
System.out.println("on finish");
}
};
OnStartConnectionListener connectionListenerFactory = new OnStartConnectionListener() {
@Override
public ContainerListener onStart(ClientRequest cr) {
return containerListener;
}
};
resource.addFilter(new ConnectionListenerFilter(connectionListenerFactory));
धन्यवाद टॉमसज़, यह उत्तर बहुत अच्छा है। तथ्य यह है कि आपने क्लाइंट को कॉन्फ़िगर करने के दो तरीके प्रदान किए हैं वास्तव में सराहनीय और स्पष्टीकरणपूर्ण है। दुर्भाग्य से, समस्या बनी रहती है। मैंने system.out.println (...) को entityStream.write के बाद बस रखा है, लेकिन नतीजा यह है कि मैं दूसरी फाइलों में बड़ी फ़ाइलों (> 10 एमबी) लिखता हूं, और फिर "असली" अपलोड होने पर यह जम जाता है।तथ्य यह है कि इस समाधान के साथ भी होता है कि समस्या कहीं और है। आपके उत्तर के लिए, मैं इसे स्वीकार नहीं कर सकता लेकिन मैं एक और विशिष्ट प्रश्न शुरू कर सकता हूं जहां मुझे इसे सही के रूप में चिह्नित करने में खुशी होगी। :-) – AgostinoX
मैंने एक इकाई को जोड़ने की कोशिश की Stream.flush(); EntstStream.write (...) के बाद बस बफर पर लिखने के बजाय सॉकेट में वास्तविक लेखन को मजबूर करने के लिए। वही परिणाम :-( – AgostinoX
ठीक है, अच्छा जवाब, यह काम करता है। दोनों तरीकों से, यह श्रोताओं के साथ और कस्टम फ़ाइल प्रदाता के साथ है। शायद यह जोर दिया जाना चाहिए कि समाधान दूसरा भाग है, शायद इसे शीर्ष पर ले जा रहा है। फ़ाइल प्रदाता श्रोताओं के विकल्प के रूप में दिलचस्प है। इसके अलावा, यह जर्सी आर्किटेक्चर को स्पष्ट करने में मदद करता है, इसलिए मैं इसे रखता हूं, लेकिन सवाल के सीधे जवाब के रूप में नहीं। – AgostinoX