Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Простейший Service Broker  [new]
Звездочёт
Member

Откуда:
Сообщений: 33
Собственно, на одной БД делаю

CREATE QUEUE dbo.ExpenseQueue with STATUS = ON, RETENTION = OFF, POISON_MESSAGE_HANDLING (STATUS = ON) ;
GO
CREATE SERVICE ExpensesService1
    ON QUEUE dbo.ExpenseQueue; 

CREATE SERVICE ExpensesService2
    ON QUEUE dbo.ExpenseQueue; 


Далее

BEGIN DIALOG @dialog_handle
   FROM SERVICE ExpensesService1
   TO SERVICE 'ExpensesService2'
   WITH ENCRYPTION = OFF ;  


Ну и SEND - RECEIVE ничего не пересылает
20 ноя 19, 17:47    [22021063]     Ответить | Цитировать Сообщить модератору
 Re: Простейший Service Broker  [new]
Звездочёт
Member

Откуда:
Сообщений: 33
Где может быть закавыка?
20 ноя 19, 17:47    [22021064]     Ответить | Цитировать Сообщить модератору
 Re: Простейший Service Broker  [new]
ShIgor
Member

Откуда: Нижний Новгород
Сообщений: 2298
Звездочёт,

Troubleshooting Dialogs
20 ноя 19, 17:56    [22021074]     Ответить | Цитировать Сообщить модератору
 Re: Простейший Service Broker  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7392
Звездочёт,

надо две очереди делать, по очереди на сервис.
20 ноя 19, 18:00    [22021076]     Ответить | Цитировать Сообщить модератору
 Re: Простейший Service Broker  [new]
Звездочёт
Member

Откуда:
Сообщений: 33
Все сообщения сидят в sys.transmission_queue, даже после удаления всех очередей
20 ноя 19, 18:02    [22021080]     Ответить | Цитировать Сообщить модератору
 Re: Простейший Service Broker  [new]
ShIgor
Member

Откуда: Нижний Новгород
Сообщений: 2298
Звездочёт,

1 ... the transmission_status column in sys.transmission_queue will contain an error message that will point at the problem. The appropriate action depends on the error being displayed.
20 ноя 19, 18:04    [22021084]     Ответить | Цитировать Сообщить модератору
 Re: Простейший Service Broker  [new]
Звездочёт
Member

Откуда:
Сообщений: 33
Владислав Колосов
Звездочёт,

надо две очереди делать, по очереди на сервис.

Не помогло
20 ноя 19, 18:04    [22021086]     Ответить | Цитировать Сообщить модератору
 Re: Простейший Service Broker  [new]
Звездочёт
Member

Откуда:
Сообщений: 33
ShIgor
Звездочёт,

1 ... the transmission_status column in sys.transmission_queue will contain an error message that will point at the problem. The appropriate action depends on the error being displayed.



The broker is disabled in the sender's database.


Как его включить?
20 ноя 19, 18:08    [22021094]     Ответить | Цитировать Сообщить модератору
 Re: Простейший Service Broker  [new]
ShIgor
Member

Откуда: Нижний Новгород
Сообщений: 2298
Звездочёт,

Alter Database БАЗА SET ENABLE_BROKER
20 ноя 19, 18:10    [22021096]     Ответить | Цитировать Сообщить модератору
 Re: Простейший Service Broker  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
Владислав Колосов
Звездочёт,

надо две очереди делать, по очереди на сервис.


не обязательно.

Звездочёт,

у вас на обоих сервисах нет контракта, они только читающие.

два места которые вам необходимо посмотреть:
select is_broker_enabled from sys.databases where database_id = db_id();
/*если 0 то
declare @sql nvarchar(max) = FORMATMESSAGE(N'alter database %s set enable_broker with rollback immediate;', quotename(db_name()));
exec (@sql);
*/

alter service [ExpensesService2] on queue [dbo].[ExpenseQueue] (add contract [DEFAULT]);


Сообщение было отредактировано: 20 ноя 19, 19:19
20 ноя 19, 19:19    [22021201]     Ответить | Цитировать Сообщить модератору
 Re: Простейший Service Broker  [new]
uaggster
Member

Откуда:
Сообщений: 757
В общем, начните сразу по-человечески:
https://www.sql.ru/forum/1284421/kak-obnaruzhit-oshibku-pri-rabote-service-broker
21 ноя 19, 08:21    [22021448]     Ответить | Цитировать Сообщить модератору
 Re: Простейший Service Broker  [new]
Звездочёт
Member

Откуда:
Сообщений: 33
select is_broker_enabled from sys.databases where database_id = db_id();


возвращает 1

select transmission_status from sys.transmission_queue

возвращает

Service Broker received an error message on this conversation. Service Broker will not transmit the message; it will be held until the application ends the conversation.
21 ноя 19, 10:32    [22021526]     Ответить | Цитировать Сообщить модератору
 Re: Простейший Service Broker  [new]
Звездочёт
Member

Откуда:
Сообщений: 33
felix_ff
Владислав Колосов
Звездочёт,

надо две очереди делать, по очереди на сервис.


не обязательно.

Звездочёт,

у вас на обоих сервисах нет контракта, они только читающие.

два места которые вам необходимо посмотреть:
select is_broker_enabled from sys.databases where database_id = db_id();
/*если 0 то
declare @sql nvarchar(max) = FORMATMESSAGE(N'alter database %s set enable_broker with rollback immediate;', quotename(db_name()));
exec (@sql);
*/

alter service [ExpensesService2] on queue [dbo].[ExpenseQueue] (add contract [DEFAULT]);


alter service [ExpensesService2] on queue [dbo].[ExpenseQueue] (add contract [DEFAULT]);

Это помогло.
Не очень понятен смысл, что такое дефолтный
контракт
21 ноя 19, 10:39    [22021533]     Ответить | Цитировать Сообщить модератору
 Re: Простейший Service Broker  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2548
Звездочёт,

Краткое введение в сервис-брокер
21 ноя 19, 10:58    [22021556]     Ответить | Цитировать Сообщить модератору
 Re: Простейший Service Broker  [new]
Звездочёт
Member

Откуда:
Сообщений: 33
PaulYoung
Звездочёт,

Краткое введение в сервис-брокер



Хорошая статья,
читал.
21 ноя 19, 11:04    [22021562]     Ответить | Цитировать Сообщить модератору
 Re: Простейший Service Broker  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7392
felix_ff,

если сервисы связать с одной очередью, то произойдет "короткое замыкание" диалога, насколько я понимаю.
21 ноя 19, 12:52    [22021670]     Ответить | Цитировать Сообщить модератору
 Re: Простейший Service Broker  [new]
invm
Member

Откуда: Москва
Сообщений: 9116
Владислав Колосов
если сервисы связать с одной очередью, то произойдет "короткое замыкание" диалога, насколько я понимаю.
А service_id в очереди для чего?
21 ноя 19, 13:59    [22021744]     Ответить | Цитировать Сообщить модератору
 Re: Простейший Service Broker  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3141
Владислав Колосов,

Нормально там все будет. Сообщения и инициатору, и таргету будут присутствовать (потенциально совместно) в одной и той же очереди, но у них будут разные как минимум conversation_id (ну или conversation_handle, не помню уже навскидку).
21 ноя 19, 14:08    [22021751]     Ответить | Цитировать Сообщить модератору
 Re: Простейший Service Broker  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
Владислав Колосов
felix_ff,

если сервисы связать с одной очередью, то произойдет "короткое замыкание" диалога, насколько я понимаю.


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

для простейшего сервиса-примера вариант вполне жизне-пригодный, конечно в проме я бы так делать не советовал.
21 ноя 19, 14:32    [22021786]     Ответить | Цитировать Сообщить модератору
 Re: Простейший Service Broker  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7392
То есть, если трафик односторонний, то проблем не должно быть?
21 ноя 19, 14:33    [22021787]     Ответить | Цитировать Сообщить модератору
 Re: Простейший Service Broker  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7392
Сне кажется сомнительным такое решение, т.к., если оно и работоспособно, но усложняет понимание кода и структуры приложения непосвященному человеку.
21 ноя 19, 14:35    [22021789]     Ответить | Цитировать Сообщить модератору
 Re: Простейший Service Broker  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3141
Владислав Колосов
Сне кажется сомнительным такое решение, т.к., если оно и работоспособно, но усложняет понимание кода и структуры приложения непосвященному человеку.
Тут вы совершенно правы. Вариант рабочий, но смысла так экономить на спичках очередях нет.
21 ноя 19, 14:46    [22021807]     Ответить | Цитировать Сообщить модератору
 Re: Простейший Service Broker  [new]
Звездочёт
Member

Откуда:
Сообщений: 33
Поставил в очередь обработчик
CREATE QUEUE dbo.ExpenseQueue WITH STATUS = ON, RETENTION = OFF, ACTIVATION(PROCEDURE_NAME = expense_procedure, MAX_QUEUE_READERS = 1, EXECUTE AS SELF), POISON_MESSAGE_HANDLING (STATUS = ON)
GO


Процедура expense_procedure не отрабатывает.


ALTER PROCEDURE [dbo].[expense_procedure]
AS
BEGIN
	SET NOCOUNT ON;
	DECLARE @MyQueueVar2 table ([message_body] nvarchar(MAX));

	WAITFOR(RECEIVE try_convert(xml, [message_body]) FROM ExpenseQueue INTO @MyQueueVar2), TIMEOUT 100;

	SELECT * INTO cTable FROM @MyQueueVar2;
END


Таблица cTable не создаётся.
21 ноя 19, 15:29    [22021901]     Ответить | Цитировать Сообщить модератору
 Re: Простейший Service Broker  [new]
Звездочёт
Member

Откуда:
Сообщений: 33
Почему так происходит?
Неправильно обращаюсь к процедуре?
21 ноя 19, 15:40    [22021913]     Ответить | Цитировать Сообщить модератору
 Re: Простейший Service Broker  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
Звездочёт,

будет больше одного одного диалога или таблица уже существует в бд, получите ошибку.

вы не приводите всего кода что делаете, как отправляете сообщение и.т.д.
21 ноя 19, 15:59    [22021935]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить