标签:学成 Java String id public 任务 version xcTask day19
.5 定时发送任务
4.5.1 Dao
添加更新任务方法:
[AppleScript] 纯文本查看 复制代码
?
1
|
/ / 更新任务处理时间 @Modifying @Query ( "update XcTask t set t.updateTime = :updateTime where t.id = :id " ) public int updateTaskTime ( @Param ( value = "id" ) String id , @Param ( value = "updateTime" ) Date updateTime ) ;
|
4.5.2 Service
添加发送消息方法:
[AppleScript] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
/ * *
* / / 发送消息
* @param xcTask 任务对象
* @param ex 交换机 id
* @param routingKey
* / @Transactional public void publish ( XcTask xcTask , String ex , String routingKey ) {
/ / 查询任务
Optional < XcTask > taskOptional = xcTaskRepository.findById ( taskId ) ;
if ( taskOptional.isPresent ( ) ) {
XcTask xcTask = taskOptional. get ( ) ;
/ / String exchange , String routingKey , Object object
rabbitTemplate.convertAndSend ( ex , routingKey , xcTask ) ;
/ / 更新任务时间为当前时间
xcTask.setUpdateTime ( new Date ( ) ) ;
xcTaskRepository. save ( xcTask ) ;
} }
|
4.5.3 编写任务类
编写任务类,每分钟执行任务,启动订单工程,观察定时发送消息日志,观察rabbitMQ队列中是否有消息,代码 如下:
[AppleScript] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
package com.xuecheng.order.mq; @Component public class ChooseCourseTask { private static final Logger LOGGER = LoggerFactory.getLogger ( ChooseCourseTask. class ) ;
@Autowired
TaskService taskService;
/ / 每隔 1 分钟扫描消息表,向mq发送消息
@Scheduled ( fixedDelay = 60000 )
public void sendChoosecourseTask ( ) {
/ / 取出当前时间 1 分钟之前的时间
Calendar calendar = new GregorianCalendar ( ) ;
calendar.setTime ( new Date ( ) ) ;
calendar. add ( GregorianCalendar.MINUTE , ‐ 1 ) ;
Date time = calendar.getTime ( ) ;
List < XcTask > taskList = taskService.findTaskList ( time , 1000 ) ;
/ / 遍历任务列表
for ( XcTask xcTask : taskList ) {
/ / 发送选课消息
taskService.publish ( xcTask , xcTask.getMqExchange ( ) , xcTask.getMqRoutingkey ( ) ) ;
LOGGER.info ( "send choose course task id:{}" , taskId ) ;
}
} }
|
4.7 乐观锁取任务
考虑订单服务将来会集群部署,为了避免任务在1分钟内重复执行,这里使用乐观锁,实现思路如下:
1) 每次取任务时判断当前版本及任务id是否匹配,如果匹配则执行任务,如果不匹配则取消执行。
2) 如果当前版本和任务Id可以匹配到任务则更新当前版本加
1. 1、在Dao中增加校验当前版本及任务id的匹配方法
[AppleScript] 纯文本查看 复制代码
?
1
2
3
4
|
public interface XcTaskRepository extends JpaRepository < XcTask , String > { / / 使用乐观锁方式校验任务 id 和版本号是否匹配,匹配则版本号加 1
@Modifying
@Query ( "update XcTask t set t.version = :version+1 where t.id = :id and t.version = :version" ) public int updateTaskVersion ( @Param ( value = "id" ) String id , @Param ( value = "version" ) int version ) ;
...
|
2、在service中增加方法,使用乐观锁方法校验任务
[AppleScript] 纯文本查看 复制代码
?
1
2
3
|
@Transactional public int getTask ( String taskId , int version ) {
int i = xcTaskRepository.updateTaskVersion ( taskId , version ) ;
return i; }
|
3、执行任务类中修改
[AppleScript] 纯文本查看 复制代码
?
1
2
3
4
5
6
|
...
/ / 任务 id String taskId = xcTask.getId ( ) ;
/ / 版本号 Integer version = xcTask.getVersion ( ) ;
/ / 调用乐观锁方法校验任务是否可以执行 if ( taskService.getTask ( taskId , version ) > 0 ) { / / 发送选课消息 taskService.publish ( xcTask , xcTask.getMqExchange ( ) , xcTask.getMqRoutingkey ( ) ) ;
LOGGER.info ( "send choose course task id:{}" , taskId ) ;
} ...
|
标签:学成,Java,String,id,public,任务,version,xcTask,day19
来源: https://blog.csdn.net/czbkzmj/article/details/98848990
本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。