У меня есть тема с несколькими подписками, и мне нужно добавить фильтр к каждой из подписок, чтобы активировать соответствующее приложение-функцию.
Вот мой код 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 с помощью обозревателя служебной шины, сообщение обрабатывается правильно, но когда я выполняю приведенный выше код, сообщение публикуется, но никогда не попадает в тему.
Также пробовал фильтровать системное свойство метки/субъекта, передавая «субъект», но тоже не смог заставить это работать. Кто-нибудь знает, где я ошибаюсь?
Спасибо за ответ. Возможно, мне не хватает знаний в этой области, но я подумал, что использую SDK для создания сообщения, как показано в предоставленном коде. Мои приложения-функции срабатывают нормально, когда сообщение попадает в подписку. У меня проблема в том, что я могу получить сообщение в подписке только тогда, когда создаю его вручную в обозревателе служебной шины, а не при отправке сообщения с предоставленным мной кодом, который использует SDK.





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

Код:
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}`);
});


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

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