将消息放入来自 node js 客户端的 azure 服务总线的死信队列

时间:2021-02-28 16:56:55

标签: node.js azure azure-functions azureservicebus

我有一个 azure 函数,在回调函数中它从主题接收一条消息,有时当函数无法处理消息时,然后从这个节点 js 代码我想将该消息置于死地稍后可能会手动处理的信件队列,我尝试浏览文档,我只找到了从死信中读取消息并将其放入死信的示例,同时从服务总线对象接收它,在我的情况下它是一个回调方法所以我不需要创建服务总线对象,有没有办法在回调函数中将消息放入死信中

我正在使用

"@azure/service-bus": "7.0.3"

我一直在关注这个文档

https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/servicebus/service-bus/

我的 function.json 是:

{
  "bindings": [
    {
      "name": "sbMessage",
      "type": "serviceBusTrigger",
      "direction": "in",
      "topicName": "dummy-topic-name",
      "subscriptionName": "dummy_subscription",
      "connection": "AzureWebJobsServiceBus"
    }
  ]
}

在这个自述文件中,它有一个从死信中读取的示例:

https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/servicebus/service-bus/samples/typescript/src/advanced/movingMessagesToDLQ.ts

我在此回调中收到消息:

示例代码:

module.exports = async function (context, sbMessage) {
    context.log('ServiceBus  message', sbMessage);}

4 个答案:

答案 0 :(得分:0)

我认为不建立基于服务总线的客户端是不可能直接向死信发送信息的(至少就NodeJs而言)。请检查基于NodeJS的触发器:

https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-service-bus-trigger?tabs=javascript#usage

你会发现根本没有对应的用法(如果你是基于C#的,是可以的。)

您可以尝试创建服务总线客户端并使用deadLetterMessage

https://docs.microsoft.com/en-us/javascript/api/@azure/service-bus/servicebusreceiver?view=azure-node-latest#deadLetterMessage_ServiceBusReceivedMessage__DeadLetterOptions____key__string___any_

答案 1 :(得分:0)

node js 函数抛出异常会将消息放入死信队列

答案 2 :(得分:0)

我也在研究 Azure 总线服务。

https://docs.microsoft.com/en-us/javascript/api/@azure/service-bus/servicebusreceiver?view=azure-node-latest#deadLetterMessage_ServiceBusReceivedMessage__DeadLetterOptions____key__string___any_

可以在上面的链接中找到有关如何将消息传递给 DLQ 的参考。

基本上,您需要在您创建的 deadLetterMessage 上调用 Receiver 方法。

https://github.com/Azure/azure-sdk-for-js/blob/da8d311b88dff7e93fd1835f0bf034055a8a0b2a/sdk/servicebus/service-bus/samples/javascript/advanced/movingMessagesToDLQ.js#L61-L64


    const connectionString = process.env.SERVICEBUS_CONNECTION_STRING || "<connection string>";
    const queueName = process.env.QUEUE_NAME || "<queue name>";
    const sbClient = new ServiceBusClient(connectionString);

    const receiver = sbClient.createReceiver(queueName);

    await receiver.deadLetterMessage(messages[0], {
      deadLetterReason: "Incorrect Recipe type",
      deadLetterErrorDescription: "Recipe type does not match preferences."
    });

最重要的是,您可以禁用 autoCompleteMessages 以完全控制您希望如何完成或丢弃或移动消息到 DLQ。

答案 3 :(得分:0)

在撰写本文时,不可能以死信方式交互发送消息。

我发现autocomplete=false is only supported for C#

这基本上意味着死信消息的唯一方法是抛出异常

相关问题