package dailyBot.control;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Random;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import dailyBot.control.connection.EmailConnection;
import dailyBot.control.connection.dailyFx.DailyFxServerConnection;
import dailyBot.model.Pair;
public class DailyExecutor
{
private final static ScheduledExecutorService executor = new ScheduledThreadPoolExecutor(5);
private final static LinkedBlockingQueue <DailyRunnable> runnables = new LinkedBlockingQueue <DailyRunnable> ();
public static void addRunnable(DailyRunnable runnable, long time, TimeUnit unit)
{
executor.scheduleWithFixedDelay(runnable, 0, TimeUnit.MILLISECONDS.convert(time, unit), TimeUnit.MILLISECONDS);
runnables.add(runnable);
}
public static void addRunnable(DailyRunnable runnable, long periodTime, TimeUnit periodUnit, long initialDelay, TimeUnit initialDelayUnit)
{
executor.scheduleWithFixedDelay(runnable, TimeUnit.MILLISECONDS.convert(initialDelay, initialDelayUnit), TimeUnit.MILLISECONDS.convert(periodTime, periodUnit), TimeUnit.MILLISECONDS);
runnables.add(runnable);
}
public static void registerRunnableMonitor()
{
DailyRunnable monitor = new DailyRunnable("Runnable monitor", Long.MAX_VALUE, true)
{
final AtomicBoolean messageSent = new AtomicBoolean(false);
@Override
public void runOnce()
{
try
{
DailyLoopInfo.registerLoop("Runnable monitor");
DailyLoopInfo.registerUpdate("Runnable monitor", "State", "starting monitor");
Calendar calendar = Calendar.getInstance();
int minute = calendar.get(Calendar.MINUTE);
int hour = calendar.get(Calendar.HOUR_OF_DAY);
if(minute > 40)
messageSent.set(false);
else
{
if((!messageSent.get()) && (hour == 17))
{
DailyLoopInfo.registerUpdate("Runnable monitor", "State", "checking all runnables");
String message = "";
for(DailyRunnable dailyRunnable : runnables)
{
DailyLoopInfo.registerUpdate("Runnable monitor", "Runnable check state",
"checking runnable " + dailyRunnable.getName());
message += "\n" + dailyRunnable.getName() + "\n";
message += "Ultima actualizacion hace: "
+ (System.currentTimeMillis() - dailyRunnable.getLastUpdate())
+ " milisegundos, limite espera: " + dailyRunnable.getUpdateInterval()
+ "\n";
message += "Ultimo run hace: "
+ (System.currentTimeMillis() - dailyRunnable.getLastRun());
message += "\n";
}
for(Pair pair : Pair.values())
message += pair.checkSignals();
Runtime runtime = Runtime.getRuntime();
long kilobytes = 1024L;
message += "\n" + "SSI ultima carga:\n" + DailyFxServerConnection.lastLoad.get() + "\n\nPenultima carga:\n" + DailyFxServerConnection.secondLastLoad.get() + "\n";
message += "\n" + "Informacion de transacciones:\n" + DailyLog.getRangeInfo((calendar.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY) ? true : false) + "\n";
message += "\nMemoria usada: "
+ ((runtime.totalMemory() - runtime.freeMemory()) / kilobytes) + " kb";
message += "\nMemoria libre: " + (runtime.freeMemory() / kilobytes) + " kb";
message += "\nMemoria total: " + (runtime.totalMemory() / kilobytes) + " kb";
message += "\nMemoria limite: " + (runtime.maxMemory() / kilobytes) + " kb";
if(calendar.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY)
EmailConnection.sendEmail("DailyBot-info", message, EmailConnection.ADMINS | EmailConnection.WATCHERS | EmailConnection.SUPERADMINS);
else
EmailConnection.sendEmail("DailyBot-info", message, EmailConnection.WATCHERS);
messageSent.set(true);
DailyUtils.sleep(900000L);
DailyLog.sendAcummulated();
}
}
for(DailyRunnable dailyRunnable : runnables)
{
if(dailyRunnable == this)
continue;
DailyLoopInfo.registerUpdate("Runnable monitor", "State", "checking runnable for problems "
+ dailyRunnable.getName());
if((System.currentTimeMillis() - dailyRunnable.getLastUpdate()) > dailyRunnable
.getUpdateInterval())
{
DailyLoopInfo.registerUpdate("Runnable monitor", "State",
"runnable not updated in a lot of time, rebooting " + dailyRunnable.getName());
DailyLog
.logError("Error, runnable: "
+ dailyRunnable.getName()
+ " no se actualizo en mucho tiempo, intervalo aceptable: "
+ dailyRunnable.getUpdateInterval()
+ ", ultima actualizacion hace: "
+ (System.currentTimeMillis() - dailyRunnable.getLastUpdate() + " haciendo debug"));
String message = "";
long start = System.currentTimeMillis();
Random random = new Random();
for(int i = 0; i < 100; i++)
{
DailyUtils.sleep(random.nextInt(1000));
message += "+ " + (System.currentTimeMillis() - start) + " ms :\n";
for(StackTraceElement[] stackTrace : Thread.getAllStackTraces().values())
{
message += (stackTrace.length == 0 ? " null" : " "
+ Arrays.toString(stackTrace))
+ "\n\n";
}
}
DailyLog.logError("Debug :\n" + message);
DailyLog.tryReboot();
}
}
DailyLoopInfo.registerUpdate("Runnable monitor", "State", "ending monitor, no problem found");
}
catch(Exception e)
{
DailyLog.logError("Error en el monitor de hilos " + e.getMessage());
}
finally
{
DailyLoopInfo.closeLoop("Runnable monitor");
}
}
};
addRunnable(monitor, 5, TimeUnit.MINUTES);
}
public static String checkRunnables()
{
String message = "";
for(DailyRunnable dailyRunnable : runnables)
{
message += dailyRunnable.getName() + "\n";
message += "Ultima actualizacion hace: "
+ (System.currentTimeMillis() - dailyRunnable.getLastUpdate())
+ " milisegundos, limite espera: " + dailyRunnable.getUpdateInterval() + "\n";
message += "Ultimo run hace: "
+ (System.currentTimeMillis() - dailyRunnable.getLastRun());
message += "\n";
}
for(Pair pair : Pair.values())
message += pair.checkSignals();
Runtime runtime = Runtime.getRuntime();
long kilobytes = 1024L;
message += "\nMemoria usada: " + ((runtime.totalMemory() - runtime.freeMemory()) / kilobytes) + " kb";
message += "\nMemoria libre: " + (runtime.freeMemory() / kilobytes) + " kb";
message += "\nMemoria total: " + (runtime.totalMemory() / kilobytes) + " kb";
message += "\nMemoria limite: " + (runtime.maxMemory() / kilobytes) + " kb";
return message;
}
}