Đối với thực hiện nhiệm vụ định kỳ, tôi nhìn vào Timer
và ScheduledThreadPoolExecutor
(với một chủ đề duy nhất) và quyết định sử dụng sau này, bởi vì trong reference for Executors.newSingleThreadScheduledExecutor()
, nó nói:Tại sao một ScheduledExecutorService không chạy một nhiệm vụ một lần nữa sau khi một ngoại lệ được ném?
Lưu ý tuy nhiên rằng nếu chủ đề duy nhất này chấm dứt do một sự thất bại trong quá trình thực hiện trước khi tắt máy, một cái mới sẽ thay thế nếu cần thiết để thực hiện các nhiệm vụ tiếp theo.
Kế hoạch của tôi là sử dụng điều này như một biện pháp bảo vệ chống lại các trường hợp ngoại lệ chưa được nắm bắt trong một đoạn mã theo dõi mà tôi muốn theo dõi các hoạt động khác. Tôi muốn chắc chắn và viết bài kiểm tra dưới đây, điều này nhanh chóng thất bại. Có vẻ như tôi đã đưa ra những giả định sai lầm, hoặc có điều gì đó sai về thử nghiệm của tôi?
Dưới đây là các mã:
@Test
public void testTimer() {
final AtomicInteger cTries = new AtomicInteger(0);
final AtomicInteger cSuccesses = new AtomicInteger(0);
TimerTask task = new TimerTask() {
@Override
public void run()
{
cTries.incrementAndGet();
if (true) {
throw new RuntimeException();
}
cSuccesses.incrementAndGet();
}
};
/*
Timer t = new Timer();
t.scheduleAtFixedRate(task, 0, 500);
*/
ScheduledExecutorService exe = Executors.newSingleThreadScheduledExecutor();
exe.scheduleAtFixedRate(task, 0, 500, TimeUnit.MILLISECONDS);
synchronized (this) {
try {
wait(3000);
} catch (InterruptedException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
exe.shutdown();
/*
t.purge();
*/
Assert.assertEquals(cSuccesses.get(), 0);
Assert.assertTrue(cTries.get() > 1, String.format("%d is not greater than 1. :(", cTries.get()));
}
Tôi biết, tôi có thể quấn một thứ (Có thể ném) xung quanh, nhưng kế hoạch của tôi là bằng cách nào đó bảo vệ tôi khỏi bản thân mình. –
nó sẽ có vấn đề đối với mã khung như thế này để giả sử nó có thể khởi động lại một cách an toàn một công việc thất bại - thực tế là nó không thành công với một ngoại lệ có nghĩa là dữ liệu có thể bị bỏ lại ở bất kỳ trạng thái nào, và có khả năng sẽ không an toàn để khởi động lại công việc. –
Trích dẫn về bắt đầu một chuỗi mới là cho phép các công việc khác tiếp tục chạy, ngay cả khi một lỗi không thành công –