Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Service Brocker  [new]
А
Guest
Возможно я немножко подтупливаю, т.к. вообще услышал про такую вещь как Service Brocker только в прошлую пятницу. А вот задача. Есть таблица, куда сыпятся данные, есть клиенты, которые ждут информации о СВОИХ данных (ключ таблицы). Требуется при записи строки как-то передать информацию нужному клиенту, чтобы тот у себя что-то сделал. Что я собрался делать. Навесить триггер на эту таблицу, в момент записи строки помещать в очередь Service Brocker-a сообщение о появившейся записи. Вопрос в том, как клиенту определить что это ЕГО сообщение, я не нашел снаружи никаких признаков, а также возможности делать фильтр по телу сообщения. Была еще мысль создать под каждого клиента свою очередь, но тогда это выльется в динамические запросы, в т.ч. при создании диалога, где присутствует локальная переменная. В общем почти все хорошо, а какую-то мелочь не могу обойти...
24 июл 12, 06:44    [12906109]     Ответить | Цитировать Сообщить модератору
 Re: Service Brocker  [new]
WWWGuest
Guest
А,

Koroche napishu tak... esli ne naprjagaet chitat':

1)mozhno oboitis' i bez triggera esli ty eto delaesh' cherez klientskoe prilozhenie pol'zui SQLDependency
2)kogda ty formiruesh' soobschenija, to cherez XML zavorachivaesh' v eto soobschenie vse chto ugodno (adresa klientov, e-mail...)
tut zhe ty mozhesh' vybrat' komu eto soobschenie otpravit' (po 1 soobscheniju na klienta esli klienty sidjat v raznyh bazah dannyh, ili poluchatel' budet vsego 1 /v sluchae s e-mail/)
3)poluchatel' soobscheniya esli nahoditsja v otdel'noi baze dannyh sam reshaet chto emu delat'... a esli odna baza (kak v sluchae s e-mail) prosto dostaet e-mail address iz XML i shlet ego cherez sendmail...
24 июл 12, 08:06    [12906173]     Ответить | Цитировать Сообщить модератору
 Re: Service Brocker  [new]
WWWGuest
Guest
Da,

fil'tr po telu soobschenija (to est' po XML) legko poluchaetsja pol'zuja SQLXML... posmotri uzly (nodes) i znacheniya (value) i vse delaetsja cherez obychnyi select statement
24 июл 12, 08:16    [12906198]     Ответить | Цитировать Сообщить модератору
 Re: Service Brocker  [new]
А
Guest
Вот тут-то и начинается самое интересное:

п.1) мое клиентское приложение написано не на .Net, поэтому не может использовать SQLDependency
п.2) самое главное. в этом-то и весь мой вопрос - как определить кому это сообщение, т.к. как я понимаю их надо или разделять по очередям - тогда геморрой с написанием запроса, или толкать в 1 очередь, тогда у клиентов должны быть зацепки, чтобы они поняли что это их сообщения, чего я тоже не нашел, и если это решить, то все остальное - дело техники...
24 июл 12, 09:28    [12906401]     Ответить | Цитировать Сообщить модератору
 Re: Service Brocker  [new]
WWWGuest
Guest
А,

sovsem tupo:
nachalo dialoga v tvoem triggere:


begin transaction;

begin dialog @InitDlgHandle
from service
[//AWDB/1DBSample/InitiatorService]
to service
N'//AWDB/1DBSample/TargetService'
on contract
[//AWDB/1DBSample/SampleContract]
with
encryption = off;


select @RequestMsg = (
select name + '@mail.ru' as 'recipient'
from sys.objects
for xml raw, root ('root')
);


send on conversation @InitDlgHandle
message type
[//AWDB/1DBSample/RequestMessage]
(@RequestMsg);

select @RequestMsg AS SentRequestMsg;

commit transaction;
24 июл 12, 10:41    [12906741]     Ответить | Цитировать Сообщить модератору
 Re: Service Brocker  [new]
WWWGuest
Guest
zameni tol'ko varchar (100) na xml u peremennoi...
24 июл 12, 10:43    [12906758]     Ответить | Цитировать Сообщить модератору
 Re: Service Brocker  [new]
WWWGuest
Guest
eto tvoi otvet:

declare @RecvReqDlgHandle uniqueidentifier;
declare @RecvReqMsg xml;
declare @RecvReqMsgName sysname;


begin transaction;

waitfor
(
receive top(1)
@RecvReqDlgHandle = conversation_handle
, @RecvReqMsg = message_body
, @RecvReqMsgName = message_type_name
from TargetQueue1DB

), timeout 1000;

select @RecvReqMsg as ReceivedRequestMsg;

if @RecvReqMsgName = N'//AWDB/1DBSample/RequestMessage'
begin

select d.value ('@recipient', 'varchar (255)')
from @RecvReqMsg.nodes ('//root/row') as data (d)

declare @ReplyMsg nvarchar (100);
select @ReplyMsg = N'<ReplyMsg>Message for Initiator service.</ReplyMsg>';

send on conversation @RecvReqDlgHandle
message type
[//AWDB/1DBSample/ReplyMessage]
(@ReplyMsg);

end conversation @RecvReqDlgHandle;
end

select @ReplyMsg as SentReplyMsg;

commit transaction;
go
24 июл 12, 10:53    [12906848]     Ответить | Цитировать Сообщить модератору
 Re: Service Brocker  [new]
WWWGuest
Guest
ne zabud' zakryt' dialog:

declare @RecvReplyMsg nvarchar(100);
declare @RecvReplyDlgHandle uniqueidentifier;

begin transaction;

waitfor (
receive top(1)
@RecvReplyDlgHandle = conversation_handle
, @RecvReplyMsg = message_body
from InitiatorQueue1DB
), timeout 1000;

end conversation @RecvReplyDlgHandle;

select @RecvReplyMsg as ReceivedReplyMsg;

commit transaction;
go
24 июл 12, 10:55    [12906871]     Ответить | Цитировать Сообщить модератору
 Re: Service Brocker  [new]
A
Guest
опять не совсем то.
вот это

автор
if @RecvReqMsgName = N'//AWDB/1DBSample/RequestMessage'


проверяет только тип сообщения, а это

автор
select d.value ('@recipient', 'varchar (255)')
from @RecvReqMsg.nodes ('//root/row') as data (d)


выгребает ЛЮБЫЕ сообщения этого типа вне зависимости от клиента, а клиент уже проверяется позже (и что потом делать?). Так самый главный вопрос - что делать, если клиент схватит не свое сообщение, а точнее, как их разграничить по клиентам? Service Brocker понимает что-нибудь типа

select d.value ('@recipient', 'varchar (255)') from @RecvReqMsg.nodes ('//root/row') as data (d) 
where d.value ('@....', 'varchar (255)')=......? 
24 июл 12, 12:36    [12907731]     Ответить | Цитировать Сообщить модератору
 Re: Service Brocker  [new]
.
Guest
.
25 июл 12, 06:07    [12911526]     Ответить | Цитировать Сообщить модератору
 Re: Service Brocker  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Придумываете ласапед с квадратными колёсами?

Вот тема.
25 июл 12, 12:22    [12913087]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить