You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 14:45:01