हमारे पास एक डैशबोर्ड वाला एक वेब एप्लिकेशन है जो लगातार अपडेट के लिए मतदान कर रहा है। सर्वर-साइड पर, अपडेट के लिए अनुरोध अतुल्यकालिक बना दिया जाता है ताकि जब हम श्रोता/अधिसूचना प्रणाली के माध्यम से कोई अपडेट होता है तो हम जवाब दे सकते हैं।AsyncContext प्रतिक्रिया मूल आने वाले अनुरोध से मेल नहीं खाती है?
समस्या हम देख रहे हैं कि जब इन मतदान अनुरोधों में से एक के लिए प्रतिक्रिया व्यक्त की जा रही है, यह कुछ मामलों में एक यूजर-क्लिक किया लिंक के लिए अनुरोध/प्रतिक्रिया करने के लिए लिख सकते हैं।
async अद्यतन के लिए भेजे अनुरोध लगता है:
@RequestMapping("/getDashboardStatus.json")
public void getDashboardStatus(HttpServletRequest request, ...) {
final AsyncContext asyncContext = request.startAsync();
// 10 seconds
asyncContext.setTimeout(10000);
asyncContext.start(new Runnable() {
public void run() {
// .. (code here waits for an update to occur) ..
sendMostRecentDashboardJSONToResponse(asyncContext.getResponse());
if (asyncContext.getRequest().isAsyncStarted()) {
asyncContext.complete();
}
}
});
}
क्या अजीब है, वहाँ इस डैशबोर्ड पर लिंक है कि अन्य पृष्ठों पर जाना हैं कि है। प्रत्येक ~ 100 क्लिक या तो, उनमें से एक चयनित पृष्ठ प्रदर्शित करने के बजाय, वास्तव में ऊपर भेजा गया JSON प्रदर्शित करेगा!
उदाहरण के लिए, हम एक अलग MVC विधि है:
@RequestMapping("/result/{resultId}")
public ModelAndView getResult(@PathVariable String resultId) {
return new ModelAndView(...);
}
और जब डैशबोर्ड कि /result/1234
, हर नीला चाँद का दौरा पर एक लिंक पर क्लिक करने, पेज एक 200 ठीक स्थिति के साथ लोड होगा, लेकिन इसके बजाय अपेक्षित एचटीएमएल युक्त, वास्तव में मतदान अनुरोध के लिए JSON शामिल है!
प्रति ग्राहक केवल एक अनुरोध है? क्या एक क्लिक किए गए लिंक द्वारा शुरू किया गया अनुरोध ओवरराइड किसी भी async अनुरोध जो पहले से ही उसी क्लाइंट से सर्वर-साइड पर बैठा है?
हम इन अनुरोधों का प्रबंधन कैसे कर सकते हैं यह सुनिश्चित करने के लिए कि एसिंक प्रतिक्रिया async अनुरोध पर जाती है?
मैंने AsyncContext
ऑब्जेक्ट पर hasOriginalRequestAndResponse()
विधि को देखा, लेकिन जावाडोक से समझने में कठिनाई हो रही है कि मैं यही देख रहा हूं।
अद्यतन: मैं सिर्फ इतना की तरह एक टुकड़ा कहा:
String requestURI = ((HttpServletRequest)asyncContext.getRequest()).getRequestURI());
System.out.println("Responding w/ Dashboard to: " + requestURI);
sendMostRecentDashboardJSONToResponse(asyncContext.getResponse(), clientProfileKey);
और उचित व्यवहार के दौरान इस मुद्दे को पुन: पेश करने, सक्षम था, मैं देख रहा हूँ:
Responding w/ Dashboard to: /app/getDashboardStatus.json
लेकिन जब मैं जेएसओएन को क्लिक-शुरू किए गए अनुरोधों पर धक्का दिया गया है, मैं देखता हूं:
Responding w/ Dashboard to: null
इस प्रश्न में उपयोग किए गए टैग के बारे में एक चल रही मेटा चर्चा है: http://meta.stackoverflow.com/questions/281443/how-general-must-a-problem-be-to-warrant-use-of -ए-भाषा-पुस्तकालय-टैग –
@ क्रैग ओटिस क्या आपने 'request.startAsync (अनुरोध, प्रतिक्रिया) का उपयोग करने का प्रयास किया था,' request.startAsync() 'के बजाय? – fmodos
@fmodos मैंने इसके लिए दस्तावेज़ पढ़े, लेकिन वास्तव में इसका उपयोग नहीं किया - ऐसा लगता है कि इस परिदृश्य में व्यवहार बदल जाएगा? ऐसा लगता है कि उस विधि में पारित अनुरोध/प्रतिक्रिया तर्क आने वाले अनुरोध/प्रतिक्रियाओं के समान (या रैपर) होने की आवश्यकता होगी, ऐसा लगता है कि यह वही काम करेगा। –