IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 初始Seata(四) -> 正文阅读

[Java知识库]初始Seata(四)

目录

1.背景

2.账户服务

1)pom.xml

2)配置文件

3. 测试

1)正常场景

2)异常场景


1.背景

书接上回初始Seata(三),继续账户服务模块的代码。

2.账户服务

目录结构

  • java
    • com.seata.account
      • config
      • controller
      • dao
      • entity
      • service
  • resources
    • mapper(package)
    • application.yml
    • file.conf
    • registry.conf

1)pom.xml

这部分与上回中的服务是一样的,不再赘述。

2)配置文件

*** file.confregistry.conf与上文一致,在此不再赘述

*** application.yml

server:
  port: 8804
spring:
  application:
    name: seata-account
  cloud:
    alibaba:
     seata:
       tx-service-group: my_test_tx_group
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456
    url: jdbc:mysql://locahost:3306/seata_account?serverTimezone=GMT%2B8&characterEncoding=utf8
 
eureka:
  client:
    service-url:
      dafaultZone: http://localhost:8801/eureka/
  instance:
    hostname: localhost
    prefer-ip-address: true
logging:
  level:
    io:
      seata: info
mybatis:
  mapperLocations: classpath:mapper/*.xml

*** 启动类

@EnableDiscoveryClient(exclude = DataSourceAutoConfiguration.class)
@EnableEurekaClients
public class AccountAppMain8804
{
    public static void main(String[] args){
        SpringApplication.run(AccountAppMain8804.class, args);
    }
}

*** config

**** DataSourceProxyConfig.java

这个文件与前文相同,不再赘述

**** MyBatisConfig.java

@Configuration
@MapperScan({"com.seata.account.dao"})
public class MyBatisConfig{
}

*** entity

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Account {
    private Long id;
    private Long userId;
    private Integer total;
    private Integer used;
    private Integer balance;
}

*** controller

@RequestMapping("/account/")
public class AccountController {
    @Resource
    private AccountService accountService;
 
    @GetMapping("decrease")
    public String decrease(@RequestParam("userId") Long userId, @RequestParam("money") BigDecimal money){
        accountService.decrease(userId, money);
        return "账户余额扣减成功"
    }
}

*** service & serviceImpl

**** service

public interface AccountService {
    void decrease(Long userid, BigDecimal money);
}
@Service
public class AccountServiceImpl implements AccountService {
    @Resource
    private AccountDao accountDao;
 
    public void decrease(Long userId, BigDecimal money) {
        accountDao.decrease(userId, money);
    }
}

*** dao

@Mapper
public interface AccountDao {
    void decrease(@Param("userId") Long userId, @Param("money") BigDecimal money);
}

*** resources

**** mapper.AccountMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
<mapper namespace="com.seata.account.dao.AccountDao">
    <resultMap id="BaseResultMap" type="com.seata.account.entity.Account">
        <id column="id" property="id" jdbcType="BIGINT">
        <id column="user_id" property="userId" jdbcType="BIGINT">
        <id column="total" property="total" jdbcType="DECIMAL">
        <id column="used" property="used" jdbcType="DECIMAL">
        <id column="balance" property="balance" jdbcType="DECIMAL">
    </resultMap>
    <update id="decrease">
        update account
        set used = used + #{money}, residue = balance - #{money}
        where user_id=#{userId}
    </update>
</mapper>

3. 测试

1)正常场景

启动注册中心Eureka,然后分别启动三个业务服务。调用创建订单接口,库存和账户正常扣除,订单状态为已支付

2)异常场景

A. 启动注册中心Eureka,订单和库存服务

B. 在账户服务AccountServiceImpl中增加超时,然后启动账户服务

@Service
public class AccountServiceImpl implements AccountService {
    @Resource
    private AccountDao accountDao;
 
    public void decrease(Long userId, BigDecimal money) {
        try {
            TimeUnit.SECONDS.sleep(20);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        accountDao.decrease(userId, money);
    }
}

C.调用订单接口,由于账户服务的超时,该订单并未引起库存减少、账户余额减少、订单状态也是未支付状态。

补充:如果没有订单服务中@GlobalTransactional注册,各位看官可以试试看是怎样的结果。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-15 22:18:55  更:2022-03-15 22:21:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:49:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码