TelegramAPI/src/main/java/de/mrbesen/telegram/AsyncHandler.java

100 lines
2.4 KiB
Java
Raw Normal View History

2019-02-07 06:30:28 +01:00
package de.mrbesen.telegram;
2021-01-19 21:19:53 +01:00
import org.json.JSONObject;
2019-02-07 06:30:28 +01:00
import java.util.LinkedList;
import java.util.List;
2022-07-13 19:25:03 +02:00
public class AsyncHandler {
2019-02-07 06:30:28 +01:00
2022-07-13 19:25:03 +02:00
private List<Task> fasttasks = new LinkedList<>();
private List<Task> slowtasks = new LinkedList<>();
2022-07-13 19:25:03 +02:00
private AsyncHandlerThread[] asynchandlerthread;
2020-12-29 17:55:51 +01:00
private static final String THREADPREFIX = "AsyncTgHandler-";
2019-02-07 06:30:28 +01:00
2022-07-13 19:25:03 +02:00
// just use 2 async threads
2019-02-07 06:30:28 +01:00
public AsyncHandler(TelegramAPI api) {
2022-07-13 19:25:03 +02:00
this(api, 2);
2020-12-29 17:55:51 +01:00
}
// allow as many as threadCount threads to handle Async Tasks
2020-12-29 17:55:51 +01:00
public AsyncHandler(TelegramAPI api, int threadCount) {
if (threadCount < 2) {
threadCount = 2;
}
2022-07-13 19:25:03 +02:00
asynchandlerthread = new AsyncHandlerThread[threadCount];
asynchandlerthread[0] = new AsyncHandlerThread(fasttasks, THREADPREFIX + "Fast-0", api);
for (int i = 1; i < threadCount; ++i) {
2022-07-13 19:25:03 +02:00
asynchandlerthread[i] = new AsyncHandlerThread(slowtasks, THREADPREFIX + "Slow-" + i, api);
}
}
public void stop() {
for (AsyncHandlerThread t : asynchandlerthread) {
2022-07-13 19:25:03 +02:00
t.stop();
}
2019-02-07 06:30:28 +01:00
}
public void enque(Task t) {
2022-07-13 19:25:03 +02:00
enque(t, false, false);
2019-03-19 02:42:33 +01:00
}
2020-06-15 00:28:37 +02:00
2022-07-13 19:25:03 +02:00
public void enque(Task t, boolean isSlowMethod, boolean priority) {
List<Task> tasks = isSlowMethod ? slowtasks : fasttasks;
if (priority) {
2019-03-19 02:42:33 +01:00
synchronized (tasks) {
tasks.add(0, t);
2022-07-13 19:25:03 +02:00
tasks.notifyAll();
2019-03-19 02:42:33 +01:00
}
} else {
synchronized (tasks) {
tasks.add(t);
2022-07-13 19:25:03 +02:00
tasks.notifyAll();
2019-03-19 02:42:33 +01:00
}
2019-02-08 03:15:31 +01:00
}
2019-02-07 06:30:28 +01:00
}
2021-01-19 21:19:53 +01:00
public void enque(String request, String parameters, long userid) {
enque(new Task(request, parameters, userid));
2019-02-07 06:30:28 +01:00
}
public static class Task {
String apimethod;
String parameters;
Callback<JSONObject, ?> callback = null;
Callback<Throwable, ?> exceptionhandl = null;
2021-01-19 21:19:53 +01:00
final long userid;
2020-06-15 00:28:37 +02:00
2021-01-19 21:19:53 +01:00
public Task(String apimethod, String parameters, long userid) {
2022-07-13 19:25:03 +02:00
this(apimethod, parameters, userid, null);
2019-02-07 06:30:28 +01:00
}
2020-06-15 00:28:37 +02:00
2021-01-19 21:19:53 +01:00
public Task(String apimethod, String parameters, long userid, Callback<JSONObject, ?> callback) {
2019-02-07 06:30:28 +01:00
this.apimethod = apimethod;
this.parameters = parameters;
2021-01-19 21:19:53 +01:00
this.userid = userid;
2019-02-07 06:30:28 +01:00
this.callback = callback;
}
2020-06-15 00:28:37 +02:00
2019-02-07 06:30:28 +01:00
public Task setExceptionhandl(Callback<Throwable, ?> exceptionhandl) {
this.exceptionhandl = exceptionhandl;
return this;
}
}
public static abstract class Callback<T extends Object, K extends Object> {
public Callback<K, ?> next = null;
2019-02-07 06:30:28 +01:00
public abstract K call(T j) throws Throwable;
2019-02-07 06:30:28 +01:00
@SuppressWarnings("unchecked")
public K callObj(Object j) throws Throwable {
return call((T) j);
}
}
}