Dire che sto eseguendo un servizio in cui gli utenti possono inviare un'espressione regolare per cercare tra molti dati. Se l'utente invia una regex molto lenta (ad esempio, occorrono pochi minuti per Matcher.find() per tornare), voglio un modo per cancellare quella corrispondenza. L'unico modo che posso pensare di fare questo è di avere un altro thread monitor per quanto tempo sta prendendo una partita e usare Thread.stop() per cancellarlo se necessario.Annullamento di una corrispondenza regolare nell'esecuzione prolungata?
variabili membro: filetto
long REGEX_TIMEOUT = 30000L;
Object lock = new Object();
boolean finished = false;
Thread matcherThread;
Matcher: filo
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
}
Monitor:
synchronized (lock) {
while (! finished) {
try {
lock.wait(REGEX_TIMEOUT);
if (! finished) {
matcherThread.stop();
}
} catch (InterruptedException ex) {
// ignore, top level method in dedicated thread, etc..
}
}
}
ho letto java.sun.com/j2se/1.4.2/ docs/guide/misc/threadPrimitiveDeprecation.html e penso che questo utilizzo sia sicuro poiché sto controllando dove ThreadDeath viene lanciato tramite sincronizzazione e ha e gli unici oggetti danneggiati potrebbero essere le mie istanze Pattern and Matcher che verranno comunque scartate. Penso che questo rompa Thread.stop() perché non sto rilanciando l'errore, ma non voglio che il thread muoia, basta interrompere il metodo find().
Sono riuscito a evitare di utilizzare questi componenti API deprecati finora, ma Matcher.find() non sembra essere interrompibile e può richiedere molto tempo per restituire. C'è un modo migliore per farlo?
Personalmente, penso che consentire agli utenti di inviare un'espressione regolare come criterio di ricerca sia una cattiva idea. Forse i programmatori, ma non gli utenti finali ... –
Certo, dovresti aspettarti di ottenere DoSed se accetti regex arbitrarie. –
Non tutto il codice è esposto a una rete pubblica in cui devi preoccuparti di DoS. – Jared