一个有趣的问题,没有通用的好解决方案:如何更改正在运行的 Spring 应用程序的配置?Spring Batch Admin 1.0.0.M3 最近发布,它具有一个配置上传功能,以特定方式解决了此问题。有人在最近在慕尼黑举行的 S2GForum 上要求此功能(如果您错过了,请在 伦敦 和 阿姆斯特丹 5 月份的活动中注册),我很高兴地告诉他它已经存在,所以也许它值得更多关注……
基本用例的屏幕截图
我们首先查看应用程序中的作业视图。它显示了一个作业列表,这些作业可以通过 Web 应用程序启动或监控。
现在计划是上传一个新的作业配置并查看此视图的变化。因此,我们从顶部导航中的“文件”菜单开始,然后单击“配置”。这将显示一个简单的表单以上传文件。如果我们指向 Spring XML 配置文件,则视图如下所示
我们按下“上传”按钮,配置将被上传和解析,并且上传的文件中的
作业实例将注册以启动:
您可以在作业注册表中看到一个新条目(“test-job”),它可以在进程内启动,因为应用程序引用了作业。(无法启动的作业是在进程外执行的,但使用相同的数据库作为其JobRepository,因此它们在 UI 中显示其执行情况。)
基本用例的变体
基本上传用例的一个常见变体是上传现有
作业配置的修改,而不是全新的配置。这很常见,因为人们经常需要调整运行时参数,尤其是在进行性能测试时。例如,我们可以更改其中一个的
commit-interval步骤在一个
作业以便在重复的项目处理期间将更多(或更少)的项目分组并在一个块中一起提交
步骤。这可能会影响性能,并且
作业可能由于更有效地使用事务资源而总体上运行得更快。我们可以通过从应用程序启动
作业并检查结果来直接测量和验证这一点(因为 Web 界面是面向资源的,这也可以使用基于
curl).
它是如何工作的?
此用例实现的秘诀在于
作业配置文件被解析成单独的 Spring
ApplicationContext实例,这些实例通过其文件名进行跟踪。执行环境(
JobLauncher、事务管理器、
DataSource等)由应用程序作为父上下文提供,并且
作业都存在于该环境的子上下文中。这意味着它们可以是易失性的,并且其生命周期可以由应用程序中的服务管理。相关服务碰巧是由 Spring Integration 激活的(我在
之前的帖子 中描述的方式),通过服务激活器包装一个
JobLoader,它是 Spring Batch 中的标准组件。
接下来是什么?
访问 Batch Admin 网站以获取更多信息并了解在哪里获取代码以进行操作。请记住即将在 伦敦 和 阿姆斯特丹 5 月份举行的 S2GForum 活动,届时 Spring Batch 和 Spring Integration 的负责人(Dave Syer 和 Mark Fisher)将在一个环节中讨论和演示该应用程序。