如何为每 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定时任务时间设置

如何为能量补充游戏编写计时器算法

@Scheduled(cron="") spring定时任务时间设置

本地通知 - 重复间隔/自定义时间不起作用