我们计划从spring-batch-admin迁移到spring-cloud-dataflow,因为批处理管理员将进入Spring Attic,生命结束日期为2017年12月31日 .
根据Migration Doc中的文档,“ In the Spring Batch use case, each batch job is packaged as an independent Spring Boot über jar that is registered with Spring Cloud Data Flow ”
在这种情况下,如果有50个批次作业,必须创建50个超级 jar ?这样做将是一场维护噩梦,创造许多 jar 并且难以维护它们 .
任何相同的解决方法?所以我们可以将所有批量作业打包在单个超级 jar 中,我们可以在需要时随机启动任何工作吗?
任何帮助将非常感谢,提前感谢
2 回答
TL;DR;
观看我关于将数据处理迁移到此处的微服务的讨论:https://www.youtube.com/watch?v=COzkPkHZMG8 . 如果在那之后你仍然觉得这是一件坏事,请跳到底部,我建议采用备用(不推荐)方法 .
Why this is a good thing
让我花一点时间来了解为什么我们认为这是一个更好的解决方案,为什么我会提出一个我不推荐的替代方案,但应该有效 .
Breaking up the monolith
如果您考虑大多数企业用于从开发人员的笔记本电脑向 生产环境 提供批处理功能的过程,通常是一个缓慢的过程,不经常发布 . 这个过程很慢,代码需要通过多个组(开发,一些来自外部QA,可能是某种形式的变更控制过程,最后是某种类型的操作团队来实际部署代码) . 通常,需要通过该过程的代码越小,越容易通过该过程 .
在此示例中,对于包含50个批处理作业的系统,要更改其中一个,您需要对所有作业执行该处理 . 打破这一点实际上简化了维护,因为您可以独立地更改和部署作业 . 开发人员只需要关注手头的批处理作业 .
Migrating to über jars
从包含所有作业的单个WAR文件移动的另一个优点是灵活性 . 您可以根据需要在任何基础架构上运行这些作业 . 想通过
java -jar foo.jar
命令在本地或裸机上运行它?去吧 . 想通过cf push
在CloudFoundry上运行它吗?你打赌 . 想要将应用程序停靠并在Kubernetes上运行吗?您可以!虽然你可以在不采用超级 jar 方法的情况下做同样的事情,但由于基础设施可能会从环境变为环境,因此更加细致入微 . 对于超级jar,您需要保证的只是java版本 .工件管理部分也是一个很好解决的问题 . 将überjars推送到Maven存储库是一个简单的过程,在java环境中经过了很好的审查 . 如何管理WAR文件确实不是 . 您可以将它们推送到Maven存储库,但这并不理想 . 通过转移到überjars,您的发布过程在所有作业(以及所有应用程序)中变得非常标准化 .
最后,搬到一个超级 jar 不应该那么难 . 它应该只是一个包装练习,假设您的工作定义明确 . 如果不是这样,这是一个很好的机会,可以进行一些 Health 的重组,使它们在一开始就更加模块化(良好的工程实践) .
The alternative approach
我想从这里开始说我不推荐这种方法 . 但是,它应该工作 .
而不是为每个工作创建一个超级 jar ,创建一个包含所有50个工作的超级 jar . 您需要创建自己的
CommandLineRunner
,查看环境变量以确定启动时要运行的作业,并关闭Spring Boot功能以在启动时自动执行作业 .从那里,您可以通过Spring Cloud Data Flow中的50个任务定义配置50个作业 . 每个传递环境变量指示要运行的作业 . 从那里,您将能够独立执行/监视/等50个工作中的每个工作,并仍然可以获得您的单片工件 .
添加到“替代方法”,您可以在执行单个单片50作业jar文件时提供一个选项,以执行您想要的确切作业 .