阿里3个小时手把手教你用zookeeper实现分布式锁( 三 )

折叠 web.xml

注意哦 :仔细查看上面的项目结构 创建相应的文件夹
这里也会出现爆红 , 后面会自己消失
xml
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"version="3.1"><servlet><servlet-name>springMVC</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring/spring.xml</param-value></init-param><load-on-startup>1</load-on-startup><async-supported>true</async-supported></servlet><servlet-mapping><servlet-name>springMVC</servlet-name><url-pattern>/</url-pattern></servlet-mapping></web-app>实体类
  • @Data 是lombok的注解
Product
java
/** * @author : look-word * 2022-07-17 10:12 **/@Datapublic class Product implements Serializable {private Integer id;private String product_name;private Integer stock;private Integer version;}Order
highlighter- php
/** * @author : look-word * 2022-07-17 10:12 **/@Datapublic class Order implements Serializable {private String id;private Integer pid;private Integer userid;}持久层ProductMapper
java
@Mapper@Componentpublic interface ProductMapper {// 查询商品(目的查库存)@Select("select * from product where id = #{id}")Product getProduct(@Param("id") int id);// 减库存@Update("update product set stock = stock-1 where id = #{id}")int reduceStock(@Param("id") int id);}OrderMapper
java
@Mapper@Componentpublic interface OrderMapper {// 生成订单@Insert("insert into `order` (id,pid,userid) values (#{id},#{pid},#{userid})")int insert(Order order);}serviceProductService
java
/** * @author : look-word * 2022-07-17 10:28 **/public interface ProductService {// 扣除库存void reduceStock(Integer id) throws Exception;}ProductServiceImpl
java
/** * @author : look-word * 2022-07-17 10:29 **/@Transactional@Servicepublic class ProductServiceImpl implements ProductService {@Resourceprivate ProductMapper productMapper;@Resourceprivate OrderMapper orderMapper;@Overridepublic void reduceStock(Integer id) throws Exception {// 查询商品库存Product product = productMapper.getProduct(id);if (product.getStock() <= 0) {throw new RuntimeException("库存不足");}// 减库存int i = productMapper.reduceStock(id);if (i == 1) {Order order = new Order();order.setId(UUID.randomUUID().toString());order.setUserid(1);order.setPid(id);Thread.sleep(500);orderMapper.insert(order);} else {throw new RuntimeException("扣除库存失败");}}}controllerjava
/** * @author : look-word * 2022-07-17 10:12 **/@RestControllerpublic class ProductAction {@Resourceprivate ProductService productService;@GetMapping("product/reduce/{id}")private Object reduce(@PathVariable Integer id) throws Exception {productService.reduceStock(id);return "ok";}}启动测试
  • 点击右侧的maven
还记得我们在pom.xml配置的tomcat的插件吗 , 我们配置的意思是打包(package)之后会自动运行
在执行打包命令之前 , 先执行clean命令
执行package命令
测试
  • 浏览器访问
highlighter- Go
http://localhost:8001/product/reduce/1
阿里3个小时手把手教你用zookeeper实现分布式锁


推荐阅读