java多线程在项目中的应用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java多线程在项目中的应用相关的知识,希望对你有一定的参考价值。
多线程对于编程人员都不陌生,比如我们常用的数据库连接池、tomcat等。本博客主要说一下我在工作中对多线程的使用的思考。具体多线程的使用方法就不在这里向大家介绍了。
1.背景
我最近做的项目是供应链相关的项目,而对于项目中涉及的各种单据都需要传给另外一套系统做账(财务系统),比如:合同单据、采购单据、收货单据等,每类单据都会有工作流。
1) 最初
流程是这样的 首先在系统创建单据,提交之后开始走审批流及各种通知,当审批流审批结束之后,触发同步财务系统。当我们系统有单据发生变化时,如果单据已经审批通过,会将变化的内容推送给财务系统。
那这会有什么问题呢?假如我们现在在做一个发票冲销的功能,当用户在页面点击它之后,首先在我们系统完成冲销逻辑,然后调用财务系统将单据同步给它。
起初我们是采用同步的方式调用财务系统的接口,调用财务系统的接口我们方法又需要等待它返回给我们操作状态(成功还是失败),而对于有修改的业务方法我们都会在方法上使用事务,这会导致我们方法占用事务时间过长产生数据库行级锁冲突问题。
2) 思考
当项目上线之后,经常收到用户反馈说项目出错,查看日志发现经常出现行级锁问题。为什么会产生行级锁问题呢?
比如采购单来说,采购单采用的是头行结构(主单和明细),采购单包含采购的数量,收货数量,在途数量等字段,而在收货时,也会操作收货单对应的采购单,如果在采购单和收货单同时操作同一采购单号的单据,并且操作字段都需要同步到财务系统,就会导致方法占用事务过长,更容易产生行级锁问题。
2.解决方案
除了会产生上面所说的行级锁问题之外,其实还有另外一个问题,就是分布式事务来保证数据一致性问题。
1) 异步方式
采用多线程的方式,将我们系统中所有需要同步的到财务系统的地方都改成异步的方式,因为系统有很多种类型的单据,比如说我们系统有6种单据,那我们就创建一个大小为6的线程池,每个线程池配一个阻塞队列。每个线程池和6种单据一一对应,这样就可以保证我们不会开启太多线程而占用系统资源。
例如采购单修改之后,除了做在本系统中的保存之外,同步到财务系统的地方只需要将采购单的同步请求放入线程池中。
除了异步的方式之外,我们还可以同步的方式发送给对方系统之后,对方系统立即返回,当对方系统执行完毕之后,回调我们系统的接口,我们系统再做成功之后的逻辑处理。
2) MQ的方式
除了上面这种方式之外,就是还可以采用MQ的方式,将需要同步的单据发送到MQ里面,对方系统从MQ里面取单据,取出的不同单据做不同的业务区分。
以上是关于java多线程在项目中的应用的主要内容,如果未能解决你的问题,请参考以下文章