Timer-Class 应该在一段时间后调用方法

Timer-Class should call Methods after some Time

当我启动我的 Wildfly-Server 时,我有很多 类 试图将一些东西写入数据库。 碰巧数据库一开始就没有部署,然后我得到了很多 HTTPNotFound 异常。

因为我有很多 类 我不想重复代码,想写一个助手 Class "TimerHelper",我给了他一个方法,然后说 "Try that method, if you get an exception, wait some time and try again"

一些伪代码:

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();
  }
 }
}

要写入数据库的Class:

@Startup
@Singleton
public class Motor{

@PostConstruct
 public void init(){
  TimerHelper timer = new TimerHelper(this);
 } 

 public void start(){
   database.write("foobar");
  }
}

你的问题是你想为你的计时器调用 运行() 中子类的方法,但你只有对象而不是正确的类型?如果是这样,那么您可以使帮助程序通用,并始终将类型 T 传递给它。这样,类型 T 对象上的方法就可以保证可用。这是一个计时器助手的简单示例,它接受任何扩展 TimerTask 的对象并调用 运行() 和 wait() 直到包含的计时器任务上的 运行() 方法成功。同样,我不完全知道你想要达到什么目的。

 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!");
        }
    }
}

我的问题解决方案:

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;
    }
  }
}