Java架构直通车——ThreadLocal实现RabbitMQ消息的批量发送

引入

之前,我们完成了单个消息的发送,以及单个消息发送的多线程池化
这里,我们继续完成批量发送消息的封装。

因为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会为每一个线程维护一个和该线程绑定的变量的副本,从而隔离了多个线程的数据,每一个线程都拥有自己的变
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值