Объединить данные из 2 сообщений в 1 объект - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть JMS-очередь с несколькими потребителями на нескольких кластерных узлах.Я получаю сообщения от разных отправителей.Может быть несколько сообщений с информацией только для одного объекта.Сущности должны быть сохранены с помощью jpa.Когда сообщение для объекта получено, объект может или не может уже существовать в базе данных.

Проблема возникает, когда 2 потребителя обрабатывают сообщение для одного и того же объекта одновременно.Оба потребителя пытаются найти объект в базе данных.Поскольку объект не найден, оба пытаются вставить объект вместо обновления существующего.Таким образом, чем быстрее один выигрывает, а другой заканчивается исключением (из-за ограничения уникального ключа в таблице).

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

Вторая мысль была о разнице между слиянием и сохранением.Но даже если это может работать с слиянием, это приведет к перезаписи существующих данных.

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

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 12 апреля 2019

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

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

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

...