SpringTask任务调度和声明式事务配置

2023-09-18 01:12:37

是哪段话激励着你不断向前摆脱逆境?

一,SpringTask xml写法

SpringTask已经纳入到spring核心技术里面了,直接导入spring的上下文坐标就好了

 <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.29</version>
        </dependency>
    </dependencies>

测试代码 

package com.apesource.job;

import java.util.Date;

/**
 *
 * @version 1.0
 * @since 2023/9/16
 */
public class MyJob {

    public void  jobMethod1(){
        System.out.println("===>开启任务调度1"+new Date());
    }

    public void  jobMethod2(){
        System.out.println("===>开启任务调度2"+new Date());
    }
}

1.1cron表达式   

cron表达式:秒 分 时 日 月 星期 【年】年份可以忽略,默认是今年。

"?"===>占位符忽略不计  其实日月已经可以确定天数了,如果在加一个星期,可能会出错。
"/"===>递增至  3/6秒        3,9,15...秒
"-"===>范围 3-6时 

 ","===> 3,6,9 月

   <!--注入任务类-->
    <bean id="myjob" class="com.apesource.job.MyJob"></bean>

    <!--开启task任务调度配置-->

pool-size是调度池中初始化线程数量
    <task:scheduler id="poolTaskScheduler" pool-size="10"></task:scheduler>
    <task:scheduled-tasks scheduler="poolTaskScheduler">

scheduled-tasks:依托的是调度池中线程,所以scheduler属性需要绑定上面task:scheduler的id
        <!--任务-->

方法+任务:需要执行的方法
调度:执行方法的逻辑 调度体现在cron表达式上

        <task:scheduled ref="job" method="jobMethod1" cron="3/2 27 9 16 9 ?"/>
        <task:scheduled ref="job" method="jobMethod2" cron="3/2 27 9 16 9 ?"/>
    </task:scheduled-tasks>

1.2如何使用不同的task命名空间?

 xmlns="http://www.springframework.org/schema/beans"
       xmlns:task="http://www.springframework.org/schema/task"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/task
       http://www.springframework.org/schema/task/spring-task.xsd"

 二,SpringTask ann写法

@Component
public class MyJob {

    @Scheduled(cron = "* * * * * ?")
    public void  jobMethod1(){
        System.out.println("===>开启任务调度1"+new Date());
    }

    public void  jobMethod2(){
        System.out.println("===>开启任务调度2"+new Date());
    }
}

<context:component-scan base-package="com.apesource"></context:component-scan>
<!--注解驱动-->
<task:annotation-driven></task:annotation-driven>

三,事务管理xml版

事务管理在service层,声明式事务扔掉了通知,由spring去执行。

3.1PlatformTransactionManager


此接口是spring的事务管理器,它里面提供了我们常用的操作事务的方法,我们在开发中都是使用的PlatformTransactionManager实现类,其中根据dao层用到的技术,我们选择了使用Spring JDBC或iBatis进行持久化数据的DataSourceTransactionManager

3.2事务的定义信息对象 TransactionDefinition


String getName()                获取事务对象名称
int getlsolationLevel()         获取事务隔离级          ☆
int getPropagationBehavior()    获取事务传播行为        ☆
int getTimeout()                获取事务超时时间
boolean isReadOnly()            获取事务是否只读        

3.3事务的隔离级别

isolation:指定事务的隔离级别。默认值是使用数据库的默认隔离级别。

3.4事务的传播行为(七种)

并行事务发生时,如何做。propagation:指定事务的传播行为。 

在xml中的配置 

  xmlns:tx="http://www.springframework.org/schema/tx"

    <!-- 配置一个事务管理器 -->
    <bean id="tm" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 注入DataSource -->
        <property name="dataSource" ref="data"></property>
    </bean>绑定数据源

    <!-- 事务的配置 -->给事务管理器配置属性
    <tx:advice id="txAdvice" transaction-manager="tm">
        <tx:attributes>属性 (属性针对方法实现)(隔离级别和传播行为)
            <tx:method name="*" read-only="false" propagation="REQUIRED" isolation="DEFAULT"/>所有方法,至于是哪一个包下的,就要看aop指定的哪一个包
            <tx:method name="find*" read-only="true" propagation="SUPPORTS" isolation="DEFAULT"/>
        </tx:attributes>
    </tx:advice>


    <!-- 配置aop -->
    <aop:config>
        <!-- 配置切入点表达式 -->
        <aop:pointcut expression="execution(* com.apesource.service.*.*(..))" id="pt1"/>
        <!-- 在aop:config标签内部:建立事务的通知和切入点表达式的关系 -->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pt1"/>
    </aop:config>

四,事务管理注解版

<!-- 配置一个事务管理器 -->
    <bean id="transactionManager"      class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 注入DataSource -->
        <property name="dataSource" ref="data"></property>
    </bean>


    <!-- 开启spring对注解事务的支持 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

4.1@Transactional


该注解的属性和xml中的属性含义一致。该注解可以出现在接口上,类上和方法上。
出现接口上,表示该接口的所有实现类都有事务支持。
出现在类上,表示类中所有方法有事务支持
出现在方法上,表示方法有事务支持。
以上三个位置的优先级:方法>类>接口 


@Service
@Transactional(readOnly=false,propagation= Propagation.SUPPORTS,isolation = Isolation.DEFAULT)
public class AccountServiceImp implements IAccountService {
 @Override
    @Transactional(readOnly=false,propagation=Propagation.REQUIRED)
    public void transfer(String sourceName, String targetName, int money) {
               //2.1查询转账人与被转账人的信息
               Account sourceAccount = dao.findAccountByName(sourceName);
               Account targetAccount = dao.findAccountByName(targetName);
               //2.2开始转账
               sourceAccount.setAmoney(sourceAccount.getAmoney()-money);
               targetAccount.setAmoney(targetAccount.getAmoney()+money);
               //2.3修改数据库
               dao.updateAccountById(sourceAccount);
               //模拟转账事故
               int a = 10/0;
               dao.updateAccountById(targetAccount);
    }
}

 

 

 

更多推荐

QCA组态如何科学命名?

前言(一)文献来源文献来源:[1]FurnariS,CrillyD,MisangyiVF,etal.Capturingcausalcomplexity:Heuristicsforconfigurationaltheorizing[J].AcademyofManagementReview,2021,46(4):778-7

Linux下的系统编程——线程同步(十三)

前言:在多线程编程中,如果多个线程同时访问和修改共享资源,可能会产生竞争条件和数据不一致的问题。同步机制用于协调线程之间的访问和操作,确保数据的正确性和一致性。为了避免多个线程同时访问和操作共享资源导致的问题,可以使用互斥锁(mutex)来实现线程的互斥访问。互斥锁可以保证同一时间只有一个线程访问共享资源、条件变量用于

读书笔记:多Transformer的双向编码器表示法(Bert)-2

多Transformer的双向编码器表示法BidirectionalEncoderRepresentationsfromTransformers,即Bert;第2章了解Bert模型(掩码语言模型构建和下句预测)文本嵌入模型Bert,在许多自然语言处理任务上表现优秀,本节主要包括:了解Bert,及与其他嵌入模型的区别;分

Packet Tracer中交换机的配置及Lab2实验

交换机是计算机网络中的一种网络设备,用于在局域网内传输和转发数据包。它具有数据包转发、数据包过滤、VLAN划分和端口管理等功能,能够实现高速、可靠和安全的数据传输,并支持网络的管理和控制。交换机在网络中发挥着连接终端设备和实现数据交换的重要作用。交换机的基本配置模式:模式提示符作用用户模式>只允许用户访问有限量的基本监

【Python基础】S01E03 元组

P01S03元组定义元组元组无法修改定义一个元素的元素修改元组变量方案一:关联新元组方案二:转换为列表列表是可修改的,对于处理网站的用户列表或游戏中的角色列表至关重要。然而我们有时候需要创建一系列不可修改的元素,元组可以满足这种需求。Python中,元组是不可修改的列表,名(tuple);定义元组元组看起来很像列表,但

c++ this指针与空指针调用类方法以及常函数

一、this指针说明1、c++的成员变量与成员内函数是分开存储2、每一个非静态成员函数只会诞生一份函数实例,多个同类型的队形公用的是同一份成员函数的代码3、this指向调用这一份成员函数代码的对象实例4、this是一个隐藏的指向对象实例的一个指针,无需定义直接使用即可作用1、可以区别形参与成员变量(当成员函数的形参与类

CentOS7平台命令安装Anaconda3、配置Python3开发环境

要在CentOS7上安装Anaconda3,您可以按照以下步骤进行操作:1.下载Anaconda3安装包:首先,访问Anaconda官方网站以获取最新版本的Anaconda3安装包的下载链接。可以使用wget命令来下载安装包。请确保选择适用于CentOS7的版本。wgethttps://repo.anaconda.co

1.centos7安装docker

本文目录:1.docker安装1.安装步骤2.安装是否成功校验3.docker加速配置4.helloworld来袭,验证安装是否ok2.卸载docker3.卸载较旧版本docker使用docker必备的三个官方网站:docker官网:https://www.docker.comdocker官方仓库:https://hu

SpringBoot文件上传-阿里云OSS

1.打开阿里云说明:登录阿里云账号2.点击AccessKey管理3.创建AccessKey说明:记得复制accessKeyId,accessKeySecret并保存起来4.点击对象存储OSS5.创建Bucket说明:创建储存桶6.查看SDK示例7.Java简单上传8.上传文件流说明:以上传图片为例9.copy代码说明:

自动化测试(五):自动化测试框架的搭建和基于yaml热加载的测试用例的设计

该部分是对自动化测试专栏前四篇的一个补充,本次参考以下文章实现一个完整的谷歌翻译接口自动化测试:[1]【python小脚本】Yaml配置文件动态加载[2]【python做接口测试的学习记录day8——pytest自动化测试框架之热加载和断言封装】目标:框架封装完成后,不需要写python脚本,只需要增加yaml测试用例

LuatOS-SOC接口文档(air780E)--adc - 数模转换

常量常量类型解释adc.ADC_RANGE_3_6numberair105的ADC分压电阻开启,范围0~3.76Vadc.ADC_RANGE_1_8numberair105的ADC分压电阻关闭,范围0~1.88Vadc.ADC_RANGE_3_8numberair780E开启ADC0,1分压电阻,范围0~3.8Vadc

热文推荐