powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как обнаружить ошибку при работе service broker?
25 сообщений из 71, страница 1 из 3
Как обнаружить ошибку при работе service broker?
    #39596610
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пытаюсь по шагам воспроизвести пример из MSDN по взаимодействию компонентов service broker на разных серверах:
https://technet.microsoft.com/ru-ru/library/bb839483(v=sql.105).aspx

База [InstTargetDB] расположена на экземпляре с установленным 2014SP2CU8, [InstInitiatorDB] - на экземпляре 2016SP1CU7 (обе версии - стандарт)

После воспроизведения всех примеров без ошибок, на шаге Занятие 6. Получение ответа и завершение диалога https://technet.microsoft.com/ru-ru/library/bb839494(v=sql.105).aspx - получаю:
(0 rows affected)
Msg 8418, Level 16, State 1, Line 16
The conversation handle is missing. Specify a conversation handle.

(1 row affected)

Сервера - в одном домене (физически две разные виртуалки на одном хосте).

Подскажите, как вообще искать неисправности в этом случае? Где у этого "розетка", в которую нужно заглянуть в первую очередь?
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39596684
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster,

если получили такую ошибку, то у вас оператор receive вернул null ссылку на диалог.

там пример написан без проверки: что есть плохо
Код: sql
1.
2.
3.
4.
5.
6.
WAITFOR
( RECEIVE TOP(1)
    @RecvReplyDlgHandle = conversation_handle,
    @RecvReplyMsg = message_body
  FROM InstInitiatorQueue
), TIMEOUT 1000;



вы ждете секунду получение сообщения из очереди и потом пытаетесь закрыть диалог, но может получиться так что сообщений в очереди не будет, receive вернет null в @RecvReplyDlgHandle и получите данную ошибку


пишите так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
WAITFOR
( RECEIVE TOP(1)
    @RecvReplyDlgHandle = conversation_handle,
    @RecvReplyMsg = message_body
  FROM InstInitiatorQueue
), TIMEOUT 1000;
if @@ROWCOUNT = 1
    end conversation @RecvReplyDlgHandle
else begin
     throw 50000, 'Ошибка! в очереди нет сообщений для обработки', 1
     --какие то действия при данной ситуации
end



в первую очередь смотрите статусы в sys.conversation_endpoints, если там ничего подозрительного смотрите наличие сообщений в очередях получателя/отправителя, если и там нет признаков происков макаронного монстра идите в sys.transmission_queue
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39602835
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
felix_ffв первую очередь смотрите статусы в sys.conversation_endpoints, если там ничего подозрительного смотрите наличие сообщений в очередях получателя/отправителя, если и там нет признаков происков макаронного монстра идите в sys.transmission_queue
Подозрительное, думаю, есть (см).
Вот только что с этим делать?
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39602842
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот так, думаю, будет нагляднее:
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39602843
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39602872
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster,

uaggster,

если честно от ваших развернутых столбцов глаза режет, сделали бы просто скрин запроса в ssms с результатом.

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

это если "беглым" вгзлядом.
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39602874
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в sys.transmission_queue у вас что сейчас?
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39602893
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
felix_ffв sys.transmission_queue у вас что сейчас?
А вот то, что на втором скрине.
Я транспонировал потому что иначе картинка очень мелкая.

На целевом сервере - в очередях пусто.

Т.е., сообщение туда, видимо, не доставлено.
Но по какой причине? Где затык то?
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39602984
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster,

а так второй скрин это содержимое transmission_queue? ну так прочитайте что там в message_body

Код: sql
1.
select coalesce(try_convert(xml, [message_body]), try_convert(varchar(max), [message_body]), '') from sys.transmission_queue
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39602993
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
felix_ffuaggster,

а так второй скрин это содержимое transmission_queue? ну так прочитайте что там в message_body

Код: sql
1.
select coalesce(try_convert(xml, [message_body]), try_convert(varchar(max), [message_body]), '') from sys.transmission_queue


Ээээ... там
<test>test</test>
<test>test</test>
Ровно то, что я пытаюсь передать на второй сервер.
Но на второй сервер - оно не передается!
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39603000
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster,

проверяйте включен ли брокер в базе msdb на сервере источнике, включен ли брокер на базе сервера получателя, не отключена ли очередь целевой службы
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39603002
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а еще вам необходимо проверить маршруты, и привязки удаленных служб
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39603006
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а и самое главное: а конечная точка то включена вообще? :D

покажите результат
Код: sql
1.
2.
3.
select * from sys.routes
select * from sys.remote_service_bindings
select * from sys.service_broker_endpoints
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39603014
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
felix_ffuaggster,

проверяйте включен ли брокер в базе msdb на сервере источнике

Да, включен

felix_ff, включен ли брокер на базе сервера получателя,
Да, включен

felix_ff не отключена ли очередь целевой службы
А как это проверить?


Я пытаюсь воспроизвести пример:

На первом сервере:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
Create database databaseA
Go
Alter database databaseA set Enable_Broker
Go

Use databaseA
GO
Create Message Type SenderMessageType validation=NONE 
GO
Create Message Type ReceiverMessageType validation=NONE
GO

Create Contract SampleContract
(
  SenderMessageType  SENT BY INITIATOR,
  ReceiverMessageType   SENT BY TARGET
)

Create Queue InitiatorQueue
 WITH status = ON
 
 Create Service SenderService ON QUEUE InitiatorQueue  (SampleContract) 

 Create Route RouteA
WITH
  SERVICE_NAME = 'ReceiverService',
  BROKER_INSTANCE = '7CCCCBB4-3F03-44F6-B94D-AC6282B4DFAD',
  ADDRESS = 'TCP://10.30.10.53:4022'
GO

select service_broker_guid
 from sys.databases
 where name = 'DatabaseA'

Use master
Go
--1. Create a master key for master database.
Create Master Key Encryption BY Password = '1234qwer@'
--Go
/*2.Create certificate and End Point that support 
     certificate based authentication 
*/
Create Certificate EndPointCertificateA
WITH Subject = 'A.Server.Local',
    START_DATE = '01/01/2017',
    EXPIRY_DATE = '01/01/2020'
ACTIVE FOR BEGIN_DIALOG = ON;
GO

CREATE ENDPOINT ServiceBrokerEndPoint
   STATE=STARTED
   AS TCP (LISTENER_PORT = 4022)
   FOR SERVICE_BROKER 
   (
     AUTHENTICATION = CERTIFICATE EndPointCertificateA,
     ENCRYPTION = SUPPORTED
   );

BACKUP CERTIFICATE EndPointCertificateA 
 TO FILE = 
   'C:\backup\EndPointCertificateA.cer';
GO

Create Certificate EndPointCertificateB
 From FILE = 
 'C:\Backup\EndPointCertificateB.cer';
GO


CREATE LOGIN sbLogin
 FROM CERTIFICATE EndPointCertificateB;
GO

GRANT CONNECT ON ENDPOINT::ServiceBrokerEndPoint To sbLogin
GO

Use DatabaseA
GO
Create Master Key Encryption BY
Password = '1234qwer@'
Go

Create Certificate UserCertificateA
 WITH Subject = 'A.Server.Local',
    START_DATE = '01/01/2018',
    EXPIRY_DATE = '01/01/2020'
ACTIVE FOR BEGIN_DIALOG = ON;
GO

BACKUP CERTIFICATE UserCertificateA TO FILE=
'C:\backup\UserCertificateA.cer';
GO

Create User UserB WITHOUT LOGIN
GO


CREATE CERTIFICATE UserCertificateB
 AUTHORIZATION UserB
 FROM FILE = 'C:\backup\UserCertificateB.cer';
GO

GRANT CONNECT TO UserB;

GRANT SEND ON SERVICE::SenderService To UserB;
GO

CREATE REMOTE SERVICE BINDING ServiceBindingB
 TO SERVICE 'ReceiverService'
 WITH USER = UserB


 /**********Begin a Dialog and Send a Message******************/
Declare @ConversationHandle uniqueidentifier

Begin Transaction
Begin Dialog @ConversationHandle
 From Service SenderService
 To Service 'ReceiverService'
 On Contract SampleContract
 WITH Encryption=off;
SEND 
      ON CONVERSATION @ConversationHandle
      Message Type SenderMessageType
  ('<test>test</test>')
Commit



На втором сервере:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
Create database databaseB
Go
Alter database databaseB set Enable_Broker
Go

Use databaseB
GO
Create Message Type SenderMessageType validation=NONE
Create Message Type ReceiverMessageType validation=NONE

Create Contract SampleContract
(
  SenderMessageType  SENT BY INITIATOR,
  ReceiverMessageType   SENT BY TARGET
)

Create Queue TargetQueue WITH status= ON

Create Service ReceiverService ON QUEUE TargetQueue (SampleContract)

Create Route RouteB
WITH
  SERVICE_NAME = 'SenderService',
  BROKER_INSTANCE='886B2333-B33F-4A07-A16C-82DD193CAD57',
 ADDRESS = 'TCP://10.30.10.205:4022'
GO

Use master
Go
 
--1. Create a master key for master database.
Create Master Key Encryption BY Password = '1234qwer@';
Go
--2.Create certificate and End Point that support certificate based authentication.
Create Certificate EndPointCertificateB
WITH Subject = 'B.Server.Local',
       START_DATE = '01/01/2018',
       EXPIRY_DATE = '01/01/2020'
ACTIVE FOR BEGIN_DIALOG = ON;
GO
CREATE ENDPOINT ServiceBrokerEndPoint
      STATE=STARTED
      AS TCP (LISTENER_PORT = 4022)
      FOR SERVICE_BROKER
      ( 
         AUTHENTICATION = CERTIFICATE EndPointCertificateB,
         ENCRYPTION = SUPPORTED
      );

BACKUP CERTIFICATE EndPointCertificateB TO FILE=
  'C:\Backup\EndPointCertificateB.cer';
GO

Create Certificate EndPointCertificateA
 From FILE = 
 'C:\backup\EndPointCertificateA.cer';
GO

CREATE LOGIN sbLogin
 FROM CERTIFICATE EndPointCertificateA;
GO

GRANT CONNECT ON ENDPOINT::ServiceBrokerEndPoint To sbLogin
GO


Use DatabaseB
GO
Create Master Key Encryption BY
Password = '1234qwer@';
Go

Create Certificate UserCertificateB
 WITH Subject = 'B.Server.Local',
    START_DATE = '01/01/2018',
    EXPIRY_DATE = '01/01/2020'
ACTIVE FOR BEGIN_DIALOG = ON;
GO

BACKUP CERTIFICATE UserCertificateB TO
FILE='C:\backup\UserCertificateB.cer';
GO

Create User UserA WITHOUT LOGIN
GO

CREATE CERTIFICATE UserCertificateA
 AUTHORIZATION UserA
FROM FILE = 'C:\backup\UserCertificateA.cer';
GO

GRANT CONNECT TO UserA;

GRANT SEND ON SERVICE::ReceiverService To UserA;
GO

CREATE REMOTE SERVICE BINDING ServiceBindingA
 TO SERVICE 'SenderService'
 WITH USER = UserA

 select cast(message_body as xml)  from TargetQueue

 /*****Receive the Message and send a message to the ender**********/

Declare @ConversationHandle as uniqueidentifier
Declare @MessageBody as nvarchar(max)
Declare @MessageType as sysname

Begin Transaction
Print 'Started Receiving ';

RECEIVE top (1)
      @MessageType = message_type_name,
      @ConversationHandle = conversation_handle,
    @MessageBody = message_body
FROM TargetQueue;

if @MessageType = 'SenderMessageType'
      Begin
            SEND 
                  ON CONVERSATION @ConversationHandle
                  Message Type ReceiverMessageType
                  ('Message is received')
            END Conversation @ConversationHandle
      END

Commit



Это уже второй пример.
Отсюда: http://www.sqlservercentral.com/articles/Service Broker/2797/
Аналогичный из учебника MSDN - тоже не работает.
Пример с пересылкой сообщений между базами на одном сервере - воспроизводится без проблем.

Как обнаружить проблему? Где у него логгируется сообщения об ошибках?
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39603017
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На сервере А, databaseA:
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39603020
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На сервере B, databaseB:
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39603048
Slava_Nik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не понятно , есть результат:
Код: sql
1.
2.
select *
from sys.transmission_queue (nolock)



Там будет статус в поле transmission_status

Второе логи sql смотрели, есть ли там ошибки , права на коннект к endpoint-ам дали?
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39603083
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот что в статусе:
An error occurred while receiving data: '10054(An existing connection was forcibly closed by the remote host.)'.
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39603100
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Из ошибок в логе только: Implied authentication manager initialization failed. Implied authentication will be disabled.
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39603101
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Slava_NikВторое логи sql смотрели, есть ли там ошибки , права на коннект к endpoint-ам дали?
Вроде бы да, в скрипте (см. выше) есть вот что, например:
GRANT CONNECT ON ENDPOINT::ServiceBrokerEndPoint To sbLogin
GO
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39603103
Slava_Nik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster,
у вас ошибка из-за прав.
на второй вопрос не ответили, права к endpoint-у дали?

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/e8346a87-4225-4468-a143-66682f58973c/an-error-occurred-while-receiving-data-10054an-existing-connection-was-forcibly-closed-by-the?forum=sqlservicebroker
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39603108
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster,

безопасность транспорта значит кривая,

почему у вас в одном случае шифрование RC4 а для другой точки AES?
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39603125
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
felix_ffuaggster,

безопасность транспорта значит кривая,

почему у вас в одном случае шифрование RC4 а для другой точки AES?
Не знаю. Видимо, что-то где то по умолчанию.
Инициирующий сервер:
Microsoft SQL Server 2014 (SP2-CU8) (KB4037356) - 12.0.5557.0 (X64) Oct 3 2017 14:56:10 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)
Целевой сервер:
Microsoft SQL Server 2016 (SP1-CU6) (KB4037354) - 13.0.4457.0 (X64)
Nov 8 2017 17:32:23
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows Server 2012 R2 Standard 6.3 <X64> (Build 9600: ) (Hypervisor)

А как поправить различие в шифровании?

Кстати, интересно, а сейчас в статусе сообщений - ПУСТО!
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39603130
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Slava_Nikuaggster,
у вас ошибка из-за прав.
на второй вопрос не ответили, права к endpoint-у дали?

Да говорю ж, вроде как дал:

Код: sql
1.
2.
GRANT CONNECT ON ENDPOINT::ServiceBrokerEndPoint To sbLogin
GO


И на том, и не другом серверах.
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39603153
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster,

ну для начала сделайте

на сервере целевой службы

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
alter endpoint [ServiceBrokerEndPoint]
state = STOPPED;

alter endpoint [ServiceBrokerEndPoint]
FOR SERVICE_BROKER (  
    AUTHENTICATION = CERTIFICATE EndPointCertificateA
   , ENCRYPTION = SUPPORTED, ALGIRITHM RC4;

alter endpoint [ServiceBrokerEndPoint]
state = STARTED;
...
Рейтинг: 0 / 0
25 сообщений из 71, страница 1 из 3
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как обнаружить ошибку при работе service broker?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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