如何在Java版Azure函数中从Azure Service Bus队列触发器获取SessionId与DeliveryCount
解决方案
有两种实现方式可以直接获取你需要的SessionId、DeliveryCount属性:
方式1:绑定Service Bus原生消息对象(更推荐)
直接将触发消息绑定为ServiceBusReceivedMessage类型,该类型内置了所有Service Bus消息系统属性的获取方法,无需单独绑定。
首先确保你的pom.xml已经引入正确的Service Bus SDK依赖:
<dependency> <groupId>com.azure</groupId> <artifactId>azure-messaging-servicebus</artifactId> <version>最新稳定版即可</version> </dependency>
修改后的函数代码:
import com.azure.messaging.servicebus.ServiceBusReceivedMessage; @FunctionName("ServiceBusQueueTriggerJava") public void run( @ServiceBusQueueTrigger(name = "message", queueName = "%ServiceBusQueue%", connection = "ServiceBusConnString", isSessionsEnabled = true) ServiceBusReceivedMessage message, final ExecutionContext context, @BindingName("ApplicationProperties") Map<String, Object> properties) { Logger log = context.getLogger(); log.info("Java Service Bus Queue trigger function executed."); // 直接获取目标属性 String sessionId = message.getSessionId(); long deliveryCount = message.getDeliveryCount(); log.info("SessionId: {}", sessionId); log.info("DeliveryCount: {}", deliveryCount); // 原逻辑保持不变 properties.entrySet().forEach(entry -> { log.info(entry.getKey() + " : " + entry.getValue()); }); // 消息正文可通过getBody()方法获取 String messageContent = message.getBody().toString(); log.info(messageContent); }
方式2:通过@BindingName单独绑定属性
如果你不想引入Service Bus原生SDK,也可以直接通过触发器的绑定注解单独注入两个属性:
修改后的函数代码:
@FunctionName("ServiceBusQueueTriggerJava") public void run( @ServiceBusQueueTrigger(name = "message", queueName = "%ServiceBusQueue%", connection = "ServiceBusConnString", isSessionsEnabled = true) String message, final ExecutionContext context, @BindingName("ApplicationProperties") Map<String, Object> properties, @BindingName("SessionId") String sessionId, @BindingName("DeliveryCount") int deliveryCount) { Logger log = context.getLogger(); log.info("Java Service Bus Queue trigger function executed."); // 直接使用注入的属性 log.info("SessionId: {}", sessionId); log.info("DeliveryCount: {}", deliveryCount); properties.entrySet().forEach(entry -> { log.info(entry.getKey() + " : " + entry.getValue()); }); log.info(message); }
注意事项
- 如果使用方式1,需要保证Azure Functions Java运行时版本和Service Bus SDK版本兼容,避免出现类型转换异常
- SessionId只有在队列开启会话能力的情况下才会有值,你代码中已经配置
isSessionsEnabled = true,符合要求
内容的提问来源于stack exchange,提问作者Jeevan
相关产品推荐
相关产品推荐

