java sprinng @Scheduled 定时器注解问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java sprinng @Scheduled 定时器注解问题相关的知识,希望对你有一定的参考价值。
业务:获取天气信息插入的数据库
第一次:查询当前数据库天气数据的最大日期
比最大日期大Update 最大日期无则Insert
问题是现在我debug测试
比如我刷新两次接口访问地址
正常是 :第一次最大日期无所以全部insert 第二次存在最大日期所有有Update操作
异常: 第一次没执行完毕 第二次也开始跑了 所以第二次的最大日期为空 所有 两次全部Insert 导致数据重复数和和刷新次数相等 。
想问怎样解决第一次没执行完毕 第二次不许访问 或者其他解决方案
<bean id="zntask" class="com.tjsoft.egoveva.bps.service.imp.TaskServiceImp">
<property name="taskdao">
<ref bean="taskDAO"/>
</property>
</bean>
如果是一个普通的类,不需要注入dao层
<bean id="zntask" class="com.soft.util.quartzTask"></bean>
上面的两个bean节点根据自己的情况任选一个,下面的bean节点都是需要的。
<!-- 每隔12小时 执行一次 -->
<bean id="ZntaskTopSaleJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="zntask"></property>
<property name="targetMethod" value="znrwdb"></property>
</bean>
<bean id="zntaskTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="ZntaskTopSaleJobDetail"/>
</property>
<property name="cronExpression">
<value>0 0 0,12 * * ?</value>
</property>
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="zntaskTrigger"/>
</list>
</property>
</bean>
时间的配置如下: <value>0 26 16 * * ?value>
时间大小由小到大排列,从秒开始,顺序为 秒,分,时,天,月,年 *为任意 ?为无限制。由此上面所配置的内容就是,在每天的16点26分启动znrwdb方法 参考技术A 定时任务bean定时器其中cron="0003112?"就是每年12月31日凌晨执行autoScheduled就是执行的方法
测试 Java Spring @Scheduled 功能 [重复]
【中文标题】测试 Java Spring @Scheduled 功能 [重复]【英文标题】:Testing Java Spring @Scheduled functionality [duplicate] 【发布时间】:2020-05-13 20:52:05 【问题描述】:我有如下的 cron 调度程序:
@Scheduled(cron = "0 0 1 * * *")
@SchedulerLock(name = "PT20M")
public void schedulerSubscriptionsUpdate()
我正在尝试测试此预定方法的全部功能 - 某种集成测试(包括方法执行的正确性 - 时间)。 你有什么建议我该怎么做?
【问题讨论】:
这能回答你的问题吗? How to test Spring @Scheduled baeldung.com/spring-testing-scheduled-annotation @nodlaw 你解决了吗? 【参考方案1】:您可以使用为此目的提供的 Awaility 库:
使用 maven 添加该库:
<dependency>
<groupId>org.awaitility</groupId>
<artifactId>awaitility</artifactId>
<version>3.1.6</version>
<scope>test</scope>
</dependency>
我们可以使用 Awaitility DSL 使我们的测试更具声明性,例如:
@SpringJUnitConfig(ScheduledConfig.class)
public class ScheduledAwaitilityIntegrationTest
@SpyBean
private Counter counter;
@Test
public void whenWaitOneSecond_thenScheduledIsCalledAtLeastTenTimes()
await()
.atMost(Duration.ONE_SECOND)
.untilAsserted(() -> verify(counter, atLeast(10)).scheduled());
来源 - baeldung.com/spring-testing-scheduled-annotation
【讨论】:
这是来自baeldung.com/spring-testing-scheduled-annotation的复制粘贴 @elmigue017 - 有时我们必须这样做,这很糟糕, @elmigue017 - 在答案中添加了来源以上是关于java sprinng @Scheduled 定时器注解问题的主要内容,如果未能解决你的问题,请参考以下文章
测试 Java Spring @Scheduled 功能 [重复]
java Spring Boot @Scheduled + Spring Security @PreAuthorize = RunAs