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

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

一,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);
    }
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值