文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Spring Cloud Task 一个允许短期运行的微服务组件

2024-12-02 02:01

关注

Spring Cloud Task使创建短期微服务变得容易。它提供了在生产环境中按需执行短期JVM进程的功能。

环境要求

你需要安装Java(Java 8或更高的版本)。要进行构建,还需要安装Maven。

数据库要求

Spring Cloud Task使用关系数据库存储已执行任务的结果。虽然你可以在没有数据库的情况下开始开发任务(任务的状态记录为任务存储库更新的一部分),但对于生产环境,你希望使用受支持的数据库。Spring Cloud Task 目前支持以下数据库:

依赖管理

<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-jpaartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-taskartifactId>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
dependency>

配置文件

server:
port: 8082
---
spring:
datasource:
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/tasks?serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true
username: root
password: root
type: com.zaxxer.hikari.HikariDataSource
hikari:
minimumIdle: 10
maximumPoolSize: 200
autoCommit: true
idleTimeout: 30000
poolName: MasterDatabookHikariCP
maxLifetime: 1800000
connectionTimeout: 30000
connectionTestQuery: SELECT 1
---
spring:
h2:
console:
enabled: true
settings:
web-allow-others: true
path: /h2
---
spring:
application:
name: taskDemo
---
logging:
level:
org.springframework.cloud.task: DEBUG

简单任务

@SpringBootApplication
@EnableTask
public class SpringCloudTaskDemoApplication {

@Bean
public CommandLineRunner helloRunner() {
return new CommandLineRunner() {
@Override
public void run(String... args) throws Exception {
System.out.println("开始执行任务") ;
TimeUnit.SECONDS.sleep(1) ;
System.out.println("任务执行完成") ;
}
};
}

public static void main(String[] args) {
SpringApplication.run(SpringCloudTaskDemoApplication.class, args);
}

}

注意这里需要@EnableTask开启功能,然后自定义了一个CommandLineRunner类型的Bean。我们的任务都应该在CommandLineRunner或者ApplicationRunner中执行。

执行

run方法执行完以后我们的JVM进程也跟着结束了。这就是所谓的短期任务了,我们不需要任务一直执行,只需要在需要的时候执行即可。

任务执行完以后会在数据表中记录相关的执行结果信息。

这些表记录了本次任务执行的相关信息,成功,失败等。

事件监听

我们任务的执行在每一个节点上都可以进行相关的监听处理

@Component
public class TaskListenerConfig {

@BeforeTask
public void before(TaskExecution taskExecution) {
System.out.println("任务执行前") ;
}

@AfterTask
public void after(TaskExecution taskExecution) {
System.out.println("任务执行后") ;
}

@FailedTask
public void fail(TaskExecution taskExecution, Throwable throwable) {
System.out.println("任务执行失败," + throwable.getMessage()) ;
}

}

以上是通过注解的方式实现,我们也可以通过实现TaskExecutionListener接口的方式实现。

@Component
public class DemoListener implements TaskExecutionListener {

@Override
public void onTaskStartup(TaskExecution taskExecution) {
}

@Override
public void onTaskEnd(TaskExecution taskExecution) {
}

@Override
public void onTaskFailed(TaskExecution taskExecution, Throwable throwable) {
}

}

任务监听发生异常

如果TaskExecutionListener事件处理程序引发异常,则该事件处理程序的所有侦听器处理都将停止。例如,如果已启动三个onTaskStartup侦听器,并且第一个onTaskStartup事件处理程序引发异常,则不会调用其他两个onTaskStartup方法。但是,会调用TaskExecutionListeners的其他事件处理程序(onTaskEnd和onTaskFailed)。因为执行这些回调方法都是在不同的阶段执行的,所以只会影响那个阶段的事件并不会影响其它阶段事件。

限制任务执行

如果你要控制每个任务只允许同时允许一个,那么我们可以通过如下方式控制:

添加依赖:

<dependency>
<groupId>org.springframework.integrationgroupId>
<artifactId>spring-integration-coreartifactId>
dependency>
<dependency>
<groupId>org.springframework.integrationgroupId>
<artifactId>spring-integration-jdbcartifactId>
dependency>

上面2个依赖是必须的,这是限制任务执行所需要的。

添加配置:

spring:
cloud:
task:
singleInstanceEnabled: true

开启单任务执行。

完毕!!

来源:今日头条内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯