我使用了Dapr pub/sub样品并尝试更新它以使用RabbitMQ
我已经从DockerHub下载了DockerHub:3图像,它应该正在收听amqp://localhost:5672。
我为RabbitMQ创建了一个名为rabbitmq.yaml的新组件文件,并将其放置在. .dapr/components目录中。我对RabbitMQ的组件配置是:
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: my-rabbitmq
spec:
type: pubsub.rabbitmq
version: v1
metadata:
- name: host
value: amqp://localhost:5672
- name: durable
value: true # Optional. Default: "false"
- name: deletedWhenUnused
value: false # Optional. Default: "false"
- name: ttlInSeconds
value: 60
- name: prefetchCount
value: 0我的订阅定义在位于同一个. .dapr/components目录中的订阅-rabbitmq.yaml中。它看起来如下:
apiVersion: dapr.io/v1alpha1
kind: Subscription
metadata:
name: rabbitmq-subscription
spec:
topic: deathStarStatus
route: /dsstatus
pubsubname: my-rabbitmq
scopes:
- app2当我使用Redis组件和订阅运行示例时,节点应用程序接收消息并显示在dapr命令的输出中。
dapr publish --topic deathStarStatus --pubsub pubsub --data '{ "message": "This is a test" }'
但是当我向RabbitMQ发布消息时,它会声明“已成功发布的事件”,但是节点应用程序没有收到消息。
dapr publish --topic deathStarStatus --pubsub my-rabbitmq --data '{ "message": "This is a test" }'
下面是节点应用程序和运行它的命令:
dapr run --app-id app2 --app-port 3000 node app2.js
const express = require('express')
const bodyParser = require('body-parser')
const app = express()
app.use(bodyParser.json({ type: 'application/*+json' }));
const port = 3000
// app.get('/dapr/subscribe', (req, res) => {
// res.json([
// {
// pubsubname: "my-rabbitmq",
// topic: "deathStarStatus",
// route: "dsstatus"
// }
// ]);
// })
app.post('/dsstatus', (req, res) => {
console.log(req.body);
res.sendStatus(200);
});
app.listen(port, () => console.log(`consumer app listening on port ${port}!`))我做错了什么?
发布于 2021-01-12 17:28:02
事实证明,RabbitMQ (Dapr world)中的“主题”实际上是一个Exchange,而不是队列。
当运行带有app2订阅的“RabbitMQ”时,将使用预先添加的appid (例如{appid}-{queueName})创建队列,但没有创建RabbitMQ。不确定这是通过设计还是我的特定配置。
最后,我创建了一个名为"deathStarStatus“的Exchange,并将该Exchange映射到名为"app2-deathStarStatus”的队列中,一切都正常。
https://stackoverflow.com/questions/65512137
复制相似问题