我的spring批处理应用程序运行在pcf平台上,该平台连接到mysql数据库(单个示例),当只有一个示例启动并运行时,它运行良好,但是当涉及到多个应用程序示例时,我得到了异常org.springframework.dao.duplicatekeyexception。这可能是因为类似的批处理作业同时启动&试图用相同的作业id更新批处理示例表。是否有任何方法限制这种失败,或者以另一种方式,我想要一个解决方案,即即使有多个示例在运行,一次也只运行一个批处理作业。
我的spring批处理应用程序运行在pcf平台上,该平台连接到mysql数据库(单个示例),当只有一个示例启动并运行时,它运行良好,但是当涉及到多个应用程序示例时,我得到了异常org.springframework.dao.duplicatekeyexception。这可能是因为类似的批处理作业同时启动&试图用相同的作业id更新批处理示例表。是否有任何方法限制这种失败,或者以另一种方式,我想要一个解决方案,即即使有多个示例在运行,一次也只运行一个批处理作业。
1条答案
按热度按时间ryevplcw1#
对我来说,这是个好兆头
DuplicateKeyException
被抛出。因为springbatch已经确保了同一个作业不会并行执行,所以它正好实现了您想要做的事情(i、 e.只有一个服务器示例成功执行作业,而另一个服务器示例没有成功执行作业)所以我看你的案子没什么坏处。如果您不喜欢此异常,可以捕获它并将其作为应用程序级异常重新抛出,例如“作业正在由其他服务器示例执行,请跳过以执行它”
如果您真的希望只有一个服务器示例会尝试触发以执行作业,而其他服务器不会同时尝试触发,那么这不是spring批处理的问题,而是如何确保在分布式环境中只有一个服务器节点触发请求的问题。如果批处理作业作为计划任务使用
@Scheduled
,您可以考虑使用分布式锁(如shedlock)来确保只在一个节点上同时最多执行一次。