引入依赖 <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-core</artifactId> <version>1.8.7</version> </dependency> 基本用法 try(Entryentry=SphU.entry("HelloWorld")){ //被保护的逻辑 System.out.println("helloworld"); }catch(BlockExceptionex){ //处理被...

  orz5ZuqqSReN   2024年02月20日   55   0   0 Java

有这样一段业务逻辑,首先保存业务数据,然后发送报文,最后确认报文回来以后更新业务数据。伪代码大概是这样的: / 保存数据,并调用发送报文方法 / publicvoidsave(){ //0.保存数据 //调用send()方法 send(); } / 发送报文 / publicvoidsend(){ //1.发送报文(调用Dubbo服务) //2.更新数据状态 } / 回调 / publicvoidcallback(){ //3.收到确认报文 //4.查询业务数据,并更新数据状态 } 然而,出问题了。。。 在回调方法中,根据业务单号查询业务单数据时查不到。这刚插入的数据,怎么就查不到呢?...

  orz5ZuqqSReN   2024年02月19日   135   0   0 Java

1. 基础知识回顾 1、索引的有序性,索引本身就是有序的 2、InnoDB中间隙锁的唯一目的是防止其他事务插入间隙。间隙锁可以共存。一个事务取得的间隙锁并不会阻止另一个事务取得同一间隙上的间隙锁。共享和独占间隔锁之间没有区别。它们彼此之间不冲突,并且执行相同的功能。 3、MySQL默认隔离级别是REPEATABLE-READ 4、加锁的对象是索引,加锁的基本单位是next-key锁,而行锁和间隙锁,是由next-key锁退化而来的 5、记录锁,锁的是索引,而非数据本身 6、间隙锁是开区间,next-key锁是前开后闭区间 7、意向锁是表级锁,它相当于一个标志,可以用来提高加锁的效...

  orz5ZuqqSReN   2023年12月22日   75   0   0 MySQL

1. PerformanceSchemaLockTables MySQL安装以后,我们会看到有这么两个数据库:information_schema和performance_schema,它们对于排查问题是非常有用的。 PerformanceSchema是一种存储引擎,默认情况下,它是启用的。 performance_schema数据库的名称是小写的,其中的表的名称也是小写的。查询应该用小写字母指定名称。 SHOWVARIABLESLIKE'performance_schema'; SHOWENGINES; USEperformance_schema; SHOWTABLES; ...

  orz5ZuqqSReN   2023年12月13日   30   0   0 MySQL

现象描述:SpringBoot项目,启动的时候卡住了,一直卡在那里不动,没有报错,也没有日志输出 但是,奇怪的是,本地可以正常启动 好吧,姑且先不深究为什么本地可以启动而部署到服务器上就无法启动的问题,这个不是重点,重点是怎么让它启动起来。(PS:我猜测可能是环境不同造成的,包括操作系统不同和JDK版本不同) 遇到这种情况,我先用jstack查看堆栈情况,果然发现了死锁 拿到jstack的完整信息,然后仔细排查,看不懂的话也可以借助工具 分析了每个被阻塞的线程之后,发现main线程和timeoutChecker_1_1互相等待对方持有的锁,从而形成了死锁 可以通过jconsole和j...

  orz5ZuqqSReN   2023年12月07日   36   0   0 Java

如图所示,项目中定义了这样几个模块: pdd-workflow-build:定义项目版本,及全局配置 pdd-workflow-dependencies:外部依赖管理,统一管理所有用到的外部依赖的版本 pdd-workflow-service:项目service模块 pdd-workflow-web:项目web模块 pdd-parent:聚合模块 模块之间的继承依赖关系如下图所示: 网上都说用${revision}这样的占位符,而且必须叫“revision”这个名字。但是,我自己实践过后发现,这个变量叫什么都可以(比如:common.version),关键在于要有一个聚合模块将所有引用...

  orz5ZuqqSReN   2023年12月06日   33   0   0 Java

工作中,经常遇到需要重试的场景,最简单的方式可以用try...catch...加while循环来实现。那么,有没有统一的、优雅一点儿的处理方式呢?有的,SpringRetry就可以帮我们搞定重试问题。 关于重试,我们可以关注以下以下几个方面: 什么情况下去触发重试机制 重试多少次,重试的时间间隔 是否可以对重试过程进行监视 接下来,带着这些思考,一起看下SpringRetry是如何解决这些问题的 首先,引入依赖。 <dependency> <groupId>org.springframework.retry</groupId> <artifactI...

  orz5ZuqqSReN   2023年12月03日   26   0   0 Java

1. 依赖管理 依赖管理,可以将有关依赖项的所有信息放在共同的POM中,并对子POM中的工件进行更简单的引用。举个例子: 父POM <project> ...... <dependencyManagement> <dependencies> <dependency> <groupId>group-a</groupId> <artifactId>artifact-a</artifactId> <version>1.0</version> <exclusions&...

  orz5ZuqqSReN   2023年12月01日   29   0   0 Java

重试的使用场景比较多,比如调用远程服务时,由于网络或者服务端响应慢导致调用超时,此时可以多重试几次。用定时任务也可以实现重试的效果,但比较麻烦,用SpringRetry的话一个注解搞定所有。话不多说,先看演示。 首先引入依赖 <dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> <version>1.3.4</version> </dependency> <...

  orz5ZuqqSReN   2023年11月01日   36   0   0 Java

1. SeataServer部署 Seata分TC、TM和RM三个角色,TC(Server端)为单独服务端部署,TM和RM(Client端)由业务系统集成。 首先,下载最新的安装包 也可以下载源码,然后本地编译。最新的版本是1.5.2 下载后的启动包(或者源码)中有个scripts目录,里面有各种我们所需的脚本 Server端存储模式(store.mode)现有file、db、redis三种: file模式为单机模式,全局事务会话信息内存中读写并持久化本地文件root.data,性能较高;(不推荐) db模式为高可用模式,全局事务会话信息通过db共享,相应性能差些; re...

  orz5ZuqqSReN   2023年11月01日   37   0   0 Java

文章有点长,我决定用半个小时来和你分享😂废话不多说,上代码。。。 基于Seata1.5.2,项目中用seata-spring-boot-starter 1.SeataDataSourceAutoConfiguration SeataDataSourceAutoConfiguration主要是配置数据源代理,可以看到: 默认seata.enabled、seata.enableAutoDataSourceProxy、seata.enable-auto-data-source-proxy都是true 只有当classpath中有DataSource时才会进行此配置 创建了一个SeataAut...

  orz5ZuqqSReN   2023年11月01日   46   0   0 Java

Seata包括Server端和Client端。Seata中有三种角色:TC、TM、RM,其中,Server端就是TC,TM和RM属Client端。Client端的源码学习上一篇已讲过,详见《Seata1.5.2源码学习》,今天来学习Server端的源码。 源码下载地址:https://github.com/seata/seata 启动类ServerApplication没什么好说的,重点是ServerRunner ServerRunner是一个CommandLineRunner实例,因此在SpringBoot启动完成后会回调其run()方法。而在ServerRunner的run()方法中调用...

  orz5ZuqqSReN   2023年11月01日   46   0   0 Java

在上一篇中通过阅读Seata服务端的代码,我们了解到TC是如何处理来自客户端的请求的,今天这一篇一起来了解一下客户端是如何处理TC发过来的请求的。要想搞清楚这一点,还得从GlobalTransactionScanner说起。 启动的时候,会调用GlobalTransactionScannerinitClient()方法,在initClient()中初始化TM和RM TM初始化,主要是注册各种处理器,最终构造一个处理器映射表,不再多说 HashMap<Integer/MessageType/,Pair<RemotingProcessor,ExecutorService>&gt...

  orz5ZuqqSReN   2023年11月01日   90   0   0 Java

关于全局事务的执行,虽然之前的文章中也有所涉及,但不够细致,今天再深入的看一下事务的整个执行过程是怎样的。 1.TransactionManager io.seata.core.model.TransactionManager是事务管理器,它定义了一个全局事务的相关操作 DefaultTransactionManager是TransactionManager的一个实现类 可以看到,所有操作(开启、提交、回滚、查询状态、上报)都是调用TmNettyRemotingClientsendSyncRequest()方法向TC发请求 2.GlobalTransaction DefaultGlobal...

  orz5ZuqqSReN   2023年11月01日   29   0   0 Java

第一种方式:AbstractRoutingDataSource 1.1.手动切换数据源 application.properties Order 如果用Druid作为数据源,应该用url属性,而不是jdbc-url spring.datasource.order.jdbc-url=jdbc:mysql://localhost:3306/order?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&useSSL=false spring.datasource.order.username=root...

  orz5ZuqqSReN   2023年11月01日   39   0   0 Java

1.版本问题 1.1.Activiti版本 7.1.0-M6是最后一个支持JDK1.8的版本,此后的版本都要求JDK11以上 目前,Activiti最新版本是7.6.0,它是用JDK11编译的,因此要想使用最新版7.6.0必须升级JDK版本,不能再用1.8 同时,7.6.0依赖的SpringBoot版本是2.7.5 1.2.SpringBoot版本 最新的SpringBoot版本是3.0.0,这个版本不支持JDK1.8,对JDK的最小版本是17 目前可用比较多的Java版本是Java17和Java19 综合来看,我们采用Java17+SpringBoot2.7.5+Activiti7.6....

  orz5ZuqqSReN   2023年11月01日   53   0   0 Java

写代码的时候经常遇到这样的场景:根据某个字段值来进行不同的逻辑处理。例如,不同的会员等级在购物时有不同的折扣力度。如果会员的等级很多,那么代码中与之相关的if...elseif...else...会特别长,而且每新增一种等级时需要修改原先的代码。可以用策略模式来优化,消除这种场景下的if...elseif...else...,使代码看起来更优雅。 首先,定义一个接口 / 会员服务 / publicinterfaceVipService{ voidhandle(); } 然后,定义实现类 / 白银会员 / publicclassSilverVipServiceimplementsVipServ...

  orz5ZuqqSReN   2023年11月01日   46   0   0 Java

RocketMQ5.0:云原生“消息、事件、流”实时数据处理平台,覆盖云边端一体化数据处理场景。 核心特性 云原生:生与云,长与云,无限弹性扩缩,K8s友好 高吞吐:万亿级吞吐保证,同时满足微服务与大数据场景 流处理:提供轻量、高扩展、高性能和丰富功能的流计算引擎 金融级:金融级的稳定性,广泛用于交易核心链路 架构极简:零外部依赖,Shared-nothing架构 生态友好:无缝对接微服务、实时计算、数据湖等周边生态 1.基本概念 1、消息由生产者初始化并发送到ApacheRocketMQ服务端。 2、消息按照到达ApacheRocketMQ服务端的顺序存储到主题的指定队列中。 3、消费...

  orz5ZuqqSReN   2023年11月01日   37   0   0 Java

业务背景 跟第三方系统做对接,双方通过ActiveMQ进行通信,消息之间是有内在关联的,也就是消息本来应该是有业务顺序的,但由于一些原因,现在收到消息是乱序的,这种情况下做业务处理就有一点小问题了 方案一:自己重排序 收到消息后,自己在内存排序,然后按顺序丢到队列中,自己控制消息的发送和接收保证收到按发送的顺序来收到消息。 如果自己排序的话就要对每个消息标记一个顺序,同时还要指定预先定义好哪些消息属于一类并且相互之间有依赖顺序。 具体实现的话,可以这样做: 1、收到一条消息,封装一下加个序号,放到Redis中,用列表或者有序集合来存储,同时用字符串类型存一下这个业务单号的当前最小序号(默认是1...

  orz5ZuqqSReN   2023年11月01日   48   0   0 Java

最近做票据系统,在此做一个总结。下面从几个关键点逐一来阐述。 1.库存 通俗地讲,票据系统的主要功能是出票、买票、卖票。买卖双方之间的交易就形成了票据的流转。这个过程中,票是最关键的元素。票据库存是整个票据系统的核心,所有业务最终都是对库存进行操作。对应有出库、入库操作。 交易类的库存操作是在结算完成后进行处理的,结算完成后通知交易双方然后各自处理自己的库存; 非交易业务的库存是在对方应答成功后进行的,首先是对方应答同意后处理,然后是本方收到对方应答同意后处理; 针对库存有几张关键的表设计: (1)票据主表:主要是存储票据中不变的一些信息,比如票号、票据类型、出票日期、承兑日期、到期日、出票人...

  orz5ZuqqSReN   2023年11月01日   50   0   0 Java
关注 更多

空空如也 ~ ~

粉丝 更多

空空如也 ~ ~