• spring的Task定时任务与事务


    目录

    SpringTask定时任务

    xml方式

    1,加载Sring核心依赖(pom.xml配置)

    2,添加配置文件,添加IOC扫描器

    3,定义定时任务

    4,加载定时器下xml配置

    6,现象证明

    注解方式

    定时方法

    xml配置

    现象

    Cron表达式

    Spring事务

    事务的四大特性(ACID)

    原子性(Atomicity)

    隔离性(lsolation  四个隔离级别)

    持久性(Durability)

    Spring的事务

    Spring事务的实现

    xml方式

    注解配置


    SpringTask定时任务

    在项目中开发定时任务应该一种比较常见的需求,在Java中开发定时任务主要有三种解决方案:一是使用JDK自带的Timer,二是使用第三方组件Quartz,三是使用Spring Task


    Timer是JDK自带的定时任务工具,其简单易用,但是对于复杂的定时规则无法满足,在实际项目开发中也很少使用到。

    Quartz功能强大,但是使用起来相对笨重。

    Spring Task则具备前两者的优点(功能强大且简单易用),使用起来很简单,除Spring相关的包外不需要额外的包,而且支持注解和配置文件两种形式。
     

    xml方式

    1,加载Sring核心依赖(pom.xml配置)

    1. org.springframework
    2. spring-context
    3. 4.3.16.RELEASE

    2,添加配置文件,添加IOC扫描器

    1. "1.0" encoding="UTF-8"?>
    2. "http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:context="http://www.springframework.org/schema/context"
    5. xsi:schemaLocation="http://www.springframework.org/schema/beans
    6. http://www.springframework.org/schema/beans/spring-beans.xsd
    7. http://www.springframework.org/schema/context
    8. http://www.springframework.org/schema/context/spring-context.xsd">
    9. package="com.lsf"/>

    3,定义定时任务

    1. package com.lsf.job;
    2. import org.springframework.stereotype.Component;
    3. import java.text.SimpleDateFormat;
    4. import java.util.Date;
    5. @Component //交给Ioc维护
    6. public class Taskjob {
    7. //定义定时任务
    8. public void job(){
    9. System.out.println("任务"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
    10. }
    11. }

    4,加载定时器下xml配置

    1. "1.0" encoding="UTF-8"?>
    2. "http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:context="http://www.springframework.org/schema/context"
    5. xmlns:task="http://www.springframework.org/schema/task"
    6. xsi:schemaLocation="http://www.springframework.org/schema/beans
    7. http://www.springframework.org/schema/beans/spring-beans.xsd
    8. http://www.springframework.org/schema/context
    9. http://www.springframework.org/schema/context/spring-context.xsd
    10. http://www.springframework.org/schema/task
    11. http://www.springframework.org/schema/task/spring-task.xsd">
    12. package="com.lsf.job"/>
    13. " method="job" cron="0/2 * * * * ?"/>

    6,现象证明

    1. package com.lsf;
    2. import org.springframework.beans.factory.BeanFactory;
    3. import org.springframework.context.support.ClassPathXmlApplicationContext;
    4. public class Starter {
    5. public static void main(String[] args) {
    6. BeanFactory factory = new ClassPathXmlApplicationContext("spring.xml");
    7. }
    8. }

    注解方式

    前面配置相同,区别说方法与xml配置

    定时方法

    1. package com.lsf.job;
    2. import org.springframework.scheduling.annotation.Scheduled;
    3. import org.springframework.stereotype.Component;
    4. import java.text.SimpleDateFormat;
    5. import java.util.Date;
    6. @Component //交给Ioc维护
    7. public class Taskjob {
    8. //定义定时任务 Scheduled 定时任务注解
    9. @Scheduled(cron="0/2 * * * * ?")
    10. public void job(){
    11. System.out.println("任务"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
    12. }
    13. }

    xml配置

    1. "1.0" encoding="UTF-8"?>
    2. "http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:context="http://www.springframework.org/schema/context"
    5. xmlns:task="http://www.springframework.org/schema/task"
    6. xsi:schemaLocation="http://www.springframework.org/schema/beans
    7. http://www.springframework.org/schema/beans/spring-beans.xsd
    8. http://www.springframework.org/schema/context
    9. http://www.springframework.org/schema/context/spring-context.xsd
    10. http://www.springframework.org/schema/task
    11. http://www.springframework.org/schema/task/spring-task.xsd">
    12. package="com.lsf.job"/>

    现象

    Cron表达式

    关于cronExpression表达式有至少6个(也可能是7个)由空格分隔的时间元素。从左至右,这些元素的定义如下(,表示间隔):

    1. 秒(0-59)
    2. 分钟(0-59)
    3. 小时(0-59)
    4. 月份中的日期(1-31)
    5. 月份(1-12或,JAN-DEC)
    6. 星期中的日期(1-7或 SUN-SAT)
    7. 年份(1970-2099)

    例如:
    0  0  18 , 14, 16   *   *  ?
    每天上午10点,下午2点和下午4点


    0  0,15,30,45  *  1-10  *  ?
    每月前1日天每隔15分钟


    30 0 0 1 1 ? 2012
    在2012年1月1日午夜过30秒时
     

    Spring事务

    事务的四大特性(ACID)

    Spring并不直接管理事务,而是提供了多种事务管理器,他们将事务管理的职责委托给Hibernate或者JTA等持久化机制所提供的相关平台框架的事务来实现。
     

    原子性(Atomicity)


    共生死,要么全部成功,要么全部失败!。一致性(Consistency)
    事务在执行前后,数据库中数据要保持一致性状态。(如转账的过程账户操作后数据必须保持一致)·

    隔离性(lsolation  四个隔离级别)

    事务与事务之间的执行应当是相互隔离互不影响的。(多个角色对统一记录进行操作必须保证没有任何干扰),当然没有影响是不可能的,为了让影响级别降到最低,通过隔离级别加以限制:

    1.READ_UNCOMMITTED(读未提交)
    隔离级别最低的一种事务级别。在这种隔离级别下,会引发脏读、不可重复读和幻读。

    2.READ_COMMITTED(读已提交)
    读到的都是别人提交后的值。这种隔离级别下,会引发不可重复读和幻读,但避免了脏读。

    3.REPEATABLE_READ(可重复读)
    这种隔离级别下,会引发幻读,但避免了脏读、不可重复读。

    4.SERIALIZABLE(串行化)
    最严格的隔离级别。在Serializable隔离级别下,所有事务按照次序依次执行。脏读、不可重复读、幻读都不会出现。

    持久性(Durability)

    提交完事务后,数据库中数据改变是永久的
     

    Spring的事务

    Spring事务管理器的接口是org.springframework.transaction.PlatformTransactionManager,通过这个接口,Spring 为各个平台如JDBC、Hibernate等都提供了对应的事务管理器,但是具体的实现就是各个平台自己的事情了

    1. public interface PlatformTransactionManager(){
    2. //由TransactionDefinition得到TransactionStatus对象
    3. TransactionStatus getTransaction(TransactionDefinition definition) throwsTransactionException ;
    4. //提交
    5. void commit(TransactionStatus status) throws TransactionException;
    6. //回滚
    7. void rollback (TransactionStatus status) throws TransactionException;
    8. }

    具体的事务管理机制对spring 来说是透明的,它并不关心那些,那些是对应各个平台需要关心的,所以Spring事务管理的一个优点就是为不同的事务API提供一致的编程模型,如 JTA、JDBC、Hibernate,JPA

    Spring事务的实现

    xml方式

            1,xml添加事务命名方式与aop名命方式

            事务

    1. xmlns:tx="http://www.springframework.org/schema/tx"
    2. http://www.springframework.org/schema/tx
    3. http://www.springframework.org/schema/tx/spring-tx.xsd

            apo

    1. xmlns:tx="http://www.springframework.org/schema/aop"
    2. http://www.springframework.org/schema/aop
    3. http://www.springframework.org/schema/tx/spring-aop.xsd

            2,开启aop自动代理

            3,配置事务管理器

    1. <--事务管理器定义-->
    2. "txManager" class="org.springframework . jdbc.datasource .DataSourceTransactionManager">
    3. "dataSource" ref="dataSource">
    4. < / bean>

            4,配置事务通知

    1. "txAdvice" transaction-manager="txManager ">
    2. "add*" propagation="REQUIRED”/>
    3. " propagation=" R4U RED"/>
    4. " read-only="true" />

            5,配置aop

            

    1. "execution(* com.xxxx.service ..* . *( . .) )" id="cut" />
    2. "txAdvice" pointcut-ref="cut"" />

    注解配置

            1,配置事务管理器

    1. < !--事务管理器定义-->
    2. "txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    3. "dataSource" ref="dataSource">
    4. < / bean>

            2,支持注解

    "txManager " />
    

            3,方法上加入事务注解

    1. @override
    2. @Transactional(propagation=Propagation . REQUIRED)
    3. public void saveUser (String userName , String userPwd ){
    4. User user1=new User( );
    5. user1.setUserName (userName ) ;
    6. user1.setUserPwd (userPwd ) ;
    7. userDao .saveUser(user1);userDao.delUserById(2);
    8. }

    备注:默认spring事务只在发生未被捕获的runtimeexcetpion时才回滚。
     

  • 相关阅读:
    HTML静态网页作业——澳门英文旅游网站设计与实现HTML+CSS+JavaScript
    花 200 元测试 1300 个实时数据同步任务
    用Java语言创建的Spring Boot项目中,如何传递数组呢??
    ARMv8函数传参中的bug!
    SQLite利用事务实现批量插入(提升效率)
    LeetCode-1710. 卡车上的最大单元数【自定义排序,贪心】
    性能测试,如何做压力测试?压力测试实施,避免背锅提升效率(二)
    DTU是什么,什么是工业4G DTU?
    如何写一篇提升自己的文章
    Python学习笔记-序列
  • 原文地址:https://blog.csdn.net/weixin_47514459/article/details/126857753