Skip to content

Commit

Permalink
minor touch-ups and move isSql initialization to synchronized init me…
Browse files Browse the repository at this point in the history
…thod
  • Loading branch information
kibo-kellytaylor committed Apr 18, 2023
1 parent 3396510 commit e7ab8d2
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 64 deletions.
94 changes: 39 additions & 55 deletions src/main/java/com/mozu/jobs/dao/JobExecutionDaoImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,145 +3,129 @@
*/
package com.mozu.jobs.dao;

import java.sql.DatabaseMetaData;
import org.springframework.batch.core.repository.dao.AbstractJdbcBatchMetadataDao;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.List;

import javax.sql.DataSource;

import org.springframework.batch.core.repository.dao.AbstractJdbcBatchMetadataDao;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcOperations;
import org.springframework.jdbc.core.JdbcTemplate;

public class JobExecutionDaoImpl extends AbstractJdbcBatchMetadataDao implements JobExecutionDao {
private DataSource dataSource;
private Boolean isSql ;

private Boolean isSql;

//sql queries
public final String JOB_EXECUTION_BY_TENANT_MS = "SELECT TOP 20 ex.JOB_EXECUTION_ID "
public static final String JOB_EXECUTION_BY_TENANT_MS = "SELECT TOP 20 ex.JOB_EXECUTION_ID "
+ "from SpringBatch.BATCH_JOB_EXECUTION ex "
+ "JOIN SpringBatch.BATCH_JOB_EXECUTION_PARAMS param on param.JOB_EXECUTION_ID = ex.JOB_EXECUTION_ID AND param.KEY_NAME = 'tenantId' and param.LONG_VAL = ? "
+ "JOIN SpringBatch.BATCH_JOB_INSTANCE inst on inst.JOB_INSTANCE_ID = ex.JOB_INSTANCE_ID AND inst.JOB_NAME = ? "
+ "ORDER BY JOB_EXECUTION_ID DESC";
public final String LAST_SUCCESSFUL_EXECUTION_DATE_MS = "SELECT TOP 1 ex.START_TIME "

public static final String LAST_SUCCESSFUL_EXECUTION_DATE_MS = "SELECT TOP 1 ex.START_TIME "
+ "from SpringBatch.BATCH_JOB_EXECUTION ex "
+ "JOIN SpringBatch.BATCH_JOB_EXECUTION_PARAMS param on param.JOB_EXECUTION_ID = ex.JOB_EXECUTION_ID AND param.KEY_NAME = 'tenantId' and param.LONG_VAL = ? "
+ "JOIN SpringBatch.BATCH_JOB_INSTANCE inst on inst.JOB_INSTANCE_ID = ex.JOB_INSTANCE_ID AND inst.JOB_NAME = ? "
+ "ORDER BY ex.JOB_EXECUTION_ID DESC";

public final String LAST_SUCCESSFUL_EXECUTION_DATE_BY_SITE_MS = "SELECT TOP 1 ex.START_TIME "
public static final String LAST_SUCCESSFUL_EXECUTION_DATE_BY_SITE_MS = "SELECT TOP 1 ex.START_TIME "
+ "from SpringBatch.BATCH_JOB_EXECUTION ex "
+ "JOIN SpringBatch.BATCH_JOB_EXECUTION_PARAMS param on param.JOB_EXECUTION_ID = ex.JOB_EXECUTION_ID AND param.KEY_NAME = 'tenantId' and param.LONG_VAL = ? "
+ "JOIN SpringBatch.BATCH_JOB_EXECUTION_PARAMS param2 on param2.JOB_EXECUTION_ID = ex.JOB_EXECUTION_ID AND param2.KEY_NAME = 'siteId' and param2.LONG_VAL = ? "
+ "JOIN SpringBatch.BATCH_JOB_INSTANCE inst on inst.JOB_INSTANCE_ID = ex.JOB_INSTANCE_ID AND inst.JOB_NAME = ? "
+ "ORDER BY ex.JOB_EXECUTION_ID DESC";



public final String MULTI_JOB_EXECUTION_BY_TENANT_MS = "SELECT TOP 20 ex.JOB_EXECUTION_ID "
public static final String MULTI_JOB_EXECUTION_BY_TENANT_MS = "SELECT TOP 20 ex.JOB_EXECUTION_ID "
+ "from SpringBatch.BATCH_JOB_EXECUTION ex "
+ "JOIN SpringBatch.BATCH_JOB_EXECUTION_PARAMS param on param.JOB_EXECUTION_ID = ex.JOB_EXECUTION_ID AND param.KEY_NAME = 'tenantId' and param.LONG_VAL = ? "
+ "JOIN SpringBatch.BATCH_JOB_INSTANCE inst on inst.JOB_INSTANCE_ID = ex.JOB_INSTANCE_ID AND inst.JOB_NAME in (%s) "
+ "ORDER BY ex.JOB_EXECUTION_ID DESC";
//non sql queries

public final String JOB_EXECUTION_BY_TENANT_PG = "SELECT ex.JOB_EXECUTION_ID "
//non sql queries
public static final String JOB_EXECUTION_BY_TENANT_PG = "SELECT ex.JOB_EXECUTION_ID "
+ "from SpringBatch.BATCH_JOB_EXECUTION ex "
+ "JOIN SpringBatch.BATCH_JOB_EXECUTION_PARAMS param on param.JOB_EXECUTION_ID = ex.JOB_EXECUTION_ID AND param.KEY_NAME = 'tenantId' and param.LONG_VAL = ? "
+ "JOIN SpringBatch.BATCH_JOB_INSTANCE inst on inst.JOB_INSTANCE_ID = ex.JOB_INSTANCE_ID AND inst.JOB_NAME = ? "
+ "ORDER BY JOB_EXECUTION_ID DESC limit 20";

public final String LAST_SUCCESSFUL_EXECUTION_DATE_PG = "SELECT ex.START_TIME "
public static final String LAST_SUCCESSFUL_EXECUTION_DATE_PG = "SELECT ex.START_TIME "
+ "from SpringBatch.BATCH_JOB_EXECUTION ex "
+ "JOIN SpringBatch.BATCH_JOB_EXECUTION_PARAMS param on param.JOB_EXECUTION_ID = ex.JOB_EXECUTION_ID AND param.KEY_NAME = 'tenantId' and param.LONG_VAL = ? AND ex.EXIT_CODE = 'COMPLETED'"
+ "JOIN SpringBatch.BATCH_JOB_INSTANCE inst on inst.JOB_INSTANCE_ID = ex.JOB_INSTANCE_ID AND inst.JOB_NAME = ? "
+ "ORDER BY ex.JOB_EXECUTION_ID DESC limit 1";

public final String LAST_SUCCESSFUL_EXECUTION_DATE_BY_SITE_PG = "SELECT ex.START_TIME "
public static final String LAST_SUCCESSFUL_EXECUTION_DATE_BY_SITE_PG = "SELECT ex.START_TIME "
+ "from SpringBatch.BATCH_JOB_EXECUTION ex "
+ "JOIN SpringBatch.BATCH_JOB_EXECUTION_PARAMS param on param.JOB_EXECUTION_ID = ex.JOB_EXECUTION_ID AND param.KEY_NAME = 'tenantId' and param.LONG_VAL = ? AND ex.EXIT_CODE = 'COMPLETED'"
+ "JOIN SpringBatch.BATCH_JOB_EXECUTION_PARAMS param2 on param2.JOB_EXECUTION_ID = ex.JOB_EXECUTION_ID AND param2.KEY_NAME = 'siteId' and param2.LONG_VAL = ? "
+ "JOIN SpringBatch.BATCH_JOB_INSTANCE inst on inst.JOB_INSTANCE_ID = ex.JOB_INSTANCE_ID AND inst.JOB_NAME = ? "
+ "ORDER BY ex.JOB_EXECUTION_ID DESC limit 1";

public final String MULTI_JOB_EXECUTION_BY_TENANT_PG = "SELECT ex.JOB_EXECUTION_ID "
public static final String MULTI_JOB_EXECUTION_BY_TENANT_PG = "SELECT ex.JOB_EXECUTION_ID "
+ "from SpringBatch.BATCH_JOB_EXECUTION ex "
+ "JOIN SpringBatch.BATCH_JOB_EXECUTION_PARAMS param on param.JOB_EXECUTION_ID = ex.JOB_EXECUTION_ID AND param.KEY_NAME = 'tenantId' and param.LONG_VAL = ? "
+ "JOIN SpringBatch.BATCH_JOB_INSTANCE inst on inst.JOB_INSTANCE_ID = ex.JOB_INSTANCE_ID AND inst.JOB_NAME in (%s) "
+ "ORDER BY ex.JOB_EXECUTION_ID DESC limit 20";


public DataSource getDataSource() {
return dataSource;
}

public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
setJdbcTemplate(new JdbcTemplate(dataSource));
}

public List<Long> getRecentJobExecutionIds(Long tenantId, List<String>jobNames) {
StringBuffer jobStringBuffer = new StringBuffer();
StringBuilder sb = new StringBuilder();
for (String jobName : jobNames) {
if (jobStringBuffer.length() > 0) {
jobStringBuffer.append(",");
if (sb.length() > 0) {
sb.append(",");
}
jobStringBuffer.append("'").append(jobName).append("'");
sb.append("'").append(jobName).append("'");
}
String statement = isSqlServer(getJdbcTemplate()) ? MULTI_JOB_EXECUTION_BY_TENANT_MS : MULTI_JOB_EXECUTION_BY_TENANT_PG;
String query = String.format(statement, jobStringBuffer.toString());
String statement = isSqlServer() ? MULTI_JOB_EXECUTION_BY_TENANT_MS : MULTI_JOB_EXECUTION_BY_TENANT_PG;
String query = String.format(statement, sb);
return getJdbcTemplate().queryForList(query, Long.class, tenantId);
}

public List<Long> getRecentJobExecutionIds(Long tenantId, String jobName) {
String statement = isSqlServer(getJdbcTemplate()) ? JOB_EXECUTION_BY_TENANT_MS : JOB_EXECUTION_BY_TENANT_PG;

String statement = isSqlServer() ? JOB_EXECUTION_BY_TENANT_MS : JOB_EXECUTION_BY_TENANT_PG;
return getJdbcTemplate().queryForList(statement, Long.class, tenantId, jobName);
}

public Timestamp getLastExecutionDate(Long tenantId, String jobName) {
String statement = isSqlServer(getJdbcTemplate()) ? LAST_SUCCESSFUL_EXECUTION_DATE_MS : LAST_SUCCESSFUL_EXECUTION_DATE_PG;
String statement = isSqlServer() ? LAST_SUCCESSFUL_EXECUTION_DATE_MS : LAST_SUCCESSFUL_EXECUTION_DATE_PG;
List<Timestamp> lastTimestamps = getJdbcTemplate().queryForList(statement, Timestamp.class, tenantId, jobName);
Timestamp lastRunTimestamp = null;
if (lastTimestamps.size() > 0) {
if (!lastTimestamps.isEmpty()) {
lastRunTimestamp = lastTimestamps.get(0);
}
return lastRunTimestamp;
}

@Override
public Timestamp getLastExecutionDate(Long tenantId, Long siteId, String jobName) {

String statement = isSqlServer(getJdbcTemplate()) ? LAST_SUCCESSFUL_EXECUTION_DATE_BY_SITE_MS : LAST_SUCCESSFUL_EXECUTION_DATE_BY_SITE_PG;
JdbcOperations jobOperation = getJdbcTemplate();
String statement = isSqlServer() ? LAST_SUCCESSFUL_EXECUTION_DATE_BY_SITE_MS : LAST_SUCCESSFUL_EXECUTION_DATE_BY_SITE_PG;
List<Timestamp> lastTimestamps = getJdbcTemplate().queryForList(statement, Timestamp.class, tenantId, siteId, jobName);
Timestamp lastRunTimestamp = null;
if (lastTimestamps.size() > 0) {
if (!lastTimestamps.isEmpty()) {
lastRunTimestamp = lastTimestamps.get(0);
}
return lastRunTimestamp;
}

private boolean isSqlServer (JdbcOperations jdbcOperations) {
if ( isSql == null) {
JdbcTemplate jdbcTemplate = (JdbcTemplate) jdbcOperations;
private boolean isSqlServer() {
return Boolean.TRUE.equals(isSql);
}

public synchronized void init() {
if (isSql == null) {
JdbcTemplate jdbcTemplate = (JdbcTemplate) getJdbcTemplate();
String dbProductName = null;
try {
DatabaseMetaData metaData = jdbcTemplate.getDataSource().getConnection().getMetaData();
dbProductName = metaData.getDatabaseProductName();
try (Connection connection = jdbcTemplate.getDataSource().getConnection()) {
dbProductName = connection.getMetaData().getDatabaseProductName();
} catch (SQLException e) {
e.printStackTrace();
}

if (dbProductName != null) {
isSql = dbProductName.toLowerCase().contains("microsoft");
}else{
isSql = true;
}
isSql = dbProductName != null && dbProductName.toLowerCase().contains("microsoft");
}
return isSql;
}

}
18 changes: 9 additions & 9 deletions src/main/resources/jobs/mozu-jobs-base.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,14 @@

<beans:bean id="jobHandler" class="com.mozu.jobs.handlers.JobHandler">
</beans:bean>
<beans:bean id="jobLauncher"

<beans:bean id="jobLauncher"
class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
<beans:property name="jobRepository" ref="jobRepository" />
<beans:property name="taskExecutor">
<beans:bean class="org.springframework.core.task.SimpleAsyncTaskExecutor" />
<beans:property name="jobRepository" ref="jobRepository"/>
<beans:property name="taskExecutor">
<beans:bean class="org.springframework.core.task.SimpleAsyncTaskExecutor"/>
</beans:property>
</beans:bean>
</beans:bean>

<beans:bean id="jobExplorer"
class="org.springframework.batch.core.explore.support.JobExplorerFactoryBean">
Expand Down Expand Up @@ -60,7 +60,7 @@
<beans:property name="spiceKey" value="${spice: }" />
</beans:bean>

<beans:bean id="jobExecutionDao" class="com.mozu.jobs.dao.JobExecutionDaoImpl">
<beans:bean id="jobExecutionDao" class="com.mozu.jobs.dao.JobExecutionDaoImpl" init-method="init">
<beans:property name="dataSource" ref="springDataSource" />
</beans:bean>

Expand All @@ -74,9 +74,9 @@
<beans:property name="jobRepository" ref="jobRepository" />
<beans:property name="jobRegistry" ref="jobRegistry" />
<beans:property name="jobLauncher" ref="jobLauncher" />
</beans:bean>
</beans:bean>

<!-- Spring Batch Admin for JMX -->
<!-- Spring Batch Admin for JMX -->
<context:mbean-server id="mbeanServer" />

<context:mbean-export default-domain="${ApplicationId}.spring.application" server="mbeanServer"/>
Expand Down

0 comments on commit e7ab8d2

Please sign in to comment.