簡體   English   中英

Azure 服務總線計划消息“輸入”綁定未定義

[英]Azure Service Bus scheduled message "in" binding undefined

我正在使用 @azure/service-bus JavaScript 庫從 Azure Functions 發布和訂閱有關 Azure 服務總線主題的消息。 為了接收消息,我使用了從模板創建的 Azure 服務總線主題觸發器函數,無需任何更改。 當我使用 sender.send(message) 發布消息時,我收到了很好的消息。

import { AzureFunction, Context, HttpRequest } from "@azure/functions"
import * as sb from "@azure/service-bus"

const PublishToServiceBus: AzureFunction = async function (context: Context, req: HttpRequest): Promise<void> {
    const eventDoc = req.body;
    const serviceBusConnectionString = process.env["ServiceBusConnection"];
    const topicName = process.env["TopicName"]';
    const sbClient = sb.ServiceBusClient.createFromConnectionString(serviceBusConnectionString);
    const topicClient = sbClient.createTopicClient(topicName);
    const sender = topicClient.createSender();

    const message: sb.SendableMessageInfo = { body: eventDoc };

    // this works
    sender.send(message);

    // this creates message without body?
    const scheduledEnqueueTimeUtc = new Date(Date.now() + 10000);
    sender.scheduleMessages(scheduledEnqueueTimeUtc, [message]);

};
export default PublishToServiceBus;

但是當我使用 sender.scheduleMessages() 安排消息時,我的傳入綁定變量在 Azure 服務總線主題觸發器函數中未定義。

import { AzureFunction, Context } from "@azure/functions"

const serviceBusTopicTrigger: AzureFunction = async function (context: Context, mySbMsg: any): Promise<void> {
    context.log('ServiceBus topic trigger function processed message', mySbMsg);
};
export default serviceBusTopicTrigger;

輸出: ServiceBus topic trigger function processed message undefined

這是圖書館的問題還是我做錯了什么?

該問題是由 @azure/service-bus sdk 中的錯誤引起的。

解決方法

  • "@azure/amqp-common"庫導入DefaultDataTransformer
    • 在打字稿中, import { DefaultDataTransformer } from "@azure/amqp-common";
    • 在javascript中, const { DefaultDataTransformer } = require("@azure/amqp-common");
  • 在調用scheduleMessage()方法發送消息之前更新消息體如下
    1. 實例化 sdk 使用的數據轉換器:
      • const dt = new DefaultDataTransformer();
    2. 當您需要調度消息時,請在發送前對消息正文進行編碼:
      • message.body = dt.encode(message.body);

有關此錯誤的更多參考和調查 - Azure/azure-sdk-for-js#6816

在新世界(azure 函數 .net5)中,您不能再使用代理消息。 新圖書館不能滿足它。

函數應用聲明不再是 [FunctionName=] 而是 [Function= 你不能再接收“消息”或字節。 但只有一個字符串!!!。

例子;

[Function("TestFA")] public async Task Run([ServiceBusTrigger(topicName,subscribeName, Connection = ???)] string messageText, string id, FunctionContext executionContext )

魔術現在在 FunctionContext executionContext 中,您可以從中獲取屬性

例如 KeyValuePair<string, object> props = executionContext.BindingContext.BindingData.Where(x => x.Key == "UserProperties").FirstOrDefault();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM