温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java多线程在项目中的应用

发布时间:2020-09-19 18:02:18 来源:网络 阅读:660 作者:石小令 栏目:编程语言

多线程对于编程人员都不陌生,比如我们常用的数据库连接池、tomcat等。本博客主要说一下我在工作中对多线程的使用的思考。具体多线程的使用方法就不在这里向大家介绍了。

1.背景

我最近做的项目是供应链相关的项目,而对于项目中涉及的各种单据都需要传给另外一套系统做账(财务系统),比如:合同单据、采购单据、收货单据等,每类单据都会有工作流。

1) 最初

流程是这样的 首先在系统创建单据,提交之后开始走审批流及各种通知,当审批流审批结束之后,触发同步财务系统。当我们系统有单据发生变化时,如果单据已经审批通过,会将变化的内容推送给财务系统。

那这会有什么问题呢?假如我们现在在做一个发票冲销的功能,当用户在页面点击它之后,首先在我们系统完成冲销逻辑,然后调用财务系统将单据同步给它。

起初我们是采用同步的方式调用财务系统的接口,调用财务系统的接口我们方法又需要等待它返回给我们操作状态(成功还是失败),而对于有修改的业务方法我们都会在方法上使用事务,这会导致我们方法占用事务时间过长产生数据库行级锁冲突问题。

2) 思考

当项目上线之后,经常收到用户反馈说项目出错,查看日志发现经常出现行级锁问题。为什么会产生行级锁问题呢?
比如采购单来说,采购单采用的是头行结构(主单和明细),采购单包含采购的数量,收货数量,在途数量等字段,而在收货时,也会操作收货单对应的采购单,如果在采购单和收货单同时操作同一采购单号的单据,并且操作字段都需要同步到财务系统,就会导致方法占用事务过长,更容易产生行级锁问题。

2.解决方案

除了会产生上面所说的行级锁问题之外,其实还有另外一个问题,就是分布式事务来保证数据一致性问题。

1) 异步方式

采用多线程的方式,将我们系统中所有需要同步的到财务系统的地方都改成异步的方式,因为系统有很多种类型的单据,比如说我们系统有6种单据,那我们就创建一个大小为6的线程池,每个线程池配一个阻塞队列。每个线程池和6种单据一一对应,这样就可以保证我们不会开启太多线程而占用系统资源。
java多线程在项目中的应用
例如采购单修改之后,除了做在本系统中的保存之外,同步到财务系统的地方只需要将采购单的同步请求放入线程池中。
除了异步的方式之外,我们还可以同步的方式发送给对方系统之后,对方系统立即返回,当对方系统执行完毕之后,回调我们系统的接口,我们系统再做成功之后的逻辑处理。

2) MQ的方式

除了上面这种方式之外,就是还可以采用MQ的方式,将需要同步的单据发送到MQ里面,对方系统从MQ里面取单据,取出的不同单据做不同的业务区分。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI