package de.otto.edison.jobs.eventbus;
/**
* Delegates the calls of {@link JobEventPublisher#info(String)},
* {@link JobEventPublisher#warn(String)} and {@link JobEventPublisher#error(String)}
* to the correct JobEventPublisher of a job.
*
* This can be useful in methods outside the {@link de.otto.edison.jobs.service.JobRunnable#execute(JobEventPublisher)}
* method which do not know about the JobEventPublisher of a Job (e.g. stateless dependencies of a job).
*/
public final class JobEvents {
private static ThreadLocal<JobEventPublisher> jobEventPublisherThreadLocal = new InheritableThreadLocal<>();
/**
* Internal method. Should only be called inside edison-jobs.
*
* @param jobEventPublisher the JobEventPublisher to register
*/
public static void register(final JobEventPublisher jobEventPublisher) {
if (jobEventPublisherThreadLocal.get() != null) {
throw new IllegalStateException(
"JobEventPublisher has already been initialised. " +
"Either you forgot to call destroy(deregister) or you called register(JobEventPublisher) twice"
);
}
jobEventPublisherThreadLocal.set(jobEventPublisher);
}
/**
* Internal method. Should only be called inside edison-jobs.
*/
public static void deregister() {
jobEventPublisherThreadLocal.remove();
}
/**
* Publish an error event.
*
* @param message error message
*/
public static void error(final String message) {
checkInitialisation();
jobEventPublisherThreadLocal.get().error(message);
}
/**
* Publish a warning event.
*
* @param message warning message
*/
public static void warn(final String message) {
checkInitialisation();
jobEventPublisherThreadLocal.get().warn(message);
}
/**
* Publish an info event.
*
* @param message info message
*/
public static void info(final String message) {
checkInitialisation();
jobEventPublisherThreadLocal.get().info(message);
}
private static void checkInitialisation() {
if (jobEventPublisherThreadLocal.get() == null) {
throw new IllegalStateException("JobEventPublisher has not been initialised. Try calling JobEvents.register(JobEventPublisher) first");
}
}
private JobEvents() {
// should not be instantiated
}
}