package io.cattle.platform.app;
import io.cattle.platform.datasource.DataSourceFactory;
import io.cattle.platform.datasource.JMXDataSourceFactoryImpl;
import io.cattle.platform.db.jooq.logging.LoggerListener;
import io.cattle.platform.extension.impl.ExtensionManagerImpl;
import io.cattle.platform.json.JacksonJsonMapper;
import io.cattle.platform.liquibase.JarInJarServiceLocator;
import io.cattle.platform.liquibase.Loader;
import io.cattle.platform.spring.resource.SpringConfigurableExecutorService;
import io.cattle.platform.spring.resource.SpringResourceLoader;
import io.cattle.platform.util.concurrent.NamedExecutorService;
import java.util.Arrays;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import javax.management.MalformedObjectNameException;
import javax.sql.DataSource;
import org.jooq.conf.Settings;
import org.jooq.impl.DataSourceConnectionProvider;
import org.jooq.tools.StopWatchListener;
import org.springframework.beans.factory.annotation.Autowire;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy;
import org.springframework.scheduling.concurrent.ScheduledExecutorFactoryBean;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.google.common.util.concurrent.ListeningExecutorService;
import com.google.common.util.concurrent.MoreExecutors;
@Configuration
public class SystemConfig {
@Bean
JMXDataSourceFactoryImpl DataSourceFactory() {
return new JMXDataSourceFactoryImpl();
}
@Bean
@DependsOn("ArchaiusStartup")
DataSource DataSource(DataSourceFactory factory) {
return factory.createDataSource("cattle");
}
@Bean
Loader liquibaseCore(DataSourceFactory factory) {
JarInJarServiceLocator locator = new JarInJarServiceLocator();
locator.init();
Loader loader = new Loader();
loader.setDataSourceFactory(factory);
loader.setChangeLog("classpath:db/changelog.xml");
return loader;
}
@Bean
DataSourceConnectionProvider JooqConnectionProvider(@Qualifier("DataSource") DataSource ds) {
return new DataSourceConnectionProvider(new TransactionAwareDataSourceProxy(ds));
}
@Bean
@Primary
io.cattle.platform.db.jooq.config.Configuration JooqConfiguration(DataSourceConnectionProvider dscp) {
LoggerListener logger = new LoggerListener();
logger.setMaxLength(1000);
io.cattle.platform.db.jooq.config.Configuration config = new io.cattle.platform.db.jooq.config.Configuration();
config.setName("cattle");
config.setConnectionProvider(dscp);
config.setListeners(Arrays.asList(
logger,
new StopWatchListener()));
return config;
}
@Bean
io.cattle.platform.db.jooq.config.Configuration LockingJooqConfiguration(DataSourceConnectionProvider dscp) {
Settings settings = new Settings();
settings.setExecuteWithOptimisticLocking(true);
LoggerListener logger = new LoggerListener();
logger.setMaxLength(1000);
io.cattle.platform.db.jooq.config.Configuration config = new io.cattle.platform.db.jooq.config.Configuration();
config.setName("cattle");
config.setConnectionProvider(dscp);
config.setListeners(Arrays.asList(
logger,
new StopWatchListener()));
config.setSettings(settings);
return config;
}
@Bean
DataSourceTransactionManager CoreTransactionManager(@Qualifier("DataSource") DataSource ds) {
DataSourceTransactionManager dstm = new DataSourceTransactionManager();
dstm.setDataSource(ds);
return dstm;
}
@Bean
SpringResourceLoader ResourceLoader() {
return new SpringResourceLoader();
}
@Bean(autowire = Autowire.BY_TYPE)
JacksonJsonMapper CoreJsonMapper() {
return new JacksonJsonMapper();
}
@Bean
SimpleModule NoOpJacksonModule() {
return new SimpleModule();
}
@Bean
NamedExecutorService process(ExtensionManagerImpl em, @Qualifier("ProcessEventExecutorService") ExecutorService es) {
NamedExecutorService nes = new NamedExecutorService();
nes.setName("process");
nes.setExecutorService(es);
return nes;
}
@Bean
NamedExecutorService blockingprocess(ExtensionManagerImpl em, @Qualifier("ProcessBlockingExecutorService") ExecutorService es) {
NamedExecutorService nes = new NamedExecutorService();
nes.setName("blockingprocess");
nes.setExecutorService(es);
return nes;
}
@Bean
ListeningExecutorService CoreListeningExecutorService(@Qualifier("CoreExecutorService") ExecutorService es) {
return MoreExecutors.listeningDecorator(es);
}
@Bean
ScheduledExecutorFactoryBean CoreScheduledExecutorService() {
ScheduledExecutorFactoryBean sefb = new ScheduledExecutorFactoryBean();
sefb.setPoolSize(10);
return sefb;
}
@Bean
SpringConfigurableExecutorService ProcessEventExecutorService() throws MalformedObjectNameException {
return SpringConfigurableExecutorService.byName("ProcessEventExecutorService");
}
@Bean
SpringConfigurableExecutorService ProcessNonBlockingExecutorService() throws MalformedObjectNameException {
return SpringConfigurableExecutorService.byName("ProcessNonBlockingExecutorService", new ThreadPoolExecutor.DiscardPolicy());
}
@Bean
SpringConfigurableExecutorService ProcessBlockingExecutorService() throws MalformedObjectNameException {
return SpringConfigurableExecutorService.byName("ProcessBlockingExecutorService", new ThreadPoolExecutor.DiscardPolicy());
}
@Bean
SpringConfigurableExecutorService CoreExecutorService() throws MalformedObjectNameException {
return SpringConfigurableExecutorService.byName("CoreExecutorService");
}
@Bean
SpringConfigurableExecutorService EventExecutorService() throws MalformedObjectNameException {
/*
* This is for very short lived tasks, no blocking
*/
return SpringConfigurableExecutorService.byName("EventExecutorService");
}
}