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