一个简单例子,实现服务内部的消息总线,比如可以处理有顺序执行要求的业务。
比如工单流程的处理,有前置任务、处理任务、后置任务。
废话不多说,上示例:
/**
* 可传递业务信息上下文
*
* @author zhimajiang
*/
public class TransmittableMessageContext {
private static final ThreadLocal<Queue<String>> BUS_MSG_THREADLOCAL = new TransmittableThreadLocal<>();
/**
* 存入业务信息
*
* @param message 信息
*/
public static void putMessage(String message) {
if (!StringUtils.hasText(message)) {
return;
}
Queue<String> busMessages = getTransmittableMessageQueue();
busMessages.add(message);
}
/**
* 收集业务信息
*
* @return ServletRequestAttributes
*/
public static List<String> collectBusMessages() {
Queue<String> stringQueue = BUS_MSG_THREADLOCAL.get();
if (Objects.isNull(stringQueue)) {
return new ArrayList<>();
}
List<String> collect = new ArrayList<>(stringQueue.size());
while (!stringQueue.isEmpty()) {
collect.add(stringQueue.poll());
}
return collect;
}
/**
* 清空业务信息
*/
public static void clear() {
BUS_MSG_THREADLOCAL.remove();
}
/**
* 获取消息队列
*
* @return 消息队列
*/
private static Queue<String> getTransmittableMessageQueue() {
Queue<String> busMessagesQueue = BUS_MSG_THREADLOCAL.get();
if (Objects.nonNull(busMessagesQueue)) {
return busMessagesQueue;
}
synchronized (TransmittableMessageContext.class) {
Queue<String> queue = new ArrayDeque<>();
BUS_MSG_THREADLOCAL.set(queue);
return queue;
}
}
}