咱們知道,在前臺爲了提升用戶體驗度,在不少狀況下都會去用ajax發異步處理一些請求,好比用戶登陸,註冊等等.最近在作的項目中,在後臺也老用到異步處理一些數據,好比當註冊用戶過多,通常咱們的數據鏈接池裏面就的數據鏈接是固定,當用戶須要的鏈接數大於咱們數據鏈接池所支持的數據鏈接數時,就會出現阻塞這種狀況,用戶就會感受很慢,咱們能夠先返回一個消息給用戶說他註冊成功,而後咱們異步處理,將用戶的註冊信息插入到數據庫中.這樣給用戶的體驗效果會好一點(這只是舉個例子,固然在實際操做中咱們這樣作的狀況不多,由於的話當返回給用戶提示信息的時候,用戶去登陸卻登陸不上.),註冊信息過多。。。ajax
1.咱們異步處理後臺信息有兩個方法 當併發量不是很高的時候 咱們能夠在後臺起一個定時任務(ScheduledTaskExecutorFactory.getScheduledTaskExecutor().scheduleWithFixedDelay)數據庫
2.當咱們併發量高的時候 咱們就要用到隊列了併發
首先 咱們先建立一個隊列異步
private static final Logger log = LoggerFactory.getLogger(PushMessageBean.class);.net
private static final int PUSH_MESSAGE_QUEUE_SIZE = 10;debug
private BlockingQueue<PushMessage> messagequeue = new ArrayBlockingQueue<PushMessage>(PUSH_MESSAGE_QUEUE_SIZE);隊列
而後 咱們把數據加入隊列get
/**同步
* 外部放入it
*
* @param syncDetail
*/
public void putQueue(PushMessage pushMessage) {
while (!messagequeue.offer(pushMessage)) {
log.debug("PushMessage的queue滿了,請求插入");
ScheduledTaskExecutorFactory.getScheduledTaskExecutor().execute(new QueueInsertTask(messagequeue));
}
}
最後咱們對隊列中的數據進行操做
固然 爲了可以達到最好的同步效果 咱們最好也起一個定時任務
public void initialize() {
// 定時的去清理queue中的數據,入庫
ScheduledTaskExecutorFactory.getScheduledTaskExecutor().scheduleWithFixedDelay(
new QueueInsertTask(messagequeue), 10, 10, TimeUnit.SECONDS);
}