当前位置: 首页 > 面试题库 >

Spring

窦哲彦
2023-03-14
问题内容

我有一个使用“ task:scheduler”和“ task:scheduled-tasks”元素的应用程序(后者包含“ task:scheduled”元素)。一切都很好。

我正在尝试编写一些对“应用程序配置”进行内省的代码,以简要了解一些重要信息,例如计划了哪些任务以及它们的计划是什么。

我已经有一个包含一堆“ @Autowired”实例变量的类,因此我可以遍历所有这些。添加一个“列表”以获取所有TaskScheduler对象非常容易。我只有两个,而且每个任务都有一组不同的计划任务。

我在那些TaskScheduler对象(它们实际上是ThreadPoolTask​​Scheduler对象)中看不到的东西看起来像是计划任务的列表,因此我猜测计划任务的列表记录在其他地方。

我可以使用哪些对象来检查计划任务集,它们位于哪个线程池中?


问题答案:

此功能将在Spring 4.2中提供

https://jira.spring.io/browse/SPR-12748(免责声明:我报告了此问题,并为解决该问题提供了代码)。

// Warning there may be more than one ScheduledTaskRegistrar in your
// application context. If this is the case you can autowire a list of 
// ScheduledTaskRegistrar instead.
@Autowired   
private ScheduledTaskRegistrar scheduledTaskRegistrar; 

public List<Task> getScheduledTasks() {
    List<Task> result = new ArrayList<Task>();
    result.addAll(this.scheduledTaskRegistrar.getTriggerTaskList());
    result.addAll(this.scheduledTaskRegistrar.getCronTaskList());
    result.addAll(this.scheduledTaskRegistrar.getFixedRateTaskList());
    result.addAll(this.scheduledTaskRegistrar.getFixedDelayTaskList());
    return result;
}

// You can this inspect the tasks, 
// so for example a cron task can be inspected like this:

public List<CronTask> getScheduledCronTasks() {
    List<CronTask> cronTaskList = this.scheduledTaskRegistrar.getCronTaskList();
    for (CronTask cronTask : cronTaskList) {
        System.out.println(cronTask.getExpression);
    }
    return cronTaskList;
}

如果您使用的是XML中定义的ScheduledMethodRunnable:

<task:scheduled method="run" cron="0 0 12 * * ?" ref="MyObject" />

您可以访问基础目标对象:

 ScheduledMethodRunnable scheduledMethodRunnable = (ScheduledMethodRunnable) task.getRunnable();
 TargetClass target = (TargetClass) scheduledMethodRunnable.getTarget();


 类似资料:
  • 问题内容: 我正在创建一些轻松的Web服务,并使用Spring-Boot创建嵌入式的tomcat容器。 要求之一就是要实现2路SSL。我一直在看HttpSecurity对象,可以使用以下方法使它仅通过SSL通道运行Web服务: 我似乎找不到一种使Web服务仅对提供有效客户端证书的应用程序可访问的方法。 我只有SSL的基本知识,因此即使是正确方向的通用指针也将不胜感激。 部署到该服务器上的服务器将具

  • 问题内容: 我在Spring领域还很陌生,我开发了一个简单的项目,该项目使用Spring 3.2.1和Hibernate 4.1.9来实现DAO。该项目可以正常工作,但是我对在此DAO的CRUD方法上使用 @Transactional Spring批注有一些疑问。 这是实现我的项目的CRUD操作的类的完整代码: 好的,正如您所看到的,使用@Transactional注释对某些方法进行了注释。 我在

  • 问题内容: 我正在使用最新的spring-data- mongodb(1.1.0.M2)和最新的Mongo驱动程序(2.9.0-RC1)。我遇到这样的情况,我有多个客户端连接到我的应用程序,并且我想在同一台Mongo服务器中为每个客户端提供自己的“模式/数据库”。如果我直接使用驱动程序,这并不是一件很难的事情: 看,容易。但是spring-data- mongodb不允许使用简单的方法来使用多个数

  • 问题内容: 一个在方法-annotated类不被异步调用-它阻塞线程。 我已经进入配置,对方法的调用来自类外部,因此应该点击代理。当我单步执行代码时,确实会碰到代理,但似乎没有在与在任务执行器中运行相关的任何类附近的任何地方。 我已经设置了断点,但是它们从未被击中。我已经调试过,可以看到建议得到应用。 该服务被定义为接口(该接口的方法带有适当的注释),实现的方法也带有注释。都没有标记。 任何想法可

  • 问题内容: 我到处都读到有关Spring如何鼓励您在代码中使用接口的信息。我没看到 您的spring xml配置中没有接口的概念。Spring的哪一部分实际上鼓励您使用接口(而不是文档)? 问题答案: 为类定义接口时,它有助于进行依赖项注入。您的Spring配置文件本身不包含任何有关接口的信息-您只需输入类的名称即可。 但是,如果您要注入另一个提供“等效”功能的类,则使用接口确实会有所帮助。 例如

  • 问题内容: 我想看看在Spring中使用一个DataSources但能够从Java代码中切换数据库的最佳方法是什么?以下是我的两个数据源,它们分别位于相同的数据库服务器但位于不同的数据库中。 我将它们绑定到各自的bean,但是我正在查看我的旧代码,用2个单独的bean来实现它非常尴尬。是否在需要时如何使用一个数据源和切换数据库方面有什么想法/想法? 问题答案: 您可以通过扩展Sp​​ring 并在

  • 问题内容: 如果我有一个下面定义的Java类,则通过依赖项注入将其插入我的Web应用程序中: 我担心线程安全。Spring框架是否不能处理一个请求正在从列表中读取而当前正在被另一个请求更新的情况?我以前在其他应用程序中使用过读/写锁,但是我之前从未考虑过这种情况。 我打算将bean作为单例使用,以便减少数据库负载。 顺便说一下,这是以下问题的跟进: Java内存存储以减少数据库负载-安全吗? 编辑

  • 问题内容: 我使用的是Spring 4,我注意到了一个奇怪的行为……如果我从普通实例方法多次调用异步方法,那么它们都将在不同的线程中调用,并在随机时间完成。但是,如果我多次从另一个异步方法中调用一个异步方法,那么它们将按顺序完成。我有这样的事情: 我正在使用默认的异步执行器。我应该换一个吗?但是,该执行程序不会重用任何线程,而是每次都启动另一个线程,因此应该没问题……这仅仅是巧合吗?但是我尝试了十