Bootstrap

用Java多线程,将任务分步骤处理

场景简单,其实就是在做WEB请求的时候,处理的结果需要同时通知到一个第三方服务器,通知后再把结果返回给客户端。

现在这个通知只是一个简单通知,如果直接加在客户端请求里面,客户端会在请求第三方服务器时堵塞。另外为了客户端不能超时,所以通知失败后也不敢多次请求。

 

这里可以使用定制任务来解决这个问题,一个客户端请求后产生一个定制的任务,然后服务后台进行多线程的异步处理,这样就会大大减少客户端的请求时间,同样最大程度保证这个通知是及时成功给第三方的。

定制任务我们需要一张表,来存储任务。同时需要多线程来执行这些任务。至于谁来开启这些任务,你可以使用定时器:http://javacui.com/framework/24.html,也可以使用后台线程。因为定时器已经有示例了,这里来说下后台线程。

 

因为是WEB服务,在服务启动的时候注册一个启动监听:

?
1
2
3
4
5
6
<!-- 初始化系统需要的配置项 开始 -->
< listener >
  < display-name >webListener</ display-name >
  < listener-class >cn.com.vogue.listener.InitListener</ listener-class >
</ listener >
<!-- 初始化系统需要的配置项 结束 -->

然后我们来实现这个监听处理,主要任务就是开启一个后台线程,实时查询是否有需要执行的任务,有的话就分发任务给子线程。

同时为了系统的可配性,这个主线程是否开启做一个配置项,加载的时候判断一下即可:

?
1
isRunRulThread=0
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import  javax.servlet.ServletContextEvent;
import  javax.servlet.ServletContextListener;
import  org.slf4j.Logger;
import  org.slf4j.LoggerFactory;
import  cn.com.vogue.task.UrlTask;
import  cn.com.vogue.utils.ResourceUrl;
import  cn.com.vogue.utils.SpringFactory;
/**
  * 初始化
  */
public  class  InitListener  implements  ServletContextListener {
  private  static  Logger logger = LoggerFactory.getLogger(InitListener. class );
  public  void  contextDestroyed(ServletContextEvent sce) {
 
;