引入
之前,我们完成了单个消息的发送,以及单个消息发送的多线程池化。
这里,我们继续完成批量发送消息的封装。
因为rabbitMq本身是不支持批量发消息的,所以我们可以直接使用上文所创建的连接池来发送。
最简单的代码是这样的:
# ProducerClient.class
@Override
public void send(List<Message> messages) throws MessageRuntimeException {
messages.forEach(message -> {
message.setMessageType(MessageType.RAPID);
});
rabbitBroker.sendMessages(messages);
}
# RabbitBrokerImpl.class
@Override
public void sendMessages(List<Message> messages) {
messages.forEach(message -> {
sendKernel(message);
});
}
这里使用ThreadLocal。为什么要将批量发送的消息存储到ThreadLocal里呢?这样做的好处相比于直接调用rabbitBroker.sendMessages(List<Message> messages)把批量消息直接放到参数变量里,优点是什么?
这样做是一个请求线程里来做,好处就是在请求链路的任何时候都可以往里面put消息,而不是集中在一起put。
什么是ThreadLocal
ThreadLocal一般称为线程本地变量,它是一种特殊的线程绑定机制,将变量与线程绑定在一起,为每一个线程维护一个独立的变量副本。通过ThreadLocal可以将对象的可见范围限制在同一个线程内。
- 举例说明:
对于教师判分来说,每个教师登陆后会从答题记录表中抽取20道学生的答案进行阅卷,为了避免同一道题被多个教师抽到,需要加锁进行控制,保证当时只有一个教师在抽题,其他教师只能等待,只有当这名教师抽题完成,等待的教师才可以进行抽题。同步机制就是为了同步多个线程对相同资源的并发访问,解决了多个线程之间进行通信的问题。
ThreadLocal就从另一个角度来解决多线程的并发访问,ThreadLocal会为每一个线程维护一个和该线程绑定的变量的副本,从而隔离了多个线程的数据,每一个线程都拥有自己的变

最低0.47元/天 解锁文章
10万+

被折叠的 条评论
为什么被折叠?



