ServiceBroker创建流程
首先为这个数据库开启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创建流程的更多相关文章
- Magento代码之订单创建流程
Magento代码之订单创建流程 直接看代码吧.下面的代码是如何通过程序创建一个完美订单. <?php require_once 'app/Mage. ...
- ADF 项目创建流程
ADF 项目创建流程: 1.首先建好应用 2.创建model,UI 3.创建EO,VO,AO, VL 4.设置EO的属性 5.新建lov 6.设置VO的View Accessors,并设置Attrib ...
- MFC中SDI程序创建流程的回顾
SDI程序创建流程的回顾 从CWinApp.InitialInstance()开始, 1.首先应用程序对象创建文档模板; CSingleDocTemplate* pDocTemplate; pDocT ...
- 【Java基础】Java类的加载和对象创建流程的详细分析
相信我们在面试Java的时候总会有一些公司要做笔试题目的,而Java类的加载和对象创建流程的知识点也是常见的题目之一.接下来通过实例详细的分析一下. 实例问题 实例代码 Parent类 package ...
- Java类的加载和对象创建流程的详细分析
相信我们在面试Java的时候总会有一些公司要做笔试题目的,而Java类的加载和对象创建流程的知识点也是常见的题目之一.接下来通过实例详细的分析一下: package com.test; public ...
- 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 ...
- 8 云计算系列之Horizon的安装与虚拟机创建流程
preface 在上一章节中,我们可以在无web管理界面上创建并启动虚拟机,虽然可以这么做,但是敲命令太繁琐,所以此时我们可以安装openstack web管理界面,通过web界面的图形化操作open ...
- k8s 基础 pod创建流程
Pod是Kubernetes中最基本的部署调度单元,可以包含container,逻辑上表示某种应用的一个实例.例如一个web站点应用由前端.后端及数据库构建而成,这三个组件将运行在各自的容器中,那么我 ...
- solr索引创建流程
solr索引创建流程: 分词组件Tokenizer 分词组件(Tokenizer)会做以下几件事情(这个过程称为:Tokenize),处理得到的结果是词汇单元(Token). 1.将文档分成一个一个单 ...
随机推荐
- shell之脚本练习
脚本需求集合贴-自主开发的 对频繁执行的任务有编写脚本的价值 对单次执行的任务就用笨的,简单的办法 1.对asterisk写一个脚本 查日志 输入日期--能够输出对应日期的日志 输入多个条件--能够输 ...
- Oboe 提升web 用户体验以及性能
Oboe 地址:http://oboejs.com/ 1.安装 bower bower install oboe 2.使用,ajax 模式 oboe('/myapp/things.json') ...
- 第一篇帖子,就弄个JS动态公告浏览吧,直接上代码
.scroll{ margin-left:45px; margin-top:-150px; height:100px; width:300px;} <script lan ...
- python中时间日期格式化符号
python中时间日期格式化符号: import time print(time.strftime('%Y%H%M%S', time.localtime())) 运行结果: 2016092308 %y ...
- 利用Java Service Wrapper将java项目添加到windows服务中
1.web项目,即tomcat/resin添加至window系统服务,步骤如下:第一步:找到tomcat的bin目录,如:D:\apache-tomcat-8.0.26\bin第二步:打开cmd,cd ...
- 【Java编程进阶-1】enum枚举的使用
枚举主要用于枚举常量,下面举个简单的应用. 比如一个公司有如下几个部门: 研发部: 销售部: 财务部: (其他部门暂时不列举) 部门的某些信息相对固定,此时可以考虑使用枚举来说明: 枚举类 Depts ...
- bzoj4316: 小C的独立集
Description 图论小王子小C经常虐菜,特别是在图论方面,经常把小D虐得很惨很惨. 这不,小C让小D去求一个无向图的最大独立集,通俗地讲就是:在无向图中选出若干个点,这些点互相没有边连接,并使 ...
- Saltstack系列2:Saltstack远程执行命令
命令 命令格式: salt '<操作目标>' <方法>[参数] 例: salt 'wx' cmd.run 'free -m' #查看被控主机内存使用情况 常用参数 针对< ...
- PHP “Warning: session_start()...”、"correct (..\..\php5\Temp) in Unknown on line 0" 的解决方法
运行php的时候出现了一下警告: Warning: Unknown: open(D:/Program Files/php5/temp1\sess_l5b1a48m6kmb1g0t5cs33690v0, ...
- 执行sh文件 进行MongoDB的业务逻辑导入
将从HDFS中的数据转化为Json格式写入文件后,十个文件的文件名为 文件名_01 ...._02 ....03格式. 编写个简单的sh文件 通过for do循环让i+1 文件名对应上就可以的- -执 ...