package org.playorm.cron.impl;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import javax.inject.Inject;
import org.joda.time.DateTime;
import org.playorm.cron.api.CronListener;
import org.playorm.cron.api.CronService;
import org.playorm.cron.api.PlayOrmCronJob;
import org.playorm.cron.impl.db.MonitorDbo;
import org.playorm.cron.impl.db.WebNodeDbo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alvazan.orm.api.base.NoSqlEntityManager;
import com.alvazan.orm.api.base.NoSqlEntityManagerFactory;
import com.alvazan.orm.api.z8spi.KeyValue;
import com.alvazan.orm.api.z8spi.iter.Cursor;
public class CronServiceImpl implements CronService {
private static final Logger log = LoggerFactory.getLogger(CronServiceImpl.class);
@Inject
private ScheduledExecutorService svc;
@Inject
private Config config;
@Inject
private CheckClusterRunnable clusterRunnable;
private NoSqlEntityManagerFactory factory;
@Override
public void start() {
String host = config.getHostName();
WebNodeDbo node = new WebNodeDbo();
node.setLastSeen(new DateTime());
node.setWebServerName(host);
node.setUp(true);
NoSqlEntityManager mgr = factory.createEntityManager();
mgr.put(node);
mgr.flush();
clusterRunnable.setFactory(factory);
if (log.isInfoEnabled())
log.info("running monitor service at rate="+config.getRate()+" milliseconds");
svc.scheduleAtFixedRate(clusterRunnable, 30000, config.getRate(), TimeUnit.MILLISECONDS);
}
@Override
public void addListener(CronListener listener) {
clusterRunnable.setListener(listener);
}
@Override
public void saveMonitor(PlayOrmCronJob monitor) {
MonitorDbo m = CopyUtil.copy(monitor);
NoSqlEntityManager mgr = factory.createEntityManager();
mgr.put(m, false);
mgr.flush();
}
@Override
public void deleteMonitor(String id) {
NoSqlEntityManager mgr = factory.createEntityManager();
MonitorDbo entity = mgr.getReference(MonitorDbo.class, id);
mgr.remove(entity);
mgr.flush();
}
@Override
public PlayOrmCronJob getMonitor(String id) {
NoSqlEntityManager mgr = factory.createEntityManager();
MonitorDbo mon = mgr.find(MonitorDbo.class, id);
return CopyUtil.copy(mon);
}
public List<PlayOrmCronJob> getMonitors(List<String> ids) {
NoSqlEntityManager mgr = factory.createEntityManager();
Cursor<KeyValue<MonitorDbo>> cursor = mgr.findAll(MonitorDbo.class, ids);
List<PlayOrmCronJob> monitors = new ArrayList<PlayOrmCronJob>();
while(cursor.next()) {
KeyValue<MonitorDbo> kv = cursor.getCurrent();
MonitorDbo mon = kv.getValue();
monitors.add(CopyUtil.copy(mon));
}
return monitors;
}
public void setFactory(NoSqlEntityManagerFactory factory2) {
this.factory = factory2;
}
}