这就是我如何至少让那部分(显然)工作:
在DefaultBatchConfigurer 的子类中,我添加了以下代码:
@Override
protected JobRepository createJobRepository() throws Exception
{
JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
factory.setDataSource(dataSource);
factory.setTransactionManager(getTransactionManager());
factory.setIncrementerFactory(new RedshiftIncrementerFactory(dataSource));
factory.afterPropertiesSet();
return factory.getObject();
}
工厂对象的样子
public class RedshiftIncrementerFactory implements DataFieldMaxValueIncrementerFactory
{
private DataSource dataSource;
public RedshiftIncrementerFactory(DataSource ds)
{
this.dataSource = ds;
}
@Override
public DataFieldMaxValueIncrementer getIncrementer(String databaseType, String incrementerName)
{
return new RedshiftIncrementer(dataSource, incrementerName);
}
@Override
public boolean isSupportedIncrementerType(String databaseType)
{
return POSTGRES.toString().equals(databaseType);
}
@Override
public String[] getSupportedIncrementerTypes()
{
return new String[]{POSTGRES.toString()};
}
}
然后,最后是增量器本身:
public class RedshiftIncrementer extends AbstractSequenceMaxValueIncrementer
{
public RedshiftIncrementer(DataSource dataSource, String incrementorName)
{
super(dataSource, incrementorName);
}
// I need to run two queries here, since Redshift doesn't support sequences
@Override
protected long getNextKey() throws DataAccessException {
Connection con = DataSourceUtils.getConnection(getDataSource());
Statement stmt = null;
ResultSet rs = null;
try {
stmt = con.createStatement();
DataSourceUtils.applyTransactionTimeout(stmt, getDataSource());
String table = getIncrementerName();
stmt.executeUpdate("UPDATE " + table + " SET ID = ID + 1");
rs = stmt.executeQuery("SELECT ID FROM " + table + " WHERE UNIQUE_KEY='0'");
if (rs.next()) {
return rs.getLong(1);
}
else {
throw new DataAccessResourceFailureException("Sequence query did not return a result");
}
}
catch (SQLException ex) {
throw new DataAccessResourceFailureException("Could not obtain sequence value", ex);
}
finally {
JdbcUtils.closeResultSet(rs);
JdbcUtils.closeStatement(stmt);
DataSourceUtils.releaseConnection(con, getDataSource());
}
}
@Override
protected String getSequenceQuery()
{
// No longer used
return null;
}
}
这至少允许作业开始。但是,Redshift 还存在其他问题,我将在其他地方详细说明。