@Override public long countTriggers() { try (Connection conn = DBConnectionManager.getInstance().getConnection(sqlProperties.getProperty(DATA_SOURCE)); Statement stmt = conn.createStatement()) { ResultSet rs = stmt.executeQuery(buildCountTriggersQuery()); if (rs.next()) { return rs.getInt(1); } return 0; } catch (SQLException e) { throw new TriggerRetrievalException("Couldn't count triggers for Scheduler channel", e); } }
private List<List<Object>> executeQuery(String query, List<String> columns) throws SQLException { List<List<Object>> rows = new LinkedList<>(); try (Connection conn = DBConnectionManager.getInstance().getConnection(sqlProperties.getProperty(DATA_SOURCE)); Statement stmt = conn.createStatement()) { ResultSet rs = stmt.executeQuery(query); while (rs.next()) { List<Object> row = new LinkedList<>(); if (columns != null) { for (String name : columns) { row.add(rs.getObject(name)); } } rows.add(row); } } return rows; }
@Inject public QuartzProvider(final Injector injector, final Config config, @Named("org.quartz.jobs") final Map<JobDetail, Trigger> triggers) throws Exception { requireNonNull(injector, "An injector is required."); this.scheduler = new StdSchedulerFactory(properties(config)).getScheduler(); this.jobs = triggers.entrySet(); // override job factory scheduler.setJobFactory((bundle, sch) -> { JobDetail jobDetail = bundle.getJobDetail(); Class<?> jobClass = jobDetail.getJobClass(); return (Job) injector.getInstance(jobClass); }); // hacky way of setting DS? quartz API sucks (it does too much or too little) if (config.hasPath(DS)) { String name = config.getString(DS); // get a provider, bc ds wont be ready yet. Provider<DataSource> ds = injector.getInstance(Key.get(DS_TYPE, Names.named(name))); DBConnectionManager.getInstance() .addConnectionProvider(name, new QuartzConnectionProvider(ds)); } }
@Override public void shutdown() { super.shutdown(); try { DBConnectionManager.getInstance().shutdown(getNonManagedTXDataSource()); } catch (SQLException sqle) { getLog().warn("Database connection shutdown unsuccessful.", sqle); } }
public void shutdown() { super.shutdown(); try { DBConnectionManager.getInstance().shutdown(getNonManagedTXDataSource()); } catch (SQLException sqle) { getLog().warn("Database connection shutdown unsuccessful.", sqle); } }
@Override public List<TriggerEvent> getTriggers(int page, int pageSize) { try (Connection conn = DBConnectionManager.getInstance().getConnection(sqlProperties.getProperty(DATA_SOURCE)); Statement stmt = conn.createStatement()) { ResultSet rs = stmt.executeQuery(buildGetTriggersQuery(page, pageSize)); List<TriggerEvent> triggers = new ArrayList<>(); while (rs.next()) { try (InputStream is = new ByteArrayInputStream(rs.getBytes(JOB_DATA)); ObjectInputStream ois = new ObjectInputStream(is)) { JobDataMap dataMap = (JobDataMap) ois.readObject(); List<EventParameter> parameters = new ArrayList<>(); parameters.add(new EventParameter("scheduler.jobId", MotechSchedulerService.JOB_ID_KEY)); triggers.add(new TriggerEvent( "Job: " + rs.getString(JOB_NAME), rs.getString(JOB_NAME), rs.getString(JOB_DESCRIPTION), parameters, dataMap.getString(SchedulerConstants.EVENT_TYPE_KEY_NAME) )); } } return triggers; } catch (SQLException|IOException|ClassNotFoundException e) { throw new TriggerRetrievalException("Couldn't retrieve triggers for Scheduler channel", e); } }
@Override public TriggerEvent getTrigger(TaskTriggerInformation info) { try (Connection conn = DBConnectionManager.getInstance().getConnection(sqlProperties.getProperty(DATA_SOURCE)); Statement stmt = conn.createStatement()) { ResultSet rs = stmt.executeQuery(buildGetTriggerQuery(info.getSubject())); if (rs.next()) { try (InputStream is = new ByteArrayInputStream(rs.getBytes(JOB_DATA)); ObjectInputStream ois = new ObjectInputStream(is)) { JobDataMap dataMap = (JobDataMap) ois.readObject(); List<EventParameter> parameters = new ArrayList<>(); parameters.add(new EventParameter("scheduler.jobId", MotechSchedulerService.JOB_ID_KEY)); return new TriggerEvent( "Job: " + rs.getString(JOB_NAME), rs.getString(JOB_NAME), rs.getString(JOB_DESCRIPTION), parameters, dataMap.getString(SchedulerConstants.EVENT_TYPE_KEY_NAME) ); } } return null; } catch (SQLException|IOException|ClassNotFoundException e) { throw new TriggerRetrievalException("Couldn't retrieve triggers for Scheduler channel", e); } }
private int executeCountQuery(String query) throws SQLException { int rowConut = 0; try (Connection conn = DBConnectionManager.getInstance().getConnection(sqlProperties.getProperty(DATA_SOURCE)); Statement stmt = conn.createStatement()) { ResultSet rs = stmt.executeQuery(query); rs.next(); rowConut = rs.getInt(1); } return rowConut; }
@Override public void initialize(ClassLoadHelper loadHelper, SchedulerSignaler signaler) throws SchedulerConfigException { // Absolutely needs thread-bound DataSource to initialize. this.dataSource = SchedulerFactoryBean.getConfigTimeDataSource(); if (this.dataSource == null) { throw new SchedulerConfigException( "No local DataSource found for configuration - " + "'dataSource' property must be set on SchedulerFactoryBean"); } // Configure transactional connection settings for Quartz. setDataSource(TX_DATA_SOURCE_PREFIX + getInstanceName()); setDontSetAutoCommitFalse(true); // Register transactional ConnectionProvider for Quartz. DBConnectionManager.getInstance().addConnectionProvider( TX_DATA_SOURCE_PREFIX + getInstanceName(), new ConnectionProvider() { @Override public Connection getConnection() throws SQLException { // Return a transactional Connection, if any. return DataSourceUtils.doGetConnection(dataSource); } @Override public void shutdown() { // Do nothing - a Spring-managed DataSource has its own lifecycle. } /* Quartz 2.2 initialize method */ public void initialize() { // Do nothing - a Spring-managed DataSource has its own lifecycle. } } ); // Non-transactional DataSource is optional: fall back to default // DataSource if not explicitly specified. DataSource nonTxDataSource = SchedulerFactoryBean.getConfigTimeNonTransactionalDataSource(); final DataSource nonTxDataSourceToUse = (nonTxDataSource != null ? nonTxDataSource : this.dataSource); // Configure non-transactional connection settings for Quartz. setNonManagedTXDataSource(NON_TX_DATA_SOURCE_PREFIX + getInstanceName()); // Register non-transactional ConnectionProvider for Quartz. DBConnectionManager.getInstance().addConnectionProvider( NON_TX_DATA_SOURCE_PREFIX + getInstanceName(), new ConnectionProvider() { @Override public Connection getConnection() throws SQLException { // Always return a non-transactional Connection. return nonTxDataSourceToUse.getConnection(); } @Override public void shutdown() { // Do nothing - a Spring-managed DataSource has its own lifecycle. } /* Quartz 2.2 initialize method */ public void initialize() { // Do nothing - a Spring-managed DataSource has its own lifecycle. } } ); // No, if HSQL is the platform, we really don't want to use locks... try { String productName = JdbcUtils.extractDatabaseMetaData(this.dataSource, "getDatabaseProductName").toString(); productName = JdbcUtils.commonDatabaseName(productName); if (productName != null && productName.toLowerCase().contains("hsql")) { setUseDBLocks(false); setLockHandler(new SimpleSemaphore()); } } catch (MetaDataAccessException ex) { logWarnIfNonZero(1, "Could not detect database type. Assuming locks can be taken."); } super.initialize(loadHelper, signaler); }
@Override public void initialize(ClassLoadHelper loadHelper, SchedulerSignaler signaler) throws SchedulerConfigException { // Absolutely needs thread-bound DataSource to initialize. this.dataSource = SchedulerFactoryBean.getConfigTimeDataSource(); if (this.dataSource == null) { throw new SchedulerConfigException( "No local DataSource found for configuration - " + "'dataSource' property must be set on SchedulerFactoryBean"); } // Configure transactional connection settings for Quartz. setDataSource(TX_DATA_SOURCE_PREFIX + getInstanceName()); setDontSetAutoCommitFalse(true); // Register transactional ConnectionProvider for Quartz. DBConnectionManager.getInstance().addConnectionProvider( TX_DATA_SOURCE_PREFIX + getInstanceName(), new ConnectionProvider() { public Connection getConnection() throws SQLException { // Return a transactional Connection, if any. return DataSourceUtils.doGetConnection(dataSource); } public void shutdown() { // Do nothing - a Spring-managed DataSource has its own lifecycle. } /* Quartz 2.2 initialize method */ public void initialize() { // Do nothing - a Spring-managed DataSource has its own lifecycle. } } ); // Non-transactional DataSource is optional: fall back to default // DataSource if not explicitly specified. DataSource nonTxDataSource = SchedulerFactoryBean.getConfigTimeNonTransactionalDataSource(); final DataSource nonTxDataSourceToUse = (nonTxDataSource != null ? nonTxDataSource : this.dataSource); // Configure non-transactional connection settings for Quartz. setNonManagedTXDataSource(NON_TX_DATA_SOURCE_PREFIX + getInstanceName()); // Register non-transactional ConnectionProvider for Quartz. DBConnectionManager.getInstance().addConnectionProvider( NON_TX_DATA_SOURCE_PREFIX + getInstanceName(), new ConnectionProvider() { public Connection getConnection() throws SQLException { // Always return a non-transactional Connection. return nonTxDataSourceToUse.getConnection(); } public void shutdown() { // Do nothing - a Spring-managed DataSource has its own lifecycle. } /* Quartz 2.2 initialize method */ public void initialize() { // Do nothing - a Spring-managed DataSource has its own lifecycle. } } ); // No, if HSQL is the platform, we really don't want to use locks... try { String productName = JdbcUtils.extractDatabaseMetaData(this.dataSource, "getDatabaseProductName").toString(); productName = JdbcUtils.commonDatabaseName(productName); if (productName != null && productName.toLowerCase().contains("hsql")) { setUseDBLocks(false); setLockHandler(new SimpleSemaphore()); } } catch (MetaDataAccessException ex) { logWarnIfNonZero(1, "Could not detect database type. Assuming locks can be taken."); } super.initialize(loadHelper, signaler); }