仅在一台服务器上运行批处理

时间:2016-08-10 16:31:12

标签: spring spring-boot distributed

我有一个Spring启动MVC和批处理应用程序。批处理和MVC共享DAO和服务层,因此它们位于同一个war文件中。它们被部署到4个云服务器中,并为UI应用程序配置了负载平衡和vip。所以MVC应用程序很好。

问题是作为批处理的一部分我将文件FTP传输到外部服务器,而外部服务器将处理后的文件FTP回来。处理后的文件仅返回4个服务器中的一个。所以我希望批处理只在1台服务器上运行。如何抑制批处理在其他服务器中执行。

2 个答案:

答案 0 :(得分:0)

这可能是众多方法中的一种,但实现方法是在属性文件中保留一个值并将其值设置为布尔值

现在只有在属性文件值为true时才处理批处理。

通过这种方式,您可以灵活地更改要处理批处理作业的服务器。

答案 1 :(得分:0)

当您的4个实例在4个不同的云服务器上运行时,解决方案变得更加容易。批处理的起点可以是文件轮询器。因此,如果文件被放入服务器1上的轮询目录中,则将调用服务器1上的批处理作业。其他实例无效,因为该服务器上没有丢弃文件。

您需要在spring批处理之前集成文件轮询器。这样的事情 - http://docs.spring.io/spring-batch/reference/html/springBatchIntegration.html

<int:channel id="inboundFileChannel"/>
<int:channel id="outboundJobRequestChannel"/>
<int:channel id="jobLaunchReplyChannel"/>

<int-file:inbound-channel-adapter id="filePoller"
channel="inboundFileChannel"
directory="file:/tmp/myfiles/"
filename-pattern="*.csv">
<int:poller fixed-rate="1000"/>
</int-file:inbound-channel-adapter>

<int:transformer input-channel="inboundFileChannel"
output-channel="outboundJobRequestChannel">.    <bean class="io.spring.sbi.FileMessageToJobRequest">
<property name="job" ref="personJob"/>
<property name="fileParameterName" value="input.file.name"/>
 </bean>
</int:transformer>

<batch-int:job-launching-gateway request-channel="outboundJobRequestChannel"
reply-channel="jobLaunchReplyChannel"/>