java处理混合数据_Spring Batch:转换为多线程时的问题(混合数据)

也许这是一个反复出现的问题,但我需要根据我的上下文进行一些自定义 .

我正在使用Spring Batch 3.0.1.RELEASE

我有一些简单的工作,有一些步骤 . 一步是像这样的块:

Reader :JdbcCursorItemReader

Processor :CompositeProcessor与我的代表

Writer :CompositeWriter与我的代表

通过这种配置,我的工作完美无缺 .

现在,我想将其转换为多线程作业 . 在documentation to basic multi-thread jobs之后,我在tasklet中包含了一个SympleAsyncTaskExecutor,但它失败了 .

我已经readed JdbcCursorItemReader与多线程执行无法正常工作(是不是?) . 我已经将读者更改为JdbcPagingItemReader,这已成为一场噩梦:作业不会失败,编写过程没问题,但数据在线程之间混合,客户数据不正确且连贯(客户有服务,添加,来自其他人) .

那么,为什么会这样呢?我怎样才能更改为多线程作业?

复合处理器和编写器是否适用于多线程?

如何制作自定义线程安全的复合处理器?

也许它可能是JDBC读者:对于多线程,是否有任何线程安全的JDBC读取器?

我非常关心和困惑,所以任何帮助都会非常感激 . 非常感谢 .

[EDIT - SOLVED]

好吧,我的问题的正确和合适的解决方案是从开始设计多线程和线程安全执行的作业 . 习惯性地首先使用单线程步执行来理解和了解Spring Batch概念;但如果你认为你要离开这个阶段,那么必须提出诸如不可变对象,线程安全列表, Map 等的考虑因素 .

目前我的问题的当前状态是我后面描述的下一个 . 在测试了马丁的建议并考虑到迈克尔的指导方针之后,我终于解决了我的问题 . 接下来的步骤不是很好的做法,但我无法从开始重建我的工作:

将itemState更改为JdbcPagingItemReader,并将setState更改为false .

通过CopyOnWriteArrayList更改列表 .

通过ConcurrentHashMap更改HashMap .

在每个委托处理器中,通过传递上下文(实现ApplicationContextAware)并获取bean的唯一实例(将每个注入的bean配置为scope = "prototype"),获取每个bean属性的新实例(幸运的是,只有一个注入的bean) .

所以,如果委托的bean是:

改成:

并且,在MyProcessor中,从上下文获取otherBeanID的单个实例;必须使用scope = "protoype"配置otherBeanID .

正如我之前所说,它们并不是好的风格,但它是我最好的选择,我可以断言每个线程都有自己的不同的项目实例和其他bean实例 .

它证明某些类没有很好地设计用于正确的多线程执行 .

马丁,迈克尔,感谢您的支持 .

我希望它对任何人都有帮助 .

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值