/* * gw2live - GuildWars 2 Dynamic Map * * Website: http://gw2map.com * * Copyright 2013 zyclonite networx * http://zyclonite.net * Developer: Lukas Prettenthaler */ package net.zyclonite.gw2live.timer; import com.hazelcast.core.IMap; import java.util.Collection; import java.util.LinkedList; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import net.zyclonite.gw2live.listener.PveEventListener; import net.zyclonite.gw2live.listener.WvwEventListener; import net.zyclonite.gw2live.model.PveEvent; import net.zyclonite.gw2live.model.WvwEvent; import net.zyclonite.gw2live.service.EsperEngine; import net.zyclonite.gw2live.service.Gw2Client; import net.zyclonite.gw2live.service.HazelcastCache; import net.zyclonite.gw2live.service.MongoDB; import net.zyclonite.gw2live.threads.PveEventMatcher; import net.zyclonite.gw2live.threads.WvwEventMatcher; import net.zyclonite.gw2live.util.LocalCache; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.mongojack.DBCursor; /** * * @author zyclonite */ public class UpdateTimer { private final ExecutorService es; private static final Log LOG = LogFactory.getLog(UpdateTimer.class); private final MongoDB db; private final Gw2Client client; private final EsperEngine esper; private final IMap<Integer, PveEvent> pveEventCache; private final IMap<Integer, WvwEvent> wvwEventCache; public UpdateTimer() { final HazelcastCache hz = HazelcastCache.getInstance(); es = Executors.newFixedThreadPool(2); db = MongoDB.getInstance(); client = Gw2Client.getInstance(); pveEventCache = hz.getPveCacheMap(); wvwEventCache = hz.getWvwCacheMap(); esper = EsperEngine.getInstance(); } protected void prefillCache() { if (LocalCache.PVE_ENABLED) { final DBCursor<PveEvent> pveevents = db.findPveEvents(); pveevents.batchSize(5000); for (final PveEvent pveevent : pveevents) { pveEventCache.put(pveevent.hashCode(), pveevent); esper.sendEvent(pveevent); } pveevents.close(); } if (LocalCache.WVW_ENABLED) { final DBCursor<WvwEvent> wvwevents = db.findWvwEvents(); wvwevents.batchSize(5000); for (final WvwEvent wvwevent : wvwevents) { wvwEventCache.put(wvwevent.hashCode(), wvwevent); esper.sendEvent(wvwevent); } wvwevents.close(); } } protected void updateCache() { final Collection<Future<Boolean>> threads = new LinkedList<>(); if (LocalCache.PVE_ENABLED) { threads.add(es.submit(new PveEventMatcher())); } if (LocalCache.WVW_ENABLED) { threads.add(es.submit(new WvwEventMatcher())); } int finished = 0; for (final Future<Boolean> thread : threads) { try { if (thread.get()) { finished++; } } catch (InterruptedException | ExecutionException ex) { LOG.error(ex, ex); } } if (finished < threads.size()) { LOG.warn(finished + " of " + threads.size() + " tasks did not finish"); } } protected void updateDB() { for (final String lang : LocalCache.LANGUAGES) { if (LocalCache.PVE_ENABLED) { db.savePveEventNames(client.getPveEventNames(lang), lang); db.savePveMapNames(client.getPveMapNames(lang), lang); } if (LocalCache.PVE_ENABLED || LocalCache.WVW_ENABLED) { db.savePveWorldNames(client.getPveWorldNames(lang), lang); } if (LocalCache.WVW_ENABLED) { db.saveWvwObjectiveNames(client.getWvwObjectiveNames(lang), lang); } } if (LocalCache.PVE_ENABLED) { db.savePveEventDetails(client.getPveEventDetails().getEventDetails()); } if (LocalCache.WVW_ENABLED) { db.saveWvwMatches(client.getWvwMatches().getWvw_matches()); } if (LocalCache.PVE_ENABLED || LocalCache.WVW_ENABLED) { db.saveMaps(client.getMaps().getMapList()); } } protected void registerListeners() { if (LocalCache.PVE_ENABLED) { pveEventCache.addEntryListener(new PveEventListener(), true); } if (LocalCache.WVW_ENABLED) { wvwEventCache.addEntryListener(new WvwEventListener(), true); } } }