Azure Service Bus中ServiceBusSenderClient与ServiceBusSenderAsyncClient的差异
Azure Service Bus中ServiceBusSenderClient与ServiceBusSenderAsyncClient的区别及代码示例差异
核心区别
编程模型:
- ServiceBusSenderClient是同步客户端,所有消息发送操作均为阻塞式——调用发送方法后,当前线程会等待操作完成(成功或失败)才继续执行后续代码。
- ServiceBusSenderAsyncClient是异步客户端,基于非阻塞IO模型,发送操作返回
CompletableFuture(Java生态),不会阻塞当前线程,适合高并发场景下提升资源利用率。
性能与线程利用:
- 同步客户端每次发送都会占用线程直到操作结束,高吞吐量场景下易导致线程池资源耗尽,限制系统处理能力。
- 异步客户端通过事件循环处理多个并发请求,单个线程可承载大量异步任务,资源利用率更高,能支撑更大的消息吞吐量。
API调用方式:
- 同步客户端的方法为同步签名,比如
sendMessage(ServiceBusMessage message)直接执行并返回结果/抛出异常。 - 异步客户端的方法返回异步结果容器,需要通过
thenAccept()、exceptionally()等回调处理成功或失败逻辑,或者在异步方法中使用await等待结果。
- 同步客户端的方法为同步签名,比如
代码示例差异
示例1:构建同步发送客户端
ServiceBusSenderClient sender = new ServiceBusClientBuilder() .connectionString("<< CONNECTION STRING FOR THE SERVICE BUS NAMESPACE >>") .sender() .queueName("<< QUEUE NAME >>") .buildClient();
这段代码通过buildClient()创建同步客户端实例,后续调用发送方法时会阻塞线程:
// 阻塞式发送,直到完成或失败 sender.sendMessage(new ServiceBusMessage("同步发送的消息"));
适合简单场景,代码逻辑直观,无需处理异步回调。
示例2:构建异步发送客户端
ServiceBusSenderAsyncClient sender = new ServiceBusClientBuilder() .connectionString("<< CONNECTION STRING FOR THE SERVICE BUS NAMESPACE >>") .sender() .queueName("<< QUEUE NAME >>") .buildAsyncClient();
这段代码通过buildAsyncClient()创建异步客户端实例,发送操作需要处理异步结果:
// 非阻塞发送,通过回调处理结果 sender.sendMessage(new ServiceBusMessage("异步发送的消息")) .thenRun(() -> System.out.println("消息发送成功")) .exceptionally(ex -> { System.err.println("发送失败:" + ex.getMessage()); return null; });
或者在异步方法中使用await等待完成:
// 异步方法内等待发送完成 await sender.sendMessage(new ServiceBusMessage("异步发送的消息"));
适合高并发、需要避免线程阻塞的场景,能更好地与其他异步组件集成。
内容的提问来源于stack exchange,提问作者SrigandanS
相关产品推荐
相关产品推荐

