मैं भविष्य कंप्यूटिंग कर रहा हूँ की समय समाप्ति को रोकने के लिए धारावाहिक बंदरगाह।कैसे हुआ करने के लिए एक धारावाहिक घटना के लिए इंतजार में समय समाप्त होने के लिए एक भविष्य
समस्या यह है कि सीरियल पोर्ट से पढ़ने अपेक्षाकृत धीमी है और यहां तक कि जब एक धारावाहिक घटना हो रही है तो समय समाप्त हो जाता है और TimeoutException
फेंक दिया जाता है। एक धारावाहिक घटना होने पर मैं अपने भविष्य की टाइमआउट घड़ी को रोकने के लिए क्या कर सकता हूं?
मैं एक AtomicReference
साथ यह कोशिश की, लेकिन है कि कुछ भी नहीं बदला:
public class CommunicationTask implements Callable<Response>, Observer {
private AtomicReference atomicResponse = new AtomicReference(new Response("timeout"));
private CountDownLatch latch = new CountDownLatch(1);
private SerialPort port;
CommunicationTask(SerialCommunicator communicator, Request request) {
this.communicator = communicator;
this.message = request.serialize();
this.port = communicator.getPort();
}
@Override
public Response call() throws Exception {
return query(message);
}
public Response query(String message) {
communicator.getListener().addObserver(this);
message = message + "\r\n";
try {
port.writeString(message);
} catch (Exception e) {
log.warn("Could not write to port: " + e);
communicator.disconnect();
}
try {
latch.await();
} catch (InterruptedException e) {
log.info("Execution time out.");
}
communicator.getListener().deleteObserver(this);
return (Response)atomicResponse.get();
}
@Override
public void update(Observable o, Object arg) {
atomicResponse.set((Response)arg);
latch.countDown();
}
}
मैं इस समस्या को हल करने के लिए क्या कर सकते हैं?
संपादित करें:
ठीक है मुझे एक त्रुटि थी। मैं अपने update
फ़ंक्शन में atomicResponse
को सेट करने के लिए अपने लच को गिन रहा था। अब यह काम करता प्रतीत होता है, लेकिन अभी भी सवाल है यदि ऐसा दृष्टिकोण ऐसा करने का सही तरीका है?
आप करने के लिए एक 'isCommunicationStarted' विधि जोड़ सकते हैं का पता लगाया है आपके संचार टास्क - जब आप 'टाइमआउट एक्सेप्शन' पकड़ते हैं, तो 'कम्युनिकेशन स्टार्टेड' की जांच करें - अगर यह गलत => रद्द हो जाता है, अन्यथा 'future.get() 'फिर से प्रयास करें (शायद एक नया टाइमआउट के साथ)। – assylias
क्या आप अपनी टास्क क्लास को दो में विभाजित कर सकते हैं: पहली बार ईवेंट टाइमआउट के साथ शुरू होने तक प्रतीक्षा करेगा और ईवेंट की शुरुआत पर दूसरे प्रकार के कार्य को सबमिट करेगा। दूसरा कार्य तदनुसार घटना को संसाधित करेगा। –
यह स्पष्ट नहीं है कि आप क्या हासिल करना चाहते हैं। टाइमआउट सेट करने का तात्पर्य है कि टाइमआउट के बाद आने वाली घटनाओं को अनदेखा किया जा सकता है। यदि हां, सवाल में कोने का मामला क्यों मायने रखता है? – axtavt