是哪段话激励着你不断向前摆脱逆境?
一,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);
}
}