场景简单,其实就是在做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
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) {
|