Компонент Service Broker: хранить сообщения, которые не могут быть обработаны внешней программой, в очереди - PullRequest
0 голосов
/ 19 марта 2012

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

Оно выглядит, если очередь не созданапри указании RETENTION сообщение всегда будет удаляться из очереди при успешном ожидании WAITFOR, если транзакция не будет отменена.Но, как вы можете видеть, я не смогу узнать, является ли сообщение действительным, пока хранимая процедура не вернет сообщение вызывающей стороне, то есть программе java.Мне интересно, можно ли разбить «начать транзакцию» и «зафиксировать» или «откат» на две хранимые процедуры: вызвать хранимую процедуру, которая начинает транзакцию, и сначала ждать сообщение;когда оно возвращается вместе с сообщением, попробуйте обработать сообщение в коде Java, если сообщение успешно обработано, вызовите 2-ю хранимую процедуру, чтобы зафиксировать транзакцию, или вызовите другую хранимую процедуру, чтобы откатить ее и поместить сообщение обратно в очередь..

Меня интересует, как указать правильную транзакцию для фиксации или отката, поскольку они не вызываются в одной хранимой процедуре?

Есть ли еще какая-нибудь хорошая практика для решения этой ситуации?У меня есть другая альтернативная идея - создать очередь исключений, пусть java-код помещает сообщение об ошибке в очередь исключений.

Любые комментарии приветствуются!

1 Ответ

1 голос
/ 19 марта 2012

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

WAITFOR (RECEIVE conversation_handle,message_type_name,service_contract_name,convert(xml, message_body) FROM [dbo].[MyQueue])

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

На самом деле я думаю, что хорошей идеей является использование внешнего активатора ( msdn , название загрузки: «Внешний активатор Microsoft SQL Server 2008 R2 Service Broker») Вы также можете сделать что-то подобное, как уже сделано в .net ( ServiceBrokerInterface )

...