2017-11-30 20 views
0

DB2データベースを読み込み、Springバッチを使用してmongoDBにデータをコピーする必要があります。 mongoDBにデータを書き込むので、トランザクションは必要ありません。私はメタデータテーブルのスクリプトをmongoDBの中にだけDB2ではなく保存したいと思いますが、mongoDB用のメタデータテーブルスクリプトを見つけることができませんでした。サーバの起動時には、spring bootはmongoDBの代わりにDb2のbatch_job_instanceテーブルを必要とします。私は主としてmongoDBに注釈を付けましたが、それでもエラーを投げています。Springバッチを使用したDB2とMongoDBを使用したSpringバッチ

誰かがこれを手伝うことができます。前もって感謝します。

MongoConfig.java:

@Configuration 
@EnableMongoRepositories("com.test.mongodb") 
public class MongoConfig extends AbstractMongoConfiguration { 

    private final Logger log = LoggerFactory.getLogger(MongoConfig.class); 

    @Value("${spring.data.mongodb.host}") 
    private String host; 

    @Value("${spring.data.mongodb.port}") 
    private Integer port; 

    @Value("${spring.data.mongodb.username}") 
    private String username; 

    @Value("${spring.data.mongodb.database}") 
    private String database; 

    @Value("${spring.data.mongodb.password}") 
    private String password; 

    @Bean 
    public ValidatingMongoEventListener validatingMongoEventListener() { 
     return new ValidatingMongoEventListener(validator()); 
    } 
    @Bean 
    public LocalValidatorFactoryBean validator() { 
     return new LocalValidatorFactoryBean(); 
    } 

    @Override 
    public String getDatabaseName() { 
     return database; 
    } 

    @Override 
    @Bean 
    public Mongo mongo() throws Exception { 
     return new MongoClient(singletonList(new ServerAddress(host, port)), 
       singletonList(MongoCredential.createCredential(username, database, password.toCharArray()))); 
    } 

    @Override 
    @Bean 
    @Primary 
    @ConfigurationProperties(prefix = "spring.data.mongodb") 
    public MongoTemplate mongoTemplate() throws Exception { 
     return new MongoTemplate(mongo(), database); 
    } 
} 

application.properties:

# DB2 
spring.datasource.jndi-name=java:jboss/datasources/Db2XaDsn 

# Mongo DB 
spring.data.mongodb.host=localhost 
spring.data.mongodb.port=27017 
spring.data.mongodb.username=admin 
spring.data.mongodb.password=admin 
spring.data.mongodb.database=test 

バッチクラス:

@Configuration 
@EnableBatchProcessing 
public class ItemBatch { 

    @Autowired 
    private JobBuilderFactory jobBuilderFactory; 

    @Autowired 
    private StepBuilderFactory stepBuilderFactory; 

    @Autowired 
    EntityManagerFactory entityManagerFactory; 

    @Autowired 
    MongoTemplate mongoTemplate; 

    @Bean 
    public Job readDB2() { 
     return jobBuilderFactory.get("readDB2").start(step1()).build(); 
    } 

    @Bean 
    public Step step1() { 
     return stepBuilderFactory.get("step1").<com.model.db2.Item, Item>chunk(200).reader(reader()) 
       .writer(writer()).build(); 
    } 

    @Bean 
    public ItemReader<com.model.db2.Item> reader() { 
     JpaPagingItemReader<com.model.db2.Item> reader = new JpaPagingItemReader<>(); 
     reader.setQueryString("select i from Item i"); 
     reader.setEntityManagerFactory(entityManagerFactory); 
     return reader; 
    } 

    @Bean 
    public MongoItemWriter<Item> writer() { 
     MongoItemWriter<Item> writer = new MongoItemWriter<>(); 
     try { 
      writer.setTemplate(mongoTemplate); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     writer.setCollection("item"); 
     return writer; 
    } 
} 

エラー:

00:44:39,484 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 72) MSC000001: Failed to start service jboss.undertow.deployment.default-server.default-host./itemapi: org.jboss.msc.service.StartException in service jboss.undertow.deployment.default-server.default-host./itemapi: java.lang.RuntimeException: java.lang.IllegalStateException: Failed to execute CommandLineRunner 
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:85) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
    at org.jboss.threads.JBossThread.run(JBossThread.java:320) 
Caused by: java.lang.RuntimeException: java.lang.IllegalStateException: Failed to execute CommandLineRunner 
    at io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:231) 
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:100) 
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:82) 
    ... 6 more 
Caused by: java.lang.IllegalStateException: Failed to execute CommandLineRunner 
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:735) 
    at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:716) 
    at org.springframework.boot.SpringApplication.afterRefresh(SpringApplication.java:703) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:304) 
    at org.springframework.boot.web.support.SpringBootServletInitializer.run(SpringBootServletInitializer.java:154) 
    at org.springframework.boot.web.support.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:134) 
    at org.springframework.boot.web.support.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:87) 
    at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:169) 
    at io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:184) 
    ... 8 more 
Caused by: org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [SELECT JOB_INSTANCE_ID, JOB_NAME from BATCH_JOB_INSTANCE where JOB_NAME = ? order by JOB_INSTANCE_ID desc]; nested exception is com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-204, SQLSTATE=42704, SQLERRMC=TEST.BATCH_JOB_INSTANCE, DRIVER=4.18.60 
    at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:231) 
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:649) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:684) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:716) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:726) 
    at org.springframework.batch.core.repository.dao.JdbcJobInstanceDao.getJobInstances(JdbcJobInstanceDao.java:230) 
    at org.springframework.batch.core.explore.support.SimpleJobExplorer.getJobInstances(SimpleJobExplorer.java:173) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
    at org.springframework.batch.core.configuration.annotation.SimpleBatchConfiguration$PassthruAdvice.invoke(SimpleBatchConfiguration.java:127) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) 
    at com.sun.proxy.$Proxy302.getJobInstances(Unknown Source) 
    at org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.getNextJobParameters(JobLauncherCommandLineRunner.java:131) 
    at org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.execute(JobLauncherCommandLineRunner.java:212) 
    at org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.executeLocalJobs(JobLauncherCommandLineRunner.java:231) 
    at org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.launchJobFromProperties(JobLauncherCommandLineRunner.java:123) 
    at org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.run(JobLauncherCommandLineRunner.java:117) 
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:732) 
    ... 16 more 
Caused by: com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-204, SQLSTATE=42704, SQLERRMC=TEST.BATCH_JOB_INSTANCE, DRIVER=4.18.60 
    at com.ibm.db2.jcc.am.kd.a(kd.java:747) 
    at com.ibm.db2.jcc.am.kd.a(kd.java:66) 
    at com.ibm.db2.jcc.am.kd.a(kd.java:135) 
    at com.ibm.db2.jcc.am.bp.c(bp.java:2788) 
    at com.ibm.db2.jcc.am.bp.d(bp.java:2776) 
    at com.ibm.db2.jcc.am.bp.a(bp.java:2209) 
    at com.ibm.db2.jcc.am.cp.a(cp.java:7886) 
    at com.ibm.db2.jcc.t4.bb.h(bb.java:141) 
    at com.ibm.db2.jcc.t4.bb.b(bb.java:41) 
    at com.ibm.db2.jcc.t4.p.a(p.java:32) 
    at com.ibm.db2.jcc.t4.vb.i(vb.java:145) 
    at com.ibm.db2.jcc.am.bp.kb(bp.java:2178) 
    at com.ibm.db2.jcc.am.cp.xc(cp.java:3686) 
    at com.ibm.db2.jcc.am.cp.b(cp.java:4493) 
    at com.ibm.db2.jcc.am.cp.kc(cp.java:767) 
    at com.ibm.db2.jcc.am.cp.executeQuery(cp.java:732) 
    at org.jboss.jca.adapters.jdbc.WrappedPreparedStatement.executeQuery(WrappedPreparedStatement.java:504) 
    at org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:692) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:633) 
    ... 38 more 

答えて

0

私自身の質問に答える。私は以下の設定を使用してメタデータテーブルを使用せずに春バッチを使用できます:

@Configuration 
public class SpringBatchInMemoryConfiguration { 

    @Bean 
    public ResourcelessTransactionManager transactionManager() { 
     return new ResourcelessTransactionManager(); 
    } 

    @Bean 
    public MapJobRepositoryFactoryBean mapJobRepositoryFactory(ResourcelessTransactionManager txManager) 
      throws Exception { 
     MapJobRepositoryFactoryBean factory = new MapJobRepositoryFactoryBean(txManager); 
     factory.afterPropertiesSet(); 
     return factory; 
    } 

    @Bean 
    public JobRepository jobRepository(MapJobRepositoryFactoryBean factory) throws Exception { 
     return factory.getObject(); 
    } 

    @Bean 
    public JobExplorer jobExplorer(MapJobRepositoryFactoryBean factory) { 
     return new SimpleJobExplorer(factory.getJobInstanceDao(), factory.getJobExecutionDao(), 
       factory.getStepExecutionDao(), factory.getExecutionContextDao()); 
    } 

    @Bean 
    public SimpleJobLauncher jobLauncher(JobRepository jobRepository) throws Exception { 
     SimpleJobLauncher launcher = new SimpleJobLauncher(); 
     launcher.setJobRepository(jobRepository); 
     launcher.afterPropertiesSet(); 
     return launcher; 
    } 
} 
関連する問題