Добавление пользовательских свойств сообщения при создании сообщений темы служебной шины с помощью Node.js

У меня есть тема с несколькими подписками, и мне нужно добавить фильтр к каждой из подписок, чтобы активировать соответствующее приложение-функцию.

Вот мой код Node.js для создания сообщения:

const router = express.Router();
const { jsonParser, ServiceBusClient } = require('../server');

const connectionString = process.env.SERVICE_BUS_CONNECTION_STRING;
const topicName = process.env.SERVICE_BUS_TOPIC_NAME;


router.post('/post-message', jsonParser, async (req, res) => {
    try {
        // Extract message data from the request
        const messageData = req.body;
        // Create a Service Bus client using the connection string
        const serviceBusClient = new ServiceBusClient(connectionString);

        // Create a sender for the topic
        const sender = serviceBusClient.createSender(topicName);

        const message = {
            applicationProperties: {
                eventType: "jobCosts"
            },
            subject: 'jobCosts',
            body: messageData,
        };

        console.info(message);

        // Send the message to the topic
        await sender.sendMessages(message);

        // Close the sender and the Service Bus client
        await sender.close();
        await serviceBusClient.close();

        res.send(message);

    } catch (error) {
        console.error("Error sending message to Service Bus topic:", error);
        // Handle the error, e.g., by sending an error response
        res.status(500).json({ error: "An error occurred while sending the message to the topic" });
    }
})

module.exports = router;

И у меня есть фильтр корреляции, настроенный для настраиваемого свойства с именем eventType = «jobCosts».

Когда я отправляю сообщение с портала Azure с помощью обозревателя служебной шины, сообщение обрабатывается правильно, но когда я выполняю приведенный выше код, сообщение публикуется, но никогда не попадает в тему.

Также пробовал фильтровать системное свойство метки/субъекта, передавая «субъект», но тоже не смог заставить это работать. Кто-нибудь знает, где я ошибаюсь?

Я не знаю об node.js, но для Python я лично сталкивался, а для C# я видел следующее: если вам нужны пользовательские свойства, не используйте метод создания сообщений, встроенный в функции Azure, вместо этого используйте SDK/пакет для соответствующего языка и таким образом формируйте выходные сообщения.

KonTheCat 27.03.2024 22:33

Спасибо за ответ. Возможно, мне не хватает знаний в этой области, но я подумал, что использую SDK для создания сообщения, как показано в предоставленном коде. Мои приложения-функции срабатывают нормально, когда сообщение попадает в подписку. У меня проблема в том, что я могу получить сообщение в подписке только тогда, когда создаю его вручную в обозревателе служебной шины, а не при отправке сообщения с предоставленным мной кодом, который использует SDK.

Octo 28.03.2024 04:48
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
334
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Также пробовал фильтровать системное свойство метки/субъекта, передавая «субъект», но тоже не смог заставить это работать. Кто-нибудь знает, где я ошибаюсь?

Я попробовал приведенный выше код, и у меня возникла та же проблема, что мои сообщения отправляются через код, но они доходят до мертвого письма, которое не удовлетворяется.

  • Я включил идентификатор сеанса в свою подписку, как показано ниже.

Код:

const { ServiceBusClient } = require("@azure/service-bus");
const express = require('express');
const app = express();
const PORT = process.env.PORT || 3000;

app.get('/send-message', async (req, res) => {
    let serviceBusClient;
    let sender;
    
    try {
        const connectionString = "Endpoint=sb://your-servicebusnamespace.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=svbfe";
        const topicName = "give-ur-topic-name";

        serviceBusClient = new ServiceBusClient(connectionString);
        sender = serviceBusClient.createSender(topicName);

        // Create a message
        const messageBody = {
            id: 1,
            eventType: "jobCosts",
            // Add other message properties if needed
        };

        const message = {
            body: JSON.stringify(messageBody),
            // Add other message properties if needed
            // For correlation filter, you can set the properties here
            correlationId: "12345", // Optional, you can set this to any unique identifier
            sessionId: "107", // Set the session ID here
        };

        console.info("Sending message:", messageBody);

        // Send the message
        await sender.sendMessages(message);
        console.info("Message sent successfully");

        res.send("Message sent successfully");
    } catch (error) {
        console.error("Error occurred:", error);
        res.status(500).send("Error occurred while sending message");
    } finally {
        try {
            if (sender) {
                await sender.close();
            }
            if (serviceBusClient) {
                await serviceBusClient.close();
            }
        } catch (error) {
            console.error("Error while closing sender or service bus client:", error);
        }
    }
});

app.listen(PORT, () => {
    console.info(`Server is running on port ${PORT}`);
});

  • Ниже приведены две мои подписки: одна с включенным сеансом, а другая отключена. Вы можете увидеть количество активных сообщений 14 для включенной подписки.

Полученные сообщения:

Ответ принят как подходящий

Я сравнил сообщения, генерируемые Service Bus Explorer, и сообщения, генерируемые моим кодом. Service Bus Explorer заключил тему в двойные кавычки, чего не было в моем коде.

Обновление правила корреляции, чтобы тема/метка равнялась jobCosts вместо «jobCosts», помогло, и подписка начала получать сообщения, которые я отправляю из моего кода.

Другие вопросы по теме