RuneHive-Tarnish
Neural OSRS Enhancement Framework
Loading...
Searching...
No Matches
TaskManager.java
1package com.osroyale.game.task;
2
3import com.google.common.base.Preconditions;
4import org.apache.logging.log4j.LogManager;
5import org.apache.logging.log4j.Logger;
6
7import java.util.ArrayList;
8import java.util.List;
9import java.util.ListIterator;
10import java.util.Queue;
11import java.util.concurrent.ConcurrentLinkedQueue;
12
43
44* The class that handles scheduling tasks, and processing them.
45 *
46 * @author nshusa
47 */
48public final class TaskManager {
49
53 private static final Logger logger = LogManager.getLogger(TaskManager.class);
54
60 private final Queue<Task> pending = new ConcurrentLinkedQueue<>();
61
66 private final List<Task> active = new ArrayList<>();
67
74 public synchronized void schedule(Task task) {
75 /*StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
76 System.out.println("Displaying Stack trace using StackTraceElement in Java");
77 String myString = "";
78 for(StackTraceElement st : stackTrace){
79 myString = myString + st + '\n';
80 }
81 LogManager.getLogger(TaskManager.class).info(myString);*/
82 Preconditions.checkNotNull(task);
83
84 try {
85 if (!task.canSchedule()) {
86 return;
87 }
88
89 task.setRunning(true);
90 task.onSchedule();
91
92 if (task.isInstant()) {
93 try {
94 task.baseExecute();
95 } catch (Exception ex) {
96 logger.warn(String.format("error executing task: %s", task.getClass().getSimpleName()), ex);
97 return;
98 }
99 }
100 pending.add(task);
101 } catch (Exception ex) {
102 logger.error(String.format("error scheduling task: %s", task.getClass().getSimpleName()), ex);
103 }
104 }
105
109 public synchronized void processTasks() {
110 Task t;
111 while((t = pending.poll()) != null) {
112 active.add(t);
113 }
114
115 for (final ListIterator<Task> itr = active.listIterator(); itr.hasNext();) {
116 final Task task = itr.next();
117
118 try {
119 //Start execution is called before process so that the task can get the elapsed time from the start of the task
120 task.setExecutionTime();
121 task.process();
122 } catch (Exception ex) {
123 logger.warn(String.format("Error executing task: %s [pendingQueue: %d executionQueue: %d], ", task.getClass().getSimpleName(), pending.size(), active.size()), ex);
124 task.cancel();
125 }
126
127 if (!task.isRunning()) {
128 itr.remove();
129 }
130 }
131 }
132
139 public void cancel(Object attachment) {
140 cancel(attachment, false);
141 }
142
152 public void cancel(Object attachment, boolean logout) {
153 for (Task task : pending) {
154 if (attachment.equals(task.getAttachment().orElse(null))) {
155 task.cancel(logout);
156 }
157 }
158 }
159
160 public List<Task> getTasks() {
161 return active;
162 }
163}
void cancel(Object attachment)
synchronized void schedule(Task task)
void cancel(Object attachment, boolean logout)