package de.mrbesen.telegram; import java.net.UnknownHostException; import java.util.List; import de.mrbesen.telegram.AsyncHandler.Callback; import de.mrbesen.telegram.AsyncHandler.Task; public class AsyncHandlerThread implements Runnable { private boolean shouldrun = false; private TelegramAPI api; private int failed = 0; private Thread thread; private List tasks; AsyncHandlerThread(List tasks, String name, TelegramAPI api) { this.tasks = tasks; shouldrun = true; thread = new Thread(this, name); thread.start(); } public void stop() { shouldrun = false; thread.interrupt(); try { thread.join(); } catch (InterruptedException e) { } } @Override public void run() { while (shouldrun) { Task t; synchronized (tasks) { while (tasks.isEmpty()) { try { tasks.wait(); } catch (InterruptedException e) { } } t = tasks.remove(0); tasks.notifyAll(); } if (t == null) continue; // run task try { processTask(t); } catch (Throwable thro) { api.log.log("Error executing Task: "); thro.printStackTrace(); } } } private void processTask(Task t) throws Throwable { try { Object obj = api.request(t.apimethod, t.parameters, t.userid); Callback callb = t.callback; while (callb != null) { obj = (Object) callb.callObj(obj); callb = callb.next; // throw new Exception("Callbacktype missmatch! Got " + // obj.getClass().getSimpleName() + " Wanted: " + wanted.getSimpleName() ); } failed = 0; } catch (UnknownHostException ex) { // host(api.telegram.org) is good -> bad inet failed++; if (failed > 10) try { Thread.sleep(1000); // wait 1 second } catch (InterruptedException ignored) { } // reenque synchronized (tasks) { tasks.add(0, t); } } catch (Throwable thro) { if (t.exceptionhandl == null) throw thro; api.log.log("Exception " + thro.getClass().getSimpleName() + " handled by " + t.exceptionhandl.getClass().getSimpleName()); t.exceptionhandl.call(thro); } } }