package net.johnewart.gearman.server.config;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.health.HealthCheck;
import com.codahale.metrics.health.HealthCheckRegistry;
import net.johnewart.gearman.common.interfaces.JobHandleFactory;
import net.johnewart.gearman.engine.core.JobManager;
import net.johnewart.gearman.engine.core.UniqueIdFactory;
import net.johnewart.gearman.engine.metrics.MetricsEngine;
import net.johnewart.gearman.engine.metrics.QueueMetrics;
import net.johnewart.gearman.engine.queue.factories.JobQueueFactory;
import net.johnewart.gearman.engine.storage.ExceptionStorageEngine;
import net.johnewart.gearman.engine.util.LocalJobHandleFactory;
import net.johnewart.gearman.engine.util.LocalUniqueIdFactory;
import net.johnewart.gearman.server.cluster.config.ClusterConfiguration;
import net.johnewart.gearman.server.cluster.core.ClusterJobManager;
import net.johnewart.gearman.server.cluster.queue.factories.HazelcastJobQueueFactory;
import net.johnewart.gearman.server.cluster.util.HazelcastJobHandleFactory;
import net.johnewart.gearman.server.cluster.util.HazelcastUniqueIdFactory;
import net.johnewart.gearman.server.util.JobQueueMonitor;
import net.johnewart.gearman.server.util.SnapshottingJobQueueMonitor;
import org.slf4j.LoggerFactory;
public class GearmanServerConfiguration implements ServerConfiguration {
private static final org.slf4j.Logger LOG = LoggerFactory.getLogger(GearmanServerConfiguration.class);
private int port;
private int httpPort;
private boolean enableSSL;
private boolean debugging;
private String hostName;
private JobQueueFactory jobQueueFactory;
private JobManager jobManager;
private JobQueueMonitor jobQueueMonitor;
private ExceptionStorageEngine exceptionStorageEngine;
private PersistenceEngineConfiguration persistenceEngine;
private ClusterConfiguration clusterConfiguration;
private ExceptionStoreConfiguration exceptionStoreConfiguration;
private JobHandleFactory jobHandleFactory;
private UniqueIdFactory uniqueIdFactory;
private MetricRegistry metricRegistry;
private QueueMetrics queueMetrics;
private HealthCheckRegistry healthCheckRegistry;
private Object configLock = new Object();
public void setPort(int port) {
this.port = port;
}
public void setHttpPort(int httpPort) {
this.httpPort = httpPort;
}
public boolean isEnableSSL() {
return enableSSL;
}
public void setEnableSSL(boolean enableSSL) {
this.enableSSL = enableSSL;
}
public void setDebugging(boolean debugging) {
this.debugging = debugging;
Logger root = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
if(debugging)
{
root.setLevel(Level.DEBUG);
} else {
root.setLevel(Level.ERROR);
}
}
public PersistenceEngineConfiguration getPersistenceEngine() {
return persistenceEngine;
}
public void setPersistenceEngine(PersistenceEngineConfiguration persistenceEngine) {
this.persistenceEngine = persistenceEngine;
}
public void setHostName(String hostName) {
this.hostName = hostName;
}
public void setJobQueueFactory(JobQueueFactory jobQueueFactory) {
this.jobQueueFactory = jobQueueFactory;
}
public void setJobManager(JobManager jobManager) {
this.jobManager = jobManager;
}
public void setJobQueueMonitor(SnapshottingJobQueueMonitor jobQueueMonitor) {
this.jobQueueMonitor = jobQueueMonitor;
}
public void setExceptionStore(ExceptionStoreConfiguration exceptionStoreConfiguration) {
this.exceptionStoreConfiguration = exceptionStoreConfiguration;
}
public ExceptionStoreConfiguration getExceptionStore() {
return exceptionStoreConfiguration;
}
@Override
public int getPort() {
return port;
}
@Override
public int getHttpPort() {
return httpPort;
}
@Override
public boolean isSSLEnabled() {
return enableSSL;
}
@Override
public boolean isDebugging() {
return debugging;
}
@Override
public String getHostName() {
if (hostName == null) {
hostName = "localhost";
}
return hostName;
}
@Override
public JobQueueFactory getJobQueueFactory() {
if (jobQueueFactory == null && getPersistenceEngine() != null) {
jobQueueFactory = getPersistenceEngine().getJobQueueFactory(getMetricRegistry());
}
return jobQueueFactory;
}
@Override
public JobManager getJobManager() {
if(jobManager == null) {
jobManager = new JobManager(getJobQueueFactory(),
getJobHandleFactory(),
getUniqueIdFactory(),
getExceptionStorageEngine(),
getQueueMetrics());
}
return jobManager;
}
@Override
public JobQueueMonitor getJobQueueMonitor() {
if (jobQueueMonitor == null) {
jobQueueMonitor = new SnapshottingJobQueueMonitor(getQueueMetrics());
}
return jobQueueMonitor;
}
@Override
public JobHandleFactory getJobHandleFactory() {
if (jobHandleFactory == null) {
jobHandleFactory = new LocalJobHandleFactory(getHostName());
}
return jobHandleFactory;
}
@Override
public UniqueIdFactory getUniqueIdFactory() {
if (uniqueIdFactory == null) {
uniqueIdFactory = new LocalUniqueIdFactory();
}
return uniqueIdFactory;
}
@Override
public MetricRegistry getMetricRegistry()
{
if (metricRegistry == null)
{
metricRegistry = new MetricRegistry();
}
return metricRegistry;
}
public QueueMetrics getQueueMetrics() {
synchronized (configLock) {
if (queueMetrics == null) {
queueMetrics = new MetricsEngine(getMetricRegistry());
}
}
return queueMetrics;
}
public ExceptionStorageEngine getExceptionStorageEngine() {
if(exceptionStorageEngine == null && getExceptionStore() != null) {
this.exceptionStorageEngine = getExceptionStore().getExceptionStorageEngine();
}
return exceptionStorageEngine;
}
public ClusterConfiguration getCluster() {
return clusterConfiguration;
}
// Setting the cluster configuration forces some settings...
public void setCluster(ClusterConfiguration clusterConfiguration) {
this.clusterConfiguration = clusterConfiguration;
this.jobQueueFactory = new HazelcastJobQueueFactory(clusterConfiguration.getHazelcastInstance());
this.jobHandleFactory = new HazelcastJobHandleFactory(clusterConfiguration.getHazelcastInstance(), getHostName());
this.uniqueIdFactory = new HazelcastUniqueIdFactory(clusterConfiguration.getHazelcastInstance());
this.jobManager = new ClusterJobManager(jobQueueFactory, jobHandleFactory, uniqueIdFactory, clusterConfiguration.getHazelcastInstance(), queueMetrics);
this.jobQueueMonitor = new SnapshottingJobQueueMonitor(queueMetrics);
}
public HealthCheckRegistry getHealthCheckRegistry()
{
if (healthCheckRegistry == null)
{
healthCheckRegistry = new HealthCheckRegistry();
if (persistenceEngine != null) {
HealthCheck dataStoreHealthcheck = persistenceEngine.getHealthCheck();
if (dataStoreHealthcheck != null) {
healthCheckRegistry.register(persistenceEngine.getEngine(), dataStoreHealthcheck);
}
}
}
return healthCheckRegistry;
}
}