我在两个tomcat实例的前面都有一个nginx负载均衡器,每个实例包含一个spring boot应用程序。每个spring
boot应用程序执行一个批处理,该批处理将数据写入数据库。该批处理每天凌晨1点执行。问题是两个实例同时执行我不想要的批处理。
有没有一种方法可以将批处理部署在两个实例中,并告诉tomcat或nginx在主服务器中启动该批处理(而从属服务器不运行该批处理)。
如果其中一台服务器停止,则第二台服务器可以代表他启动批处理。
Nginx或tomcat(或某些其他技术)中是否有工具可以做到这一点?
先感谢您。
这是一种简单的设计方法。
由于在同时触发的2个VM中有两个计划的方法,因此请为这两个VM添加一个随机延迟。这个答案有许多关于如何将触发延迟随机时间的选择。
在该方法内部,仅在尚未启动(由另一个VM)启动该作业时,才运行该作业。可以使用新表来跟踪此操作。
这是此设计的伪代码:
@Scheduled(cron = "schedule expression")
public void batchUpdateMethod() {
//Check database for signs of job running now.
if (job is not running){
//update database table to indicate job is running
//Run the batch job
//update database table to indicate job is finished
}
}
由于两个VM彼此独立,因此应该将数据库或某个公共文件位置用作锁定,以在两次运行之间进行同步。
对于更健壮的设计,请考虑使用Spring Batch Spring
Batch将数据库用于其作业(JobsRepository)。默认情况下,内存数据源用于跟踪正在运行的作业及其状态。在您的设置中,这两个实例(很可能)正在使用它们自己的内存数据库。如果共享JobsRepository数据库,Spring
Batch的多个实例可以作为一个群集彼此协调,一个实例可以运行作业,而另一个actasa备份可以运行。为此,您需要配置2个实例以使用公共数据源。
以下是一些文档:https :
//docs.spring.io/spring-batch/docs/current/reference/html/index-
single.html#jobrepository
https://docs.spring.io/spring-
batch/docs/current/reference/html/job.html#configuringJobRepository
我在两个tomcat实例前面有一个nginx负载平衡器,每个实例都包含一个Spring引导应用程序。每个Spring引导应用程序执行一个在数据库中写入数据的批处理。批处理每天凌晨1点执行。问题是两个实例同时执行批处理,这是我不想要的。 有没有办法让批处理部署在两个实例中,并告诉tomcat或nginx在主服务器中启动批处理(而从服务器不运行批处理)。 如果其中一个服务器停止,第二个服务器可以代表他
我有一个Spring批处理作业,它可能在多个服务器上运行。我有一个监听器,可以防止作业的多个实例在一台服务器上同时运行。但是,我要确保该作业不能同时在多台服务器上运行。 我已经找遍了,但没有找到解决这个问题的办法
我有一个队列通道和一个带有轮询器的服务激活器,轮询器从该队列中读取数据。我希望配置为“我希望50个线程轮询该队列,每次轮询并返回消息时,在此线程上调用服务激活器指向的服务。” 该服务没有异步注释,但无状态,可以以并发方式安全运行。 下面的方法能做到吗?有没有其他首选的方法来实现这一点?
带有服务工作者的网站,托管https://121eddie.github.io/并在Chrome 66.0中运行。3359.181 /索引。html在每次加载时正确跟踪以下注册 }); 第一次运行时,/serviceWorker。js执行“激活”事件,正确获取缓存名称并缓存文件 在第二次运行时,不会触发“激活”(没有日志跟踪,没有获取)。 在第三次运行中,甚至不再触发“抓取”。这意味着脱机请求不被
我有一个Web服务,每个版本将有多个版本和多个类。我想在启动时动态创建服务激活器,这样我就可以减少配置量,从而更容易维护。开发人员可以放入一个新类,SI会自动拾取它。 我编码了一个Application Listener: 稍后在路由器中,我有以下代码: 但当路由器尝试路由时,我会出现以下错误: 我该怎么做?我需要动态创建服务激活器,并在以后将消息路由到这些激活器。 没有办法在ServiceAct
是否有一种方法可以丢弃使用Spring Integration DSL方法定义的Spring Integration Service Activator中的消息? 更具体地说,假设下面的IntegrationFlow定义... 我发现,从返回似乎可以有效地结束流,但我不确定这是否是最优雅/正确的解决方案。如果这是推荐的解决方案,那很好。
我想在Docker容器中启动两个不同的服务,并在其中一个退出后立即退出容器。我查看了supervisor,但找不到如何让它在一个托管应用程序退出后立即退出。它试图重启它们多达三次,就像标准设置一样,然后什么也不做。主管是否能够做到这一点,或者是否有其他工具可以做到这一点?如果还有一种方法可以让两个托管程序都写入到stdout,并标记它们的应用程序名,则会有好处,例如:
我在一个简单的POJO中配置了一个服务激活器,我想将其转换为Java DSL。 现在,我的Java DSL如下所示, 有一个带有服务激活器的POJO, 在XML中,相应的配置如下所示, 如何在Java DSL中调用ServiceActivator方法?我正在考虑使用,但参数应该是什么 在使用Java DSL时,是否有空通道的概念?如果是,我们如何指定