package de.otto.edison.jobs.eventbus;
import de.otto.edison.jobs.domain.JobMessage;
import de.otto.edison.jobs.eventbus.events.MessageEvent;
import de.otto.edison.jobs.eventbus.events.StateChangeEvent;
import de.otto.edison.jobs.service.JobService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import static de.otto.edison.jobs.domain.JobMessage.jobMessage;
public class PersistenceJobEventListener implements JobEventListener {
private static final Logger LOG = LoggerFactory.getLogger(PersistenceJobEventListener.class);
private final JobService jobService;
public PersistenceJobEventListener(final JobService jobService) {
this.jobService = jobService;
}
@Override
public void consumeStateChange(final StateChangeEvent event) {
try {
switch (event.getState()) {
case START:
// nothing to do
break;
case KEEP_ALIVE:
jobService.keepAlive(event.getJobId());
break;
case RESTART:
jobService.markRestarted(event.getJobId());
break;
case DEAD:
jobService.killJob(event.getJobId(), event.getJobType());
break;
case SKIPPED:
jobService.markSkipped(event.getJobId());
jobService.stopJob(event.getJobId());
break;
case STOP:
jobService.stopJob(event.getJobId());
break;
}
}
catch(RuntimeException e) {
LOG.error("Failed to persist job state change: jobId="+event.getJobId()+", state="+event.getState(), e);
}
}
@Override
public void consumeMessage(final MessageEvent messageEvent) {
try {
JobMessage jobMessage = convertMessage(messageEvent);
jobService.appendMessage(messageEvent.getJobId(), jobMessage);
}
catch(RuntimeException e) {
LOG.error("Failed to persist job message (jobId="+messageEvent.getJobId()+"): "+messageEvent.getMessage(), e);
}
}
private JobMessage convertMessage(MessageEvent messageEvent) {
return jobMessage(messageEvent.getLevel(), messageEvent.getMessage(),
OffsetDateTime.ofInstant(Instant.ofEpochMilli(messageEvent.getTimestamp()), ZoneId.systemDefault()));
}
}