कहें कि मैं एक सेवा चला रहा हूं जहां उपयोगकर्ता बहुत सारे डेटा के माध्यम से खोजने के लिए रेगेक्स सबमिट कर सकते हैं। यदि उपयोगकर्ता एक रेगेक्स सबमिट करता है जो बहुत धीमा होता है (यानी Matcher.find() को वापस करने के लिए मिनट लगते हैं), तो मैं उस मैच को रद्द करने का एक तरीका चाहता हूं। ऐसा करने का एकमात्र तरीका यह है कि मैं एक और थ्रेड मॉनिटर रखना चाहता हूं कि एक मैच कितना समय ले रहा है और यदि आवश्यक हो तो इसे रद्द करने के लिए Thread.stop() का उपयोग करें।एक लंबे समय तक चलने वाले रेगेक्स मैच को रद्द करना?
सदस्य चर:
long REGEX_TIMEOUT = 30000L;
Object lock = new Object();
boolean finished = false;
Thread matcherThread;
Matcher धागा:
try {
matcherThread = Thread.currentThread();
// imagine code to start monitor thread is here
try {
matched = matcher.find();
} finally {
synchronized (lock) {
finished = true;
lock.notifyAll();
}
}
} catch (ThreadDeath td) {
// send angry message to client
// handle error without rethrowing td
}
मॉनिटर धागा:
synchronized (lock) {
while (! finished) {
try {
lock.wait(REGEX_TIMEOUT);
if (! finished) {
matcherThread.stop();
}
} catch (InterruptedException ex) {
// ignore, top level method in dedicated thread, etc..
}
}
}
मैं java.sun.com/j2se/1.4.2/ पढ़ा है दस्तावेज़/गाइड/Misc/threadPrimitiveDeprecation.html और मुझे लगता है कि यह उपयोग सुरक्षित है क्योंकि मैं नियंत्रण कर रहा हूं जहां थ्रेडडिथ सिंक्रनाइज़ेशन और हेक्टेयर के माध्यम से फेंक दिया गया है इसे खोलें और केवल क्षतिग्रस्त वस्तुएं मेरे पैटर्न और मैचर उदाहरण हो सकती हैं जिन्हें वैसे भी त्याग दिया जाएगा। मुझे लगता है कि यह थ्रेड.स्टॉप() को तोड़ता है क्योंकि मैं त्रुटि को पुनर्स्थापित नहीं कर रहा हूं, लेकिन मैं वास्तव में धागे को मरना नहीं चाहता हूं, बस ढूंढें() विधि को रोक दें।
मैंने अब तक इन बहिष्कृत एपीआई घटकों का उपयोग करने से बचने में कामयाब रहा है, लेकिन Matcher.find() में व्यवधानिक प्रतीत नहीं होता है और इसे वापस करने में बहुत लंबा समय लग सकता है। क्या ऐसा करने का कोई बेहतर तरीका है?
व्यक्तिगत रूप से, मुझे लगता है कि उपयोगकर्ताओं को एक खोज मानदंड के रूप में रेगेक्स जमा करने की अनुमति देना एक बुरा विचार है। प्रोग्रामर शायद, लेकिन उपयोगकर्ताओं को समाप्त नहीं करते ... –
निश्चित रूप से आपको मनमाने ढंग से regexs स्वीकार करते हैं तो आपको DoSed प्राप्त करने की अपेक्षा करनी चाहिए। –
सभी कोड सार्वजनिक नेटवर्क के सामने नहीं आते हैं जहां आपको डीओएस के बारे में चिंता करने की ज़रूरत है। एक लापता सुविधा को लागू करने के लिए चालाक हैक के लिए – Jared