我正在尝试将DB2源设置为Batch元数据的持久性.我得到这个堆栈跟踪:
Caused by: org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL [SELECT JOB_EXECUTION_ID, START_TIME, END_TIME, STATUS, EXIT_CODE, EXIT_MESSAGE, CREATE_TIME, LAST_UPDATED, VERSION, JOB_CONFIGURATION_LOCATION from rhall.BATCH_JOB_EXECUTION where JOB_INSTANCE_ID = ? order by JOB_EXECUTION_ID desc]; SQL state [null]; error code [-4470]; [jcc][t4][10120][10898][3.57.82] Invalid operation: result set is closed. ERRORCODE=-4470, SQLSTATE=null; nested exception is com.ibm.db2.jcc.am.SqlException: [jcc][t4][10120][10898][3.57.82] Invalid operation: result set is closed. ERRORCODE=-4470, SQLSTATE=null
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:84)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:645)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:680)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:712)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:722)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:777)
at org.springframework.batch.core.repository.dao.JdbcJobExecutionDao.findJobExecutions(JdbcJobExecutionDao.java:131)
at org.springframework.batch.core.repository.support.SimpleJobRepository.getStepExecutionCount(SimpleJobRepository.java:253)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native …Run Code Online (Sandbox Code Playgroud) 我有一个Spring Batch应用程序,我从它开始CommandLineJobRunner.但现在我必须将此应用程序嵌入到我们的企业环境中.我们有一个自己的Launcher应用程序,我必须使用它.对于这个启动器应用程序,我需要一个带有main方法的启动类,它将在启动时调用,并且我必须启动Spring Batch.
是JobLauncher使用此启动器手动分配和运行作业的唯一方法,还是Spring Batch中有一个类支持(或者有人知道样本)?
如何从多个数据库中读取项目?我已经知道可以从文件中获取.
以下示例适用于从多个文件中读取
...
<job id="readMultiFileJob" xmlns="http://www.springframework.org/schema/batch">
<step id="step1">
<tasklet>
<chunk reader="multiResourceReader" writer="flatFileItemWriter"
commit-interval="1" />
</tasklet>
</step>
</job>
...
<bean id="multiResourceReader"
class=" org.springframework.batch.item.file.MultiResourceItemReader">
<property name="resources" value="file:csv/inputs/domain-*.csv" />
<property name="delegate" ref="flatFileItemReader" />
</bean>
...
Run Code Online (Sandbox Code Playgroud)
像这样的三个豆子.
<bean id="database2" class="org.springframework.batch.item.database.JdbcCursorItemReader">
<property name="name" value="database2Reader" />
<property name="dataSource" ref="dataSource2" />
<property name="sql" value="select image from object where image like '%/images/%'" />
<property name="rowMapper">
<bean class="sym.batch.ImagesRowMapper2" />
</property>
</bean>
Run Code Online (Sandbox Code Playgroud) 我按照http://spring.io/guides/gs/batch-processing/上的指南进行了操作,但它描述了一个没有可配置参数的作业.我正在使用Maven来构建我的项目.
我正在移植我在XML中定义的现有作业,并希望通过命令传入jobParameters.
我尝试了以下方法:
@Configuration
@EnableBatchProcessing
public class MyBatchConfiguration {
// other beans ommited
@Bean
public Resource destFile(@Value("#{jobParameters[dest]}") String dest) {
return new FileSystemResource(dest);
}
}
Run Code Online (Sandbox Code Playgroud)
然后我使用以下方法编译项目:
mvn clean package
Run Code Online (Sandbox Code Playgroud)
然后我尝试启动这样的程序:
java my-jarfile.jar dest=/tmp/foo
Run Code Online (Sandbox Code Playgroud)
我得到一个例外说:
[...]
Caused by: org.springframework.expression.spel.SpelEvaluationException:
EL1008E:(pos 0): Field or property 'jobParameters' cannot be found on object of
type 'org.springframework.beans.factory.config.BeanExpressionContext'
Run Code Online (Sandbox Code Playgroud)
谢谢 !
我在Spring Batch中创建异步处理器时遇到问题.我的处理器越来越ID从reader基于从响应,建立对象SOAP调用.有时为1输入(ID)必须有例如60-100个SOAP调用,有时只有1个.我试图制作多线程步骤,它正在处理例如50个输入,但它没用,因为49个线程在1秒内完成了它们的工作并被阻止,等待这个正在进行60-100次SOAP通话的人.现在我用AsyncItemProcessor+ AsyncItemWriter但这个解决方案对我来说很慢.由于我的输入(IDs)很大,从DB读取的大约25k项目我希望在时间开始~50-100输入.
这是我的配置:
@Configuration
public class BatchConfig {
@Autowired
public JobBuilderFactory jobBuilderFactory;
@Autowired
public StepBuilderFactory stepBuilderFactory;
@Autowired
private DatabaseConfig databaseConfig;
@Value(value = "classpath:Categories.txt")
private Resource categories;
@Bean
public Job processJob() throws Exception {
return jobBuilderFactory.get("processJob").incrementer(new RunIdIncrementer()).listener(listener()).flow(orderStep1()).end().build();
}
@Bean
public Step orderStep1() throws Exception {
return stepBuilderFactory.get("orderStep1").<Category, CategoryDailyResult>chunk(1).reader(reader()).processor(asyncItemProcessor()).writer(asyncItemWriter()).taskExecutor(taskExecutor()).build();
}
@Bean
public JobExecutionListener listener() {
return new JobCompletionListener();
}
@Bean
public ItemWriter asyncItemWriter() { …Run Code Online (Sandbox Code Playgroud) 我有一个表记录其在字段上的行插入/更新时间戳.
我想将此表中的数据与另一个数据库服务器上的另一个表同步.两个数据库服务器未连接,同步是单向(主/从).使用表触发器不合适
我的工作流程
处理Master表的已删除记录时,问题的复杂性会增加.为了捕获已删除的记录,我认为我必须为先前插入的记录维护一个日志表并使用sql"NOT IN".在处理大型数据集时,这会成为性能问题.
什么是处理这种情况的替代工作流程?
spring批量远程分块和远程分区有什么区别?
我无法理解Spring批处理中远程分块和远程分区之间的区别.有人可以解释一下吗?
使用案例:从数据库中读取1000万行[10列]并写入文件(csv格式).
将建议JdbcCursorItemReader和JdbcPagingItemReader中的哪个ItemReader实现?那是什么原因?
在上述用例中哪个表现更好(快)?
在单流程与多流程方法的情况下,选择会有所不同吗?
在使用TaskExecutor的多线程方法的情况下,哪一个会更好和简单?
我特别对Spring和Spring-Batch很新.我还是设法安装了Spring Batch-Admin.我添加了自定义作业和Hibernate/JPA以实现持久性.
一切都按预期工作,直到第一个块应该持久化.然后我收到以下错误消息:
org.springframework.transaction.CannotCreateTransactionException:
Could not open JPA EntityManager for transaction;
nested exception is java.lang.IllegalStateException: Already value
[org.springframework.jdbc.datasource.ConnectionHolder@60d31437]
for key [org.springframework.jdbc.datasource.DriverManagerDataSource@12da4b19]
bound to thread [jobLauncherTaskExecutor-1]
Run Code Online (Sandbox Code Playgroud)
这是完整的堆栈跟踪:
org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is java.lang.IllegalStateException: Already value [org.springframework.jdbc.datasource.ConnectionHolder@43f9e588] for key [org.springframework.jdbc.datasource.DriverManagerDataSource@84f171a] bound to thread [jobLauncherTaskExecutor-1]
at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:427)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:371)
at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:335)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:105)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
at com.sun.proxy.$Proxy41.saveIfUnique(Unknown Source)
at com.qompa.batch.ArticleItemWriter.write(ArticleItemWriter.java:28)
at org.springframework.batch.core.step.item.SimpleChunkProcessor.writeItems(SimpleChunkProcessor.java:171)
at org.springframework.batch.core.step.item.SimpleChunkProcessor.doWrite(SimpleChunkProcessor.java:150)
at org.springframework.batch.core.step.item.FaultTolerantChunkProcessor$3.doWithRetry(FaultTolerantChunkProcessor.java:313)
at org.springframework.batch.retry.support.RetryTemplate.doExecute(RetryTemplate.java:240)
at …Run Code Online (Sandbox Code Playgroud) 我有一个小的Spring Boot应用程序,我必须适应使用自定义父级.谷歌找到了很多关于如何迁移到 Spring Boot 的例子,但我不知道从 Spring Boot 迁移(我几乎不知道开始).
简而言之,这个应用程序是作为一种概念验证而开发的,开发人员选择了最先进的技术.
现在,这个应用程序将继续生存,我们需要将它集成到我们的框架中.因此,作为一个Maven项目,它应该继承我们的一个普通父项,尽管我的理解是Spring Boot项目应该继承自Spring Boot的父级POM.
[编辑]我错了:可以在没有父POM的情况下使用Spring Boot.因此,删除Spring Boot不是义务,但我们的父POM包含自己的版本管理,这使我必须覆盖启动器中包含的几个版本.
我们在所有项目中都使用了一个企业框架.为了简化操作,我们在父POM中管理许多框架的版本.这些版本与我们的小批量项目中spring-boot-dependencies的版本冲突的一些示例:
我显然无权升级这些版本.请记住,这个框架用于许多项目,任何改变都可能产生严重和不受控制的后果.
目标是获得一点Spring批处理应用程序.它必须从命令行获取一些输入,并12在执行失败时返回退出代码.下面是发射器的核心,但我愿意接受任何更好的方法.
如果完全放弃Spring Boot,我需要调整这个启动器类,但是,主要用于XML Spring上下文,我发现这有点困难.
// ...
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.JobExecution;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan;
@ComponentScan("my.config.package")
@EnableAutoConfiguration
public class Application {
public static void main(String[] args) {
// ...
SpringApplication app = new SpringApplication(Application.class);
app.setWebEnvironment(false);
final Map<String, …Run Code Online (Sandbox Code Playgroud)