Java/Spring - отправить сообщение RabbitMQ изнутри потребителя

Законно и безопасно ли отправлять сообщение в другую очередь от потребителя текущей очереди?

public void onMessage(){
    //save to db
    Order o=myservice.create(order);

    Object o=rabbitTemplate.convertSendAndReceive(queue2,orderId);   
}

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

И безопасно ли и законно отправлять сообщения от потребителей?


person avalon    schedule 28.04.2016    source источник
comment
Не вижу в этом проблемы, это будет выглядеть так: производитель -> потребитель -> приложение -> производитель -> потребитель   -  person h.zak    schedule 28.04.2016


Ответы (1)


Да, это совершенно законно и безопасно, если смотреть со стороны rabbitmq или amqp.

Но безопасно ли это для согласованности данных, которые обрабатывает ваше бизнес-приложение, это уже другая история. Если потребитель A получает сообщение M, извлекает из него какие-то данные в S для записи в БД (например) и при этом пересылает сообщение < em>M потребителю B, который при получении должен записать данные в БД, но эти данные зависят от S, тогда что случится? Что ж, шансы случайны, и это известно как состояние гонки — в этом случае A соревнуется с брокером — ему нужно записать S в БД до B< /em> получает сообщение M.
Лучший способ избежать гонки — это, ну, избежать гонки. Попросите A переслать сообщение только после того, как он завершит "настройку воспроизведения" для других потребителей.

person cantSleepNow    schedule 28.04.2016