Bir Veritabanına bağlanmayı denemek ve bağlantıda herhangi bir sorun varsa istisna atmak için 2 dakikalık bir Zamanlayıcı nasıl ayarlanır?
Bir Veritabanına bağlanmayı denemek ve bağlantıda herhangi bir sorun varsa istisna atmak için 2 dakikalık bir Zamanlayıcı nasıl ayarlanır?
Yanıtlar:
Yani cevabın ilk kısmı, konunun sorduğu şeyi nasıl yapacağımdır, çünkü başlangıçta onu böyle yorumladım ve birkaç kişi yardımcı bulmuş görünüyordu. O zamandan beri soru açıklığa kavuşmuştu ve cevabı bunu ele alacak şekilde genişlettim.
Bir zamanlayıcı ayarlama
Öncelikle bir Zamanlayıcı oluşturmanız gerekir ( java.util
sürümü burada kullanıyorum ):
import java.util.Timer;
..
Timer timer = new Timer();
Görevi bir kez yapmak için şunları yapacaksınız:
timer.schedule(new TimerTask() {
@Override
public void run() {
// Your database code here
}
}, 2*60*1000);
// Since Java-8
timer.schedule(() -> /* your database code here */, 2*60*1000);
Yapacağınız süreden sonra görevin tekrar etmesini sağlamak için:
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
// Your database code here
}
}, 2*60*1000, 2*60*1000);
// Since Java-8
timer.scheduleAtFixedRate(() -> /* your database code here */, 2*60*1000, 2*60*1000);
Görev zaman aşımına uğruyor
Açıklığa kavuşturulmuş sorunun sorduğu şeyi, yani belirli bir süre için bir görevi yerine getirmeye çalışmayı özellikle yapmak için aşağıdakileri yapabilirsiniz:
ExecutorService service = Executors.newSingleThreadExecutor();
try {
Runnable r = new Runnable() {
@Override
public void run() {
// Database task
}
};
Future<?> f = service.submit(r);
f.get(2, TimeUnit.MINUTES); // attempt the task for two minutes
}
catch (final InterruptedException e) {
// The thread was interrupted during sleep, wait or join
}
catch (final TimeoutException e) {
// Took too long!
}
catch (final ExecutionException e) {
// An exception from within the Runnable task
}
finally {
service.shutdown();
}
Görev 2 dakika içinde tamamlanırsa bu, istisnalar dışında normal şekilde yürütülür. Bundan daha uzun çalışıyorsa, TimeoutException atılır.
Bir sorun, iki dakikadan sonra bir Zaman Aşımı İstisnası almanıza rağmen, büyük olasılıkla bir veritabanı veya ağ bağlantısı sonunda zaman aşımına uğrayacak ve iş parçacığında bir istisna atacak olsa da , görev gerçekten çalışmaya devam edecek olmasıdır. Ancak, bu gerçekleşene kadar kaynakları tüketebileceğini unutmayın.
Bunu kullan
long startTime = System.currentTimeMillis();
long elapsedTime = 0L.
while (elapsedTime < 2*60*1000) {
//perform db poll/check
elapsedTime = (new Date()).getTime() - startTime;
}
//Throw your exception
Tamam, sanırım problemini şimdi anlıyorum. Bir şeyler yapmayı denemek için Future'ı kullanabilir ve hiçbir şey olmadıysa biraz sonra zaman aşımına uğrayabilirsiniz.
Örneğin:
FutureTask<Void> task = new FutureTask<Void>(new Callable<Void>() {
@Override
public Void call() throws Exception {
// Do DB stuff
return null;
}
});
Executor executor = Executors.newSingleThreadScheduledExecutor();
executor.execute(task);
try {
task.get(5, TimeUnit.SECONDS);
}
catch(Exception ex) {
// Handle your exception
}
new java.util.Timer().schedule(new TimerTask(){
@Override
public void run() {
System.out.println("Executed...");
//your code here
//1000*5=5000 mlsec. i.e. 5 seconds. u can change accordngly
}
},1000*5,1000*5);
[Android] Java kullanarak android üzerinde zamanlayıcı uygulamak isteyen biri varsa .
işlemleri gerçekleştirmek için bu gibi UI iş parçacığını kullanmanız gerekir .
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
ActivityName.this.runOnUiThread(new Runnable(){
@Override
public void run() {
// do something
}
});
}
}, 2000));