Группы разговоров - это локальные примитивы, используемые для блокировки. Сообщения в группе разговоров не имеют гарантий порядка, а группы бесед не передаются по проводам.
Порядок сообщений гарантируется Service Broker в ходе разговора. Таким образом, чтобы сохранить порядок коррелированных сообщений при обработке, отправьте их в одном разговоре.
Группы разговоров необходимы для группирования бесед, связанных друг с другом. Глаголы GET CONVERSATION GROUP
и RECEIVE
гарантируют, что они будут блокировать всю группу разговоров, тем самым предотвращая обработку сообщений другими потоками. Например, рассмотрим туристический сайт. Он получает сообщение с просьбой забронировать праздничный пакет. В результате он начинает разговор со службой бронирования отелей и отправляет запрос на бронирование номера, он инициирует разговор со службой бронирования авиабилетов и запрашивает бронирование поездки, он инициирует разговор со службой агентства по прокату автомобилей и просит бронирование автомобиля. Все эти три новых диалога, которые он создал, находятся в одной группе с первоначальным диалогом, в который был получен запрос (приложение использовало условие WITH RELATED_CONVERSATION
из BEGIN DIALOG для всех 3 из них). Затем он фиксирует и приступает к обработке сообщений в очереди. Более поздние ответы на эти 3 взаимосвязанных запроса начинают поступать в довольно случайное время. Скажем, в отеле на первом месте. Сообщение принимается приложением, и оно обновляет статус запроса с ответом из отеля. В то же время приходит ответ авиакомпании. Если другой поток сможет его забрать, он попытается обновить статус того же запроса , что и , что приведет к блокировке или даже взаимной блокировке потока. это обрабатывает ответ отеля. Когда ответ отеля обрабатывается, поток фиксирует и, таким образом, разблокирует всю группу разговоров, позволяя любому потоку (включая себя) получить ответ авиакомпании и обработать его.