春天和预定/重复的任务

时间:2015-02-17 19:47:16

标签: spring rest schedule timertask

我正在使用Spring并创建了一个Web应用程序。在我的网络应用程序中,我有一个休息服务。我有一个名为process的rest方法,它接收用户的详细信息(来自角度ui)并将用户详细信息保存到数据库(SQLite)

基本上我想做的是当用户发起休息呼叫时。我想开始一个单独的线程(只有哪一个存在)。此线程将轮询数据库中的某些值,如果找到某些值,则向管理员发送电子邮件。我需要这个类是线程安全的。见下文。我是否正确使用这样的东西?我需要@Async注释吗?或者我应该使用TimerTask吗?

@EnableScheduling
public class DBPoller {

    @Scheduled(fixedRate = 5000)
    public void checkDatabase() {
        //checks the db for certain values
    }
}

2 个答案:

答案 0 :(得分:2)

你必须写

@EnableScheduling

在应用程序的主类中 并且DBPoller类必须是Spring Framework的组件。

所以你必须将Annotation @Component(或@Service)添加到DBPoller类的头部

答案 1 :(得分:-1)

听起来你确实想要使用@Async注释。 @Scheduled无法真正达到你想要达到的效果。如果您尝试以固定的时间间隔而不是用户请求运行此检查/电子邮件方案,@Scheduled将起作用。幸运的是两者的配置都是一样的。

<task:annotation-driven scheduler="scheduler"
    executor="asyncMethodTaskExecutor" />

<task:scheduler id="scheduler" pool-size="x" />

<bean id="asyncMethodTaskExecutor"
    class="org.springframework.scheduling.quartz.SimpleThreadPoolTaskExecutor">
    <property name="threadCount" value="y"/>
    <property name="threadNamePrefix" value="AsyncMethodWorkerThread"/>
</bean>

如果您有@EnableScheduling注释,则不需要定义<task:scheduler id="scheduler" pool-size="x" />,但我个人更喜欢XML配置,因为如果您想更改线程池大小,您只需要编辑XML值并重新启动应用程序,而不是重新编译和重新部署整个事物。

确保将xy更改为合适的值。这取决于您的系统可能有多少并发用户。

您还需要确保您的类可以被Spring上下文发现,并且此方法正在实现一个接口,以便Spring可以生成它的代理以实际异步调用,如下例所示

public interface AsyncService {
    public void checkDatabase();
}

@Service
public class AsyncServiceImpl implements AsyncService {
    @Override
    @Async
    public void checkDatabase(){
        //Do your database check here.
    }
}

您还需要确保Spring可以找到您的服务所在的软件包,仔细检查您的<context:component-scan>值。

快乐的异步执行。