Timer-Class应在一段时间后调用Methods

时间:2015-07-15 15:06:05

标签: java java-ee wildfly

当我启动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");
  }
}

2 个答案:

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