Я использую версию grails 3.2.3
и версию rabbitmq native plugin 3.3.2
(http://budjb.github.io/grails-rabbitmq-native/doc/manual/). Я пытаюсь реализовать следующий сценарий.
Описание: я отправляю несколько сообщений в одну очередь с заголовками, а в разделе потребителя я пытался применить привязку к потреблению сообщения с помощью специфическая фильтрация. Но потребитель потребляет все сообщения вне зависимости от фильтрации — значит, привязка не работает. Также я начинаю работу с rabbitmq. Поэтому любая помощь/направление очень ценится. Ниже мой код.
Конфигурация очереди в application.groovy:
rabbitmq {
queues = [
[
name : "mail.queue",
connection: "defaultConnection",
durable : true
]
]
}
Функция отправки в очередь:
protected void sendToQueue(QueueType queueType, Map message, Map<String, String> binding = null) {
rabbitMessagePublisher.send {
routingKey = queueType.queueName
body = message
autoConvert = true
if (headers != null) {
headers = binding
}
}
}
Здесь, в sendToQueue
, я сделал третий параметр необязательным, так как в некоторых случаях мне не нужны несколько типов потребителей;
Вызов отправки в очередь:
sendToQueue(QueueType.EMAIL_QUEUE, [user: user], ["emailType": EmailType.PASSWORD_RESET.name()])
sendToQueue(QueueType.EMAIL_QUEUE, [user: user], ["emailType": EmailType.PASSWORD_RESET_SUCCESS.name()])
Потребитель 1:
static rabbitConfig = [
queue : QueueType.EMAIL_QUEUE.queueName,
binding : ["emailType": EmailType.PASSWORD_RESET.name()],
match : "all",
consumer: 10
]
def handleMessage(Map message, MessageContext context) {
print("From PasswordResetEmailConsumer consumer")
println(message)
passwordResetEmailService.sendPasswordResetMail(message)
}
Потребитель 2:
static rabbitConfig = [
queue : QueueType.EMAIL_QUEUE.queueName,
binding : ["emailType": EmailType.PASSWORD_RESET_SUCCESS.name()],
match : "all",
consumer: 10
]
def handleMessage(Map message, MessageContext context) {
print("From PasswordResetSuccessEmailConsumer consumer")
println(message)
passwordResetSuccessEmailService.sendPasswordResetSuccessMail(message)
}