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

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

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

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

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

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

Alter Database БАЗА SET ENABLE_BROKER
...
Рейтинг: 0 / 0
Простейший Service Broker
    #39891999
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]);
...
Рейтинг: 0 / 0
Простейший Service Broker
    #39892165
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем, начните сразу по-человечески:
https://www.sql.ru/forum/1284421/kak-obnaruzhit-oshibku-pri-rabote-service-broker
...
Рейтинг: 0 / 0
Простейший Service Broker
    #39892210
Звездочёт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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
Простейший Service Broker
    #39892215
Звездочёт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Простейший Service Broker
    #39892232
Фотография PaulYoung
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Простейший Service Broker
    #39892234
Звездочёт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость



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

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

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

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


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

для простейшего сервиса-примера вариант вполне жизне-пригодный, конечно в проме я бы так делать не советовал.
...
Рейтинг: 0 / 0
Простейший Service Broker
    #39892365
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То есть, если трафик односторонний, то проблем не должно быть?
...
Рейтинг: 0 / 0
Простейший Service Broker
    #39892366
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сне кажется сомнительным такое решение, т.к., если оно и работоспособно, но усложняет понимание кода и структуры приложения непосвященному человеку.
...
Рейтинг: 0 / 0
Простейший Service Broker
    #39892372
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
Сне кажется сомнительным такое решение, т.к., если оно и работоспособно, но усложняет понимание кода и структуры приложения непосвященному человеку.
Тут вы совершенно правы. Вариант рабочий, но смысла так экономить на спичках очередях нет.
...
Рейтинг: 0 / 0
Простейший Service Broker
    #39892419
Звездочёт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поставил в очередь обработчик
Код: 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
Простейший Service Broker
    #39892426
Звездочёт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Почему так происходит?
Неправильно обращаюсь к процедуре?
...
Рейтинг: 0 / 0
Простейший Service Broker
    #39892441
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Звездочёт,

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

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


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