如何为每 30 分钟设置 @Scheduled 并使用参数调用 sa 方法?
Posted
技术标签:
【中文标题】如何为每 30 分钟设置 @Scheduled 并使用参数调用 sa 方法?【英文标题】:How to set @Scheduled for each 30 min and calling sa method with parameters? 【发布时间】:2019-11-20 02:22:54 【问题描述】:我有一个需要使用计划的情况。 这个调度会每 30 分钟执行一次这个方法,所以这个方法是
@Transactional
public void processEnable()
throws Exception
try
catch (Exception e)
logger.warn("[Enable] [STATUS] - ERROR ");
logger.warn("[Enable] [EXCEPTION] " + e.getMessage(), e);
throw e;
我想让这个方法执行 30 分钟
我正在这样做。
@Scheduled(cron = "0 0 1-2 * * *")
public void Enable()
try
Service.Enable();
catch (Exception e)
e.printStackTrace();
但问题是如何在这里获取参数,我是第一次,实际上,使用@Scheduled,我不知道它是如何工作的,也不知道如何从用户那里获取参数所以我可以得到这个方法每 30 分钟工作一次。
我不知道得到我想要的参数。
【问题讨论】:
那么,您想在收到这些参数后调用processEnableApp
方法,不是吗?另外,它会为 1 个用户还是多个用户完成?因为你只有 1 个调度器,我想。
是一个适用于多个用户的应用程序,可以拥有一个或多个应用程序,这就是为什么在这种情况下我需要参数来获取正确的应用程序
实际上,您可以将调度程序自动连接到您需要的类。将这些参数移动到processEnableApp
方法,并在需要时调用调度程序。但是,不确定在这种情况下是否会启动调度。
谢谢,我非常感谢您的 cmets @MensurQulami,但我的意思是,我仍然不明白如何获取参数,我习惯于从被调用的 API 中获取参数,对不起,但是还是不明白。
我的意思是我想要一个调度程序,因为我不想在页面上手动执行,在这种情况下,我可以添加一个额外的 API,例如,每次都调用它页面已重新加载,但我想使用调度程序
【参考方案1】:
在您的计划方法中:
-
您需要设置执行代码的用户才能满足 Spring 安全注释。所以使用系统用户:
SecurityContext securityContext= SecurityContextHolder.getContext();
securityContext.setAuthentication(auth);
-
在作业开始运行时获取所有经过身份验证的用户。见this answer
List<Object> principals = sessionRegistry.getAllPrincipals();
-
迭代上一步的Authentication对象列表并调用
processEnableApp
(将参数传递给方法)
【讨论】:
【参考方案2】:如果您希望在您的@Scheduled
方法中使用外部对象,您应该使用自动装配将它们注入DemoService
类,而不是将它们作为参数传递给@Scheduled
方法。
【讨论】:
【参考方案3】:你的 cron 表达式是错误的。你需要这个*/30 * * * *
【讨论】:
以上是关于如何为每 30 分钟设置 @Scheduled 并使用参数调用 sa 方法?的主要内容,如果未能解决你的问题,请参考以下文章
@Scheduled(cron="") spring定时任务时间设置