当我启动Wildfly-Server时,我有很多尝试将内容写入数据库的类。 碰巧数据库没有首先部署,然后我得到了很多HTTPNotFound Exceptions。
因为我有很多课程,所以我不想复制代码并想写一个帮助程序Class" TimerHelper",我给他举例说一个方法然后说#34;尝试那种方法,如果你得到一个例外,等一段时间再试一次"
一些PseudoCode:
public class TimerHelper extends TimerTask{
Object o;
public TimerHelper(Object o){
this.o = o;
}
public boolean startTask(){
try{
o.start();
}catch(Exception e){
this.wait(200);
o.start();
}
}
}
想要写入数据库的类:
@Startup
@Singleton
public class Motor{
@PostConstruct
public void init(){
TimerHelper timer = new TimerHelper(this);
}
public void start(){
database.write("foobar");
}
}
答案 0 :(得分:0)
你的问题是你想在你的计时器的run()中的子类上调用一个方法,但你只有对象而不是正确的类型?如果是这样,那么你可以使助手通用,并始终将类型T传递给它。这样,保证了类型T对象上的方法可用。下面是一个简单的计时器助手示例,它接受任何扩展TimerTask的对象并调用run()和wait(),直到包含的计时器任务的run()方法成功为止。同样,我并不完全知道你想要实现的目标。
import java.util.TimerTask;
class TimerHelper<T extends TimerTask> extends TimerTask {
T timer = null;
public TimerHelper(T timer) {
this.timer = timer;
}
public static void main(String[] args) {
SubTimer sub = new SubTimer();
TimerHelper<TimerTask> t = new TimerHelper<TimerTask>(sub);
t.run();
}
@Override
public synchronized void run() {
try {
timer.run();
} catch (Throwable e) {
try {
e.printStackTrace();
wait(1000);
run();
} catch (InterruptedException e1) {
}
}
}
static class SubTimer extends TimerTask {
int x = 0;
@Override
public void run() {
if (x++ < 3)
throw new RuntimeException("try again");
System.out.println("do something, finally!");
}
}
}
答案 1 :(得分:0)
我解决问题的方法:
public class TimerHelper extends TimerTask {
Callable<Void> task;
private Timer timer;
long delay;
public TimerHelper(Callable<Void> task) {
timer = new Timer();
delay = 500;
this.task = task;
run();
}
@Override
public void run() {
if (delay < 3600000) {
try {
task.call();
timer.cancel();
} catch (Exception e) {
delay = delay + delay;
timer.schedule(new TimerHelper(task), delay);
}
} else {
try {
timer.cancel();
} catch (TimeLimitExceededException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
示例任务:
@Startup
@Singleton
public class StartUp {
@PostConstruct
public void addSfaApi() {
TimerHelper timer = new TimerHelper(new SfaAPI());
}
class SfaAPI implements Callable<Void> {
@Override
public Void call() throws ResourceRepositoryException {
addSomethingToDatabase();
return null;
}
}
}