Sql server ServiceBroker:通过传输路由对两个实例进行内部激活
有带有SQL Server实例的服务器A和B。创建的服务具有通过传输的路由。消息已成功接收。我试图在B上创建一个内部激活,但是队列停止了。我做错了什么?固定的。从A发送到B的每封邮件返回5份副本 服务器ASql server ServiceBroker:通过传输路由对两个实例进行内部激活,sql-server,service-broker,Sql Server,Service Broker,有带有SQL Server实例的服务器A和B。创建的服务具有通过传输的路由。消息已成功接收。我试图在B上创建一个内部激活,但是队列停止了。我做错了什么?固定的。从A发送到B的每封邮件返回5份副本 服务器A USE master GO CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'PAROLPAROL123' CREATE CERTIFICATE [GA_SERVER] WITH SUBJECT = 'GA_
USE master
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'PAROLPAROL123'
CREATE CERTIFICATE [GA_SERVER]
WITH SUBJECT = 'GA_SERVER';
GO
CREATE ENDPOINT BROKER
STATE=STARTED
AS TCP (LISTENER_PORT = 4022)
FOR SERVICE_BROKER
(
AUTHENTICATION = CERTIFICATE [GA_SERVER]
);
GRANT CONNECT ON ENDPOINT::BROKER TO [PUBLIC];
GO
CREATE DATABASE DB_A
GO
ALTER DATABASE DB_A
SET ENABLE_BROKER
WITH ROLLBACK IMMEDIATE;
GO
USE DB_A;
CREATE MESSAGE TYPE RequestMT
validation=NONE;
CREATE MESSAGE TYPE ResponseMT
validation=NONE;
CREATE CONTRACT GAContract
(
RequestMT
SENT BY INITIATOR,
ResponseMT
SENT BY TARGET
);
CREATE QUEUE GAQueue
WITH status = ON;
CREATE SERVICE [tcp://10.10.100.56:4022/GAservice]
ON QUEUE GAQueue (GAContract)
GO
GRANT SEND ON SERVICE::[tcp://10.10.100.56:4022/GAservice] TO [PUBLIC]
CREATE ROUTE transport WITH ADDRESS = 'TRANSPORT';
GO
CREATE TABLE [dbo.t1](
[mes] [nvarchar](max) NULL
) ON [PRIMARY];
GO
CREATE PROCEDURE ActivProcA
AS
BEGIN
SET NOCOUNT ON
DECLARE @RecvReqDlgHandle UNIQUEIDENTIFIER;
DECLARE @RecvReqMsg NVARCHAR(1000);
DECLARE @RecvReqMsgName sysname;
BEGIN TRANSACTION;
WHILE (1=1)
BEGIN
WAITFOR
( RECEIVE TOP(1)
@RecvReqDlgHandle = conversation_handle,
@RecvReqMsg = message_body,
@RecvReqMsgName = message_type_name
FROM GAQueue
), TIMEOUT 5000;
IF (@@ROWCOUNT = 0)
BEGIN
ROLLBACK TRANSACTION;
-- END CONVERSATION @RecvReqDlgHandle;
BREAK;
END
IF @RecvReqMsgName =
N'ResponseMT'
BEGIN
INSERT INTO [dbo.t1] (mes) VALUES (N'back to A from B ('+ CAST(CURRENT_TIMESTAMP AS NVARCHAR)+N'):'+@RecvReqMsg);
END
ELSE
END CONVERSATION @RecvReqDlgHandle;
COMMIT TRANSACTION;
SET NOCOUNT OFF;
END;
END;
GO
ALTER QUEUE GAQueue
WITH
STATUS = ON,
ACTIVATION
( STATUS = ON,
PROCEDURE_NAME = ActivProcA,
MAX_QUEUE_READERS = 10,
EXECUTE AS SELF
);
GO
USE DB_A
DECLARE @ConversationHandle UNIQUEIDENTIFIER;
DECLARE @RequestMsg NVARCHAR(4000);
BEGIN TRANSACTION
BEGIN DIALOG @ConversationHandle
FROM SERVICE [tcp://10.10.100.56:4022/GAservice]
TO SERVICE 'tcp://10.10.100.78:4022/GOS_DB_B_1_service'
ON CONTRACT GAContract
WITH ENCRYPTION = OFF;
SELECT @RequestMsg =
N'<RequestMsg>test1</RequestMsg>';
SEND
ON CONVERSATION @ConversationHandle
MESSAGE TYPE RequestMT
(@RequestMsg);
COMMIT TRANSACTION;
GO
服务器B
USE MASTER
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'PAROLPAROL123'
CREATE CERTIFICATE [GOS_SERVER]
WITH SUBJECT = 'GOS_SERVER';
GO
CREATE ENDPOINT BROKER
STATE=STARTED
AS TCP (LISTENER_PORT = 4022)
FOR SERVICE_BROKER
(
AUTHENTICATION = CERTIFICATE [GOS_SERVER],
);
GRANT CONNECT ON ENDPOINT::BROKER TO [PUBLIC];
GO
CREATE DATABASE DB_B_1
GO
ALTER DATABASE DB_B_1
SET ENABLE_BROKER
WITH ROLLBACK IMMEDIATE;
GO
USE DB_B_1;
CREATE MESSAGE TYPE RequestMT
validation=NONE;
CREATE MESSAGE TYPE ResponseMT
validation=NONE;
CREATE CONTRACT GAContract
(
RequestMT
SENT BY INITIATOR,
ResponseMT
SENT BY TARGET
);
CREATE QUEUE GAQueue
WITH status = OFF;
GO
CREATE SERVICE [tcp://10.10.100.78:4022/GOS_DB_B_1_service]
ON QUEUE GAQueue (GAContract)
GO
GRANT SEND ON SERVICE::[tcp://10.10.100.78:4022/GOS_DB_B_1_service] TO [PUBLIC]
CREATE ROUTE transport WITH ADDRESS = 'TRANSPORT';
GO
CREATE TABLE [dbo.t1](
[mes] [nvarchar](max) NULL
) ON [PRIMARY];
GO
CREATE PROCEDURE ActivProcB
AS
BEGIN
SET NOCOUNT ON;
DECLARE @RecvReqDlgHandle UNIQUEIDENTIFIER;
DECLARE @RecvReqMsg NVARCHAR(100);
DECLARE @RecvReqMsgName sysname;
WHILE (1=1)
BEGIN
BEGIN TRANSACTION;
WAITFOR
( RECEIVE TOP(1)
@RecvReqDlgHandle = conversation_handle,
@RecvReqMsg = message_body,
@RecvReqMsgName = message_type_name
FROM GAQueue
), TIMEOUT 5000;
IF (@@ROWCOUNT = 0)
BEGIN
ROLLBACK TRANSACTION;
BREAK;
END
IF @RecvReqMsgName =
N'RequestMT'
BEGIN
INSERT INTO [dbo.t1] (mes) VALUES (N'('+ CAST(CURRENT_TIMESTAMP AS NVARCHAR)+N'):'+@RecvReqMsg);
DECLARE @Msg NVARCHAR(100);
DECLARE @I INT;
SET @I = 1;
WHILE @I<6
BEGIN
SET @Msg = N'<MsgFromB1>'+CAST (@I AS NVARCHAR(1))+N' ('+CAST(CURRENT_TIMESTAMP AS NVARCHAR)+N')</MsgFromB1>';
SEND ON CONVERSATION @RecvReqDlgHandle
MESSAGE TYPE
ResponseMT
(@Msg);
SET @I = @I+1;
END
END;
COMMIT TRANSACTION;
END
SET NOCOUNT OFF;
END;
GO
ALTER QUEUE GAQueue
WITH
STATUS = ON,
ACTIVATION
( STATUS = ON,
PROCEDURE_NAME = ActivProcB,
MAX_QUEUE_READERS = 10,
EXECUTE AS SELF
);
GO
使用MASTER
去
通过密码创建主密钥加密='ParolProl123'
创建证书[GOS_服务器]
主题='GOS_SERVER';
去
创建端点代理
状态=已启动
作为TCP(侦听器_端口=4022)
服务经纪人
(
身份验证=证书[GOS_服务器],
);
将ENDPOINT::BROKER上的CONNECT授予[PUBLIC];
去
创建数据库DB_B_1
去
ALTER数据库数据库数据库1
设置启用代理
具有立即回滚功能;
去
使用DB_B_1;
创建消息类型RequestMT
验证=无;
创建消息类型ResponseMT
验证=无;
创建合同和合同
(
请求
由发起人发送,
回应
由目标发送
);
创建队列队列
状态=关闭时;
去
创建服务[tcp://10.10.100.78:4022/GOS_DB_B_1_service]
关于队列GAQueue(GACONTACT)
去
授权发送服务::[tcp://10.10.100.78:4022/GOS_DB_B_1_service]致[公众]
创建地址为“传输”的路由传输;
去
创建表[dbo.t1](
[mes][nvarchar](最大值)空
)关于[初级];
去
创建过程ActivProcB
作为
开始
不计数;
声明@RecvReqDlgHandle UNIQUEIDENTIFIER;
声明@RecvReqMsg NVARCHAR(100);
声明@RecvReqMsgName sysname;
而(1=1)
开始
开始交易;
等待
(接收顶部(1)
@RecvReqDlgHandle=对话\u句柄,
@RecvReqMsg=消息体,
@RecvReqMsgName=消息类型名称
来自GAQueue
),超时5000;
如果(@@ROWCOUNT=0)
开始
回滚事务;
打破
结束
如果@RecvReqMsgName=
N'MT'
开始
插入[dbo.t1](mes)值(N'('+CAST(当前时间戳为NVARCHAR)+N'):'+@RecvReqMsg);
声明@Msg NVARCHAR(100);
声明@I INT;
设置@I=1;
而@I
我试图在B上创建一个内部激活,但是队列停止了
这很可能是有毒信息检测开始了。这意味着您激活的过程正在引发异常并导致回滚。发生这种情况时,过程的输出(包括错误消息)将记录到错误日志中。那就是你需要找的地方
您还可以通过禁用激活并从查询窗口手动调用该过程来尝试对该过程进行故障排除。这样,您将直接看到任何错误消息/异常。要在与激活过程相同的上下文中执行,请在调用过程之前发出executeasuser='dbo'
请参阅。您查看日志了吗?关于你的问题有什么活动吗?Remus Rusanu,谢谢你的回复和有用的链接。这是我的粗心——我在[dbo.t1]的激活过程中加了[],它就工作了。