首先为这个数据库开启Service Broker

ALTER DATABASE [T_EIP_UnityStore] SET ENABLE_BROKER

创建MessageType

CREATE MESSAGE TYPE SendACLDetails
                VALIDATION =
WELL_FORMED_XML;

创建Contract

CREATE
CONTRACT [ACLMainContract]
(
               SendACLDetails
SENT BY INITIATOR
);

创建发送到队列和从度列进行读取的存储过程

插入队列数据的存储过程

CREATE PROCEDURE [dbo].[KY_SendACLToQue]

@AclRights varchar(max)

AS

BEGIN

DECLARE @Message XML

Set  @Message=cast(@AclRights as XML);

DECLARE @Handle UNIQUEIDENTIFIER ;

BEGIN TRANSACTION

BEGIN DIALOG CONVERSATION @Handle FROM SERVICE svrACLUpd TO

SERVICE 'svrACLUpd' ON CONTRACT ACLMainContract WITH ENCRYPTION = OFF ;

SEND ON CONVERSATION @Handle MESSAGE TYPE SendACLDetails (@Message) ;

--PRINT 
CAST(@Message AS NVARCHAR(MAX))

COMMIT

END

GO

从队列中读取数据并处理的存储工程

CREATE PROCEDURE [dbo].[KY_ReceiveACLFromQue]

AS

BEGIN

DECLARE @Handle UNIQUEIDENTIFIER ;

DECLARE @MessageType SYSNAME ;

DECLARE @Message XML

DECLARE @FileId int

DECLARE @OperatorId int

DECLARE @AppId INT

DECLARE @InfoId VARCHAR(50)

DECLARE @isACLSplit VARCHAR(10)

DECLARE @PID TINYINT

DECLARE @RetryCount INT

exec   sp_addlinkedserver     'uuc_server','','SQLOLEDB','***\app0c'

exec   sp_addlinkedsrvlogin   'uuc_server','false',null,'sa','***'

exec   sp_serveroption 'uuc_server','rpc out','true' --这个允许调用链接服务器上的存储过程

BEGIN TRY

BEGIN TRANSACTION tr;

RECEIVE TOP ( 1 )

@Handle = conversation_handle,

@MessageType = message_type_name,

@Message = message_body FROM dbo.queSendACL;

IF ( @Handle IS NOT NULL

AND @Message IS NOT NULL

)

BEGIN

SET @OperatorId=CAST(CAST(@Message.query('/CusFileACLXML/OperatorId/text()') AS NVARCHAR(MAX)) AS INT)

SET @FileId=CAST(CAST(@Message.query('/CusFileACLXML/FileId/text()')
AS NVARCHAR(MAX)) AS INT)

SET @AppId=CAST(CAST(@Message.query('/CusFileACLXML/AppId/text()')
AS NVARCHAR(MAX)) AS INT)

SET @InfoId=CAST(CAST(@Message.query('/CusFileACLXML/InfoId/text()')
AS NVARCHAR(MAX)) AS varchar(50))

SET @isACLSplit=CAST(CAST(@Message.query('/CusFileACLXML/isACLSplit/text()') AS NVARCHAR(MAX)) AS varchar(10))

SET @PID=CAST(CAST(@Message.query('/CusFileACLXML/PID/text()')
AS NVARCHAR(MAX)) AS TINYINT)

DECLARE @i INT

DECLARE @Count INT

DECLARE @FileACLXML XML

SET @i=1

SET @Count=0

SET @FileACLXML=@Message.query('/CusFileACLXML/FileAcls/FileACL')

SET @count=@FileACLXML.value('count(/FileACL)','int')

WHILE @i<=@count

BEGIN

DECLARE @childXML XML

DECLARE @EncryptFileId VARCHAR(32)

DECLARE @OrgId INT

DECLARE @OrgName VARCHAR(200)

DECLARE @OrgTypeId INT

DECLARE @FileRight VARCHAR(16)

SELECT @childXML= @FileACLXML.query('/FileACL[position()=sql:variable("@i")]')

SET @EncryptFileId=@childXML.value('(/FileACL/EncryptFileId)[1]','varchar(32)')

SET @OrgId=@childXML.value('(/FileACL/OrgId)[1]','int')

SET @OrgName=@childXML.value('(/FileACL/OrgName)[1]','VARCHAR(200)')

SET @OrgTypeId=@childXML.value('(/FileACL/OrgTypeId)[1]','int')

SET @FileRight=@childXML.value('(/FileACL/FileRight)[1]','VARCHAR(16)')

--是否需要扩散到个人

IF @isACLSplit='true'

BEGIN

--个人

IF @OrgTypeId=1

BEGIN

EXEC [dbo].[KY_SaveFileAcl] @OperatorId,'',@AppId,@InfoId,@FileId,@EncryptFileId,@OrgId,@OrgName,@OrgTypeId,@FileRight,@PID

END

ELSE

BEGIN

CREATE table #tmpTable(OrganizeId INT,OrganizeName nvarchar(200),Flag int)

INSERT INTO #tmpTable(OrganizeId,OrganizeName)

EXEC KY_GetAllEmpListByorg @OrgId,@OrgTypeId

DECLARE
@tmpCount INT

DECLARE
@j INT

DECLARE
@OrganizeId INT

DECLARE
@OrganizeName VARCHAR(200)

SET @j=1;

SELECT @tmpCount = COUNT(OrganizeId) FROM #tmpTable

WHILE @j<=@tmpCount

BEGIN

SET @OrganizeId = (SELECT top(1) OrganizeId FROM #tmpTable where Flag IS NULL)

SET @OrganizeName=(SELECT OrganizeName FROM #tmpTable WHERE OrganizeId=@OrganizeId)

UPDATE #tmpTable SET Flag = 1 WHERE OrganizeId = @OrganizeId

EXEC [dbo].[KY_SaveFileAcl] @OperatorId,'',@AppId,@InfoId,@FileId,@EncryptFileId,@OrganizeId,@OrganizeName,1,@FileRight,@PID

SET @j=@j+1

END

DROP TABLE #tmpTable

END

END

ELSE

BEGIN

EXEC [dbo].[KY_SaveFileAcl] @OperatorId,'',@AppId,@InfoId,@FileId,@EncryptFileId,@OrgId,@OrgName,@OrgTypeId,@FileRight,@PID

END

SET @i=@i+1

END

EXEC [T_EIP_USPIndex].dbo.KY_DeleteACLQueue @OperatorId,@FileId

END

COMMIT transaction tr

END TRY

BEGIN CATCH

rollback transaction tr;

SET @RetryCount=CAST(CAST(@Message.query('/CusFileACLXML/RetryCount/text()') AS NVARCHAR(MAX)) AS INT)

DECLARE @messageStr varchar(max)

IF(@RetryCount < 3 )

BEGIN

PRINT '重试处理'

SET @RetryCount = @RetryCount + 1

EXEC [T_EIP_USPIndex].dbo.KY_UpdateACLQueuE 3,@RetryCount,@OperatorId,@FileId

SET @Message.modify('insert
<RetryCount>{sql:variable("@RetryCount")}</RetryCount>
into (/CusFileACLXML)[1]')

SET @messageStr = CAST(@Message AS VARCHAR(MAX))

exec dbo.KY_SendACLToQue @messageStr

END

ELSE

BEGIN

SET @messageStr = CAST(@Message AS VARCHAR(MAX))

--记录队列错误日志

PRINT '记录队列错误日志'

EXEC KY_InsertACLUpdateLog 1,@OperatorId,'',@InfoId,@AppId,@FileId,@EncryptFileId,NULL,

NULL,NULL,NULL,NULL,NULL,@messageStr,0,'ACL队列处理错误'

END

END CATCH

exec  sp_dropserver 'uuc_server','droplogins'

END

GO

创建队列

CREATE QUEUE queSendACL WITH
STATUS= ON

创建服务

CREATE SERVICE
svrACLUpd ON
QUEUE queSendACL ([ACLMainContract])

ServiceBroker创建流程的更多相关文章

  1. Magento代码之订单创建流程

    Magento代码之订单创建流程         直接看代码吧.下面的代码是如何通过程序创建一个完美订单.        <?php        require_once 'app/Mage. ...

  2. ADF 项目创建流程

    ADF 项目创建流程: 1.首先建好应用 2.创建model,UI 3.创建EO,VO,AO, VL 4.设置EO的属性 5.新建lov 6.设置VO的View Accessors,并设置Attrib ...

  3. MFC中SDI程序创建流程的回顾

    SDI程序创建流程的回顾 从CWinApp.InitialInstance()开始, 1.首先应用程序对象创建文档模板; CSingleDocTemplate* pDocTemplate; pDocT ...

  4. 【Java基础】Java类的加载和对象创建流程的详细分析

    相信我们在面试Java的时候总会有一些公司要做笔试题目的,而Java类的加载和对象创建流程的知识点也是常见的题目之一.接下来通过实例详细的分析一下. 实例问题 实例代码 Parent类 package ...

  5. Java类的加载和对象创建流程的详细分析

    相信我们在面试Java的时候总会有一些公司要做笔试题目的,而Java类的加载和对象创建流程的知识点也是常见的题目之一.接下来通过实例详细的分析一下: package com.test; public ...

  6. OpenStack Nova虚拟机创建流程解析

    https://yikun.github.io/2017/09/27/OpenStack-Nova%E8%99%9A%E6%8B%9F%E6%9C%BA%E5%88%9B%E5%BB%BA%E6%B5 ...

  7. 8 云计算系列之Horizon的安装与虚拟机创建流程

    preface 在上一章节中,我们可以在无web管理界面上创建并启动虚拟机,虽然可以这么做,但是敲命令太繁琐,所以此时我们可以安装openstack web管理界面,通过web界面的图形化操作open ...

  8. k8s 基础 pod创建流程

    Pod是Kubernetes中最基本的部署调度单元,可以包含container,逻辑上表示某种应用的一个实例.例如一个web站点应用由前端.后端及数据库构建而成,这三个组件将运行在各自的容器中,那么我 ...

  9. solr索引创建流程

    solr索引创建流程: 分词组件Tokenizer 分词组件(Tokenizer)会做以下几件事情(这个过程称为:Tokenize),处理得到的结果是词汇单元(Token). 1.将文档分成一个一个单 ...

随机推荐

  1. asp.net MVC 帮助助手和函数( @helper @functions)

    asp.net Razor 视图具有.cshtml后缀,可以轻松的实现c#代码和html标签的切换,大大提升了我们的开发效率.但是Razor语法还是有一些棉花糖值得我们了解一下,可以更加强劲的提升我们 ...

  2. Oracle数据库—— 事务处理与并发控制

    一.涉及内容 1.理解事务的概念和几个特性. 2.熟练掌握事务管理命令的使用. 3.理解并发操作的概念和数据库锁的类型. 二.具体操作 (12.5 实验) 1. 分析以下代码,说出代码中的哪些部分体现 ...

  3. redis配置文件解析

    Redis是一个简单高效的内存KV数据库,基本上下载源码make install,编译完成,然后进入src目录运行redis-server即可运行.就是因为这么简单往往有朋友直接运行,将没有密码的re ...

  4. nova分析(2)—— nova-all

    nova-all是一个用来启动所有nova服务的辅助脚本,注意只是启动所有服务,不包括停止和重启等功能. nova-all的入口在 nova.cmd.all:main ,脚本也比较简单,这儿就贴下代码 ...

  5. Windows 安装程序无法将 Windows 配置为在此计算机的硬件上运行

    遇到这个问题是用辅助工具(WinNTSetup3.exe)进行的安装,重启后就就遇到“Windows 安装程序无法将 Windows 配置为在此计算机的硬件上运行” 解决:在WIN PE 下挂载安装光 ...

  6. 剑指offer系列46---和为s的连续正数序列

    [题目]输出所有和为S的连续正数序列.序列为:1,2,3,4,5,6,7,8................ * 序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序 package com.e ...

  7. java ScriptEngine 使用 (支持JavaScript脚本,eval()函数等)

    Java SE 6最引人注目的新功能之一就是内嵌了脚本支持.在默认情况下,Java SE 6只支持JavaScript,但这并不以为着Java SE 6只能支持JavaScript.在Java SE ...

  8. RegisterClientScriptBlock 与 RegisterStartupScript 的区别

    RegisterClientScriptBlock.RegisterStartupScript 都是注册一个脚本块. ClientScript.RegisterClientScriptBlock(th ...

  9. vs 引用sqlite的问题

    错误 4 未能找到类型或命名空间名称“SQLiteCommand”(是否缺少 using 指令或程序集引用?) D:\01学习\SQLite\HBZCSCXT_Mobile\SqlLiteHelper ...

  10. Hadoop学习2--Linux准备及环境准备

    1.环境安装: 虚拟机:VMware Player 系统:Ubuntu12 注意事项:注意位数,包括系统,java,Hadoop 2.切换账号 当前登录账号是自己的账号,如果想切换到root,且是第一 ...