All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.kaka.notice.LocalMessagePostman Maven / Gradle / Ivy

package com.kaka.notice;

import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicBoolean;

/**
 * 本地事件消息队列执行器
 * 
此执行器当在第一次调用addMessage后将一直执行下去,直到事件队列中的所有事件被执行完毕。 *
当需要暂停执行时可继承此类自行实现,比如增加一个AtomicBoolean对象标记是否执行。 * * @author zkpursuit */ public class LocalMessagePostman { //事件调度中心 protected final Facade facade; //事件队列 protected final Queue queue; //事件队列是否正在被消费执行 protected final AtomicBoolean doing; /** * 构造方法 * * @param facade 事件调度中心 */ public LocalMessagePostman(Facade facade) { this.facade = facade; this.queue = initQueue(); this.doing = new AtomicBoolean(false); } protected Queue initQueue() { return new ConcurrentLinkedQueue<>(); } /** * 添加事件消息到执行队列 * * @param message 事件消息 */ public void addMessage(Message message) { queue.add(message); if (doing.get()) return; execute(); } /** * 执行具体事件消息
* 子类中最好捕获异常,防止异常导致线程池故障 *
     * 
     *     {@literal @}Override
     *     protected void execute(Message message) {
     *         try {
     *             super.execute(message);
     *         } catch (Exception ex) {
     *             ……
     *         }
     *     }
     * 
     * 
* * @param message 事件消息 */ protected void execute(Message message) { facade.sendMessage(message); } /** * 执行事件消息 */ protected void execute() { if (queue.isEmpty()) { this.doing.set(false); return; } this.doing.set(true); final Message event = queue.poll(); Executor threadPoll = facade.getThreadPool(); threadPoll.execute(() -> { this.execute(event); execute(); }); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy