Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Простейший Service Broker / 25 сообщений из 27, страница 1 из 2
20.11.2019, 17:47
    #39891902
Звездочёт
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простейший Service Broker
Собственно, на одной БД делаю

Код: sql
1.
2.
3.
4.
5.
6.
7.
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; 



Далее

Код: sql
1.
2.
3.
4.
BEGIN DIALOG @dialog_handle
   FROM SERVICE ExpensesService1
   TO SERVICE 'ExpensesService2'
   WITH ENCRYPTION = OFF ;  



Ну и SEND - RECEIVE ничего не пересылает
...
Рейтинг: 0 / 0
20.11.2019, 17:47
    #39891903
Звездочёт
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простейший Service Broker
Где может быть закавыка?
...
Рейтинг: 0 / 0
20.11.2019, 17:56
    #39891910
ShIgor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простейший Service Broker
Звездочёт,

Troubleshooting Dialogs
...
Рейтинг: 0 / 0
20.11.2019, 18:00
    #39891912
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простейший Service Broker
Звездочёт,

надо две очереди делать, по очереди на сервис.
...
Рейтинг: 0 / 0
20.11.2019, 18:02
    #39891916
Звездочёт
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простейший Service Broker
Все сообщения сидят в sys.transmission_queue, даже после удаления всех очередей
...
Рейтинг: 0 / 0
20.11.2019, 18:04
    #39891920
ShIgor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простейший Service Broker
Звездочёт,

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.
...
Рейтинг: 0 / 0
20.11.2019, 18:04
    #39891922
Звездочёт
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простейший Service Broker
Владислав Колосов
Звездочёт,

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

Не помогло
...
Рейтинг: 0 / 0
20.11.2019, 18:08
    #39891928
Звездочёт
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простейший Service Broker
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.


Как его включить?
...
Рейтинг: 0 / 0
20.11.2019, 18:10
    #39891929
ShIgor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простейший Service Broker
Звездочёт,

Alter Database БАЗА SET ENABLE_BROKER
...
Рейтинг: 0 / 0
20.11.2019, 19:19
    #39891999
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простейший Service Broker
Владислав Колосов
Звездочёт,

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


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

Звездочёт,

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

два места которые вам необходимо посмотреть:
Код: sql
1.
2.
3.
4.
5.
6.
7.
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]);
...
Рейтинг: 0 / 0
21.11.2019, 08:21
    #39892165
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простейший Service Broker
В общем, начните сразу по-человечески:
https://www.sql.ru/forum/1284421/kak-obnaruzhit-oshibku-pri-rabote-service-broker
...
Рейтинг: 0 / 0
21.11.2019, 10:32
    #39892210
Звездочёт
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простейший Service Broker
Код: sql
1.
select is_broker_enabled from sys.databases where database_id = db_id();



возвращает 1

Код: sql
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.
...
Рейтинг: 0 / 0
21.11.2019, 10:39
    #39892215
Звездочёт
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простейший Service Broker
felix_ff
Владислав Колосов
Звездочёт,

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


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

Звездочёт,

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

два места которые вам необходимо посмотреть:
Код: sql
1.
2.
3.
4.
5.
6.
7.
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]);

Это помогло.
Не очень понятен смысл, что такое дефолтный
контракт
...
Рейтинг: 0 / 0
21.11.2019, 10:58
    #39892232
PaulYoung
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простейший Service Broker
...
Рейтинг: 0 / 0
21.11.2019, 11:04
    #39892234
Звездочёт
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простейший Service Broker



Хорошая статья,
читал.
...
Рейтинг: 0 / 0
21.11.2019, 12:52
    #39892290
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простейший Service Broker
felix_ff,

если сервисы связать с одной очередью, то произойдет "короткое замыкание" диалога, насколько я понимаю.
...
Рейтинг: 0 / 0
21.11.2019, 13:59
    #39892339
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простейший Service Broker
Владислав Колосов
если сервисы связать с одной очередью, то произойдет "короткое замыкание" диалога, насколько я понимаю.
А service_id в очереди для чего?
...
Рейтинг: 0 / 0
21.11.2019, 14:08
    #39892343
Ennor Tiegael
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простейший Service Broker
Владислав Колосов,

Нормально там все будет. Сообщения и инициатору, и таргету будут присутствовать (потенциально совместно) в одной и той же очереди, но у них будут разные как минимум conversation_id (ну или conversation_handle, не помню уже навскидку).
...
Рейтинг: 0 / 0
21.11.2019, 14:32
    #39892364
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простейший Service Broker
Владислав Колосов
felix_ff,

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


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

для простейшего сервиса-примера вариант вполне жизне-пригодный, конечно в проме я бы так делать не советовал.
...
Рейтинг: 0 / 0
21.11.2019, 14:33
    #39892365
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простейший Service Broker
То есть, если трафик односторонний, то проблем не должно быть?
...
Рейтинг: 0 / 0
21.11.2019, 14:35
    #39892366
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простейший Service Broker
Сне кажется сомнительным такое решение, т.к., если оно и работоспособно, но усложняет понимание кода и структуры приложения непосвященному человеку.
...
Рейтинг: 0 / 0
21.11.2019, 14:46
    #39892372
Ennor Tiegael
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простейший Service Broker
Владислав Колосов
Сне кажется сомнительным такое решение, т.к., если оно и работоспособно, но усложняет понимание кода и структуры приложения непосвященному человеку.
Тут вы совершенно правы. Вариант рабочий, но смысла так экономить на спичках очередях нет.
...
Рейтинг: 0 / 0
21.11.2019, 15:29
    #39892419
Звездочёт
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простейший Service Broker
Поставил в очередь обработчик
Код: sql
1.
2.
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 не отрабатывает.


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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 не создаётся.
...
Рейтинг: 0 / 0
21.11.2019, 15:40
    #39892426
Звездочёт
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простейший Service Broker
Почему так происходит?
Неправильно обращаюсь к процедуре?
...
Рейтинг: 0 / 0
21.11.2019, 15:59
    #39892441
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простейший Service Broker
Звездочёт,

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

вы не приводите всего кода что делаете, как отправляете сообщение и.т.д.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Простейший Service Broker / 25 сообщений из 27, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]