【腾讯通服务器的消息集成解决方案】之与勤哲Excel服务器的集成
本著懶人的原則,提供最簡單的解決方案!Let's go~~(文中采用的RTX版本為3.61,ES版本為7.1.7)
方案思路:
1.首先做一張數(shù)據(jù)表來存儲(chǔ)消息隊(duì)列,并利用RTX的SDK寫一個(gè)程序來每隔一段時(shí)間從該表中取出消息隊(duì)列發(fā)送出去;
2.然后為ES的ESSys數(shù)據(jù)庫里面存儲(chǔ)待辦工作流信息的數(shù)據(jù)表寫一個(gè)觸發(fā)器,讓它有新增數(shù)據(jù)的時(shí)候自動(dòng)往1樓的表里面寫入消息隊(duì)列。
設(shè)計(jì)方案:
1.首先要解決RTX帳號和ES帳號的映射問題。很簡單,在RTX和ES里面新建用戶的時(shí)候,帳號不都是可以手工定義的嘛,就統(tǒng)一用員工工號唄~
如果兩個(gè)系統(tǒng)都已經(jīng)有帳號了,而且還是不統(tǒng)一的,那就改ES里面的帳號吧,把它向RTX統(tǒng)一。(推薦做法)
如果覺得更改ES的帳號對用戶影響太大,還要另發(fā)通知,那就不改帳號,把手機(jī)或電子郵件改成RTX帳號吧~~(懶人嘛)
2.接下來做消息隊(duì)列的數(shù)據(jù)表,為了配置權(quán)限簡單,就單獨(dú)建一個(gè)數(shù)據(jù)庫<RTX>吧,然后在數(shù)據(jù)庫中建一個(gè)數(shù)據(jù)表<MSG_Queue>,數(shù)據(jù)字典如下:
| 列名 | 數(shù)據(jù)類型 | 長度 | 允許空 | 默認(rèn)值 | 說明 |
| MsgID | bigint | 8 | 主鍵。自動(dòng)編號。 | ||
| DelayTime? | smallint | 2 | √ | 0 | 消息框在桌面停留時(shí)間(秒),默認(rèn)為手動(dòng)關(guān)閉。 |
| Receiver | varchar | 20 | 接收者,用戶名稱或號碼。 | ||
| MsgInfo | varchar | 500 | 消息提醒內(nèi)容。 | ||
| Title | varchar | 10 | √ | 消息提醒標(biāo)題。(建議5個(gè)漢字的寬度以內(nèi)) | |
| AssType | tinyint | 1 | √ | 0 | 保留。 |
| Type | tinyint | 1 | √ | 0 | 消息提醒類別。0:普通消息,1:緊急消息。 |
| SendMode | tinyint | 1 | √ | 0 | 發(fā)送模式。0:普通模式,1:發(fā)送給所有人。 |
?
再創(chuàng)建一個(gè)獨(dú)立的SQL帳號RTX,密碼也是RTX,配置權(quán)限為可以讀寫數(shù)據(jù)表<MSG_Queue>,這個(gè)帳號用來在RTX接口程序中使用。
3. 開始寫RTX接口程序。我用記事本寫的VBS腳本,懶得配置軟件開發(fā)環(huán)境,也不用編譯,修改起來簡單,充分體現(xiàn)開源精神!(懶人嘛)
不羅嗦,直接貼代碼,有問題請教SDK~
?1'********************************************************************
?2'Author:?碟子?http://cancelpj.cnblogs.com/
?3'Date:?2008-02-17
?4'Detail:?定時(shí)從數(shù)據(jù)庫取得消息隊(duì)列,并調(diào)用RTX接口發(fā)送即時(shí)消息提醒。
?5'********************************************************************
?6
?7'循環(huán)周期(分鐘)
?8Const?CycleTime?=?1
?9'日志文件
10Const?LogFile?=?"RTX_Notify.log"
11'追加寫入模式
12Const?ForAppending?=?8
13
14Dim?RTXObj,?RTXParams
15Dim?RTXResult
16Dim?objFSO,?objLogFile
17Dim?cnSrc,?rst
18
19Set?RTXObj?=??CreateObject("rtxserver.rtxobj")
20Set?RTXParams?=?CreateObject("rtxserver.collection")
21RTXObj.Name?=?"SYSTOOLS"
22
23Set?objFSO?=?CreateObject("Scripting.FileSystemObject")
24set?cnSrc?=?CreateObject("ADODB.Connection")
25set?rst?=?CreateObject("ADODB.RecordSet")?
26
27While?1
28????cnSrc.Open?"Provider=sqloledb;server=RTX數(shù)據(jù)庫地址;Uid=rtx;Pwd=rtx;Database=RTX"
29????set?rst?=?cnSrc.Execute?_
30????????("SELECT?MsgID,DelayTime,Receiver,Title,MsgInfo,Type,SendMode?FROM?Msg_Queue")
31
32????Set?objLogFile?=?objFSO.OpenTextFile(LogFile,?ForAppending,?True)
33
34????Do?until?rst.eof
35????????'Wscript.StdOut.WriteLine(rst("now()?&?VBTAB?&?MsgID?:?"?&?rst("MsgID")?&?VBTAB?&?rst("Title")?&?VBTAB?&?rst("MsgInfo"))
36????????RTXParams.Remove?"SENDMODE"
37
38????????'RTXParams.Add?"MSGID",?rst("MsgID")
39????????'RTXParams.Add?"ASSTYPE",?"0"
40????????RTXParams.Add?"DELAYTIME",?rst("DelayTime")*1000
41????????RTXParams.Add?"USERNAME",?rst("Receiver")
42????????RTXParams.Add?"TITLE",?rst("Title")
43????????RTXParams.Add?"MSGINFO",?rst("MsgInfo")
44????????RTXParams.Add?"TYPE",?rst("Type")????'0?-?普通消息;1?-?緊急消息
45
46????????iSendMode?=?0
47????????if?rst("SendMode")?=?1?then
48????????????iSendMode?=?iSendMode?+?&H1????'發(fā)送給所有用戶
49????????end?if
50????????if?iSendMode?>?0?then?
51????????????iSendMode?=?iSendMode?+?&H10????'需要查詢狀態(tài)
52????????????RTXParams.Add?"SENDMODE",?iSendMode
53????????end?if
54???????
55????????On?error?resume?next
56????????RTXResult?=?""
57????????RTXResult?=?RTXobj.Call2(&H2100,?RTXParams)?
58????????if(?err.number?<?0)?then?
59????????????objLogFile.Write?now()?&?VBTAB?&?err.Description
60????????????objLogFile.Write?VBTAB?&?"MsgID?:?"?&?rst("MsgID")?&?VBTAB?&?rst("Title")
61????????????objLogFile.Write?VBTAB?&?rst("MsgInfo")
62????????????objLogFile.Write?VbCrLf
63????????else?
64????????????objLogFile.Write?now()?&?VBTAB?&?"發(fā)送成功"
65????????????objLogFile.Write?VBTAB?&?"MsgID?:?"?&?rst("MsgID")?&?VBTAB?&?rst("Title")
66????????????objLogFile.Write?VBTAB?&?rst("MsgInfo")
67????????????objLogFile.Write?VbCrLf
68????????????
69????????????cnSrc.Execute?"DELETE?FROM?Msg_Queue?WHERE?MsgID="?&?rst("MsgID")
70????????????'rst.Delete
71????????????Wscript.Sleep?10*1000
72????????end?if
73????????
74????????rst.MoveNext
75????Loop
76
77????set?rst?=?Nothing
78????cnSrc.close
79????objLogFile.Close
80????Wscript.Sleep?CycleTime*1000*60
81WEnd
腳本需要在RTX服務(wù)器上運(yùn)行,且SDK Server服務(wù)必須啟動(dòng)。(推薦做法)
如果在其它計(jì)算機(jī)上運(yùn)行腳本,需要安裝RTX的SDK,配置SDK安裝目錄下RTXServerAPI.ini中RTX服務(wù)器的IP地址,還要修改RTX SDK Server的IP限制(修改RTX服務(wù)器安裝目錄下 SDKProperty.XML)。
OK,改完了配置就把服務(wù)重啟一下,然后往消息隊(duì)列表隨便寫點(diǎn)什么內(nèi)容,測試一下腳本運(yùn)行是否正常,再歇一會(huì)兒~~
4.開始寫觸發(fā)器。打開查詢分析器,登陸到ES數(shù)據(jù)庫,選中ESSys數(shù)據(jù)庫,然后執(zhí)行以下SQL腳本。
FG_TR_MessageQueue?1?IF?EXISTS?(SELECT?name?
?2????????FROM???sysobjects?
?3????????WHERE??name?=?N'FG_TR_MessageQueue'?
?4????????AND???????type?=?'TR')
?5?????DROP?TRIGGER?FG_TR_MessageQueue
?6?GO
?7?
?8?CREATE?TRIGGER?FG_TR_MessageQueue
?9?ON?CFWiTodo
10?AFTER?INSERT
11?AS?
12?/***********************************************
13?Author:?碟子?http://cancelpj.cnblogs.com/
14?Date:?2008-02-17
15?Description:?當(dāng)Excel服務(wù)器產(chǎn)生新的工作流待辦事宜時(shí),
16?????將信息發(fā)送到RTX消息隊(duì)列。
17?***********************************************/
18?BEGIN
19?
20?DECLARE???@Receiver???VarChar(20)??
21?DECLARE???@MsgInfo???VarChar(500)??
22???
23?--獲取接收人的RTX號,以及待發(fā)送的消息內(nèi)容。
24?SELECT?@Receiver?=?u.MobilePhone,
25?/**
26?????p.pName+'_'+t.tName?as?[任務(wù)],
27?????case?wi.state1
28?????when?2
29?????????then?isnull(wi.untreadName,wi.creByName)
30?????else?wi.creByName
31?????end?as?[交辦人],
32?????convert(smalldatetime,case?wi.state1
33?????when?2
34?????????then?isnull(wi.UntreadTime,wi.creDate)
35?????else?wi.creDate?
36?????end,120)?as?[交辦時(shí)間],
37?**/
38?????@MsgInfo?=?case?wi.state1
39???????when?1
40???????????then?N'暫存:'
41???????when?2
42???????????then?N'被退回:'
43???????else?''
44???????end?+?'
45?任務(wù):'+
46?????p.pName+'_'+t.tName?+?'
47?交辦人:'+
48?????case?wi.state1
49?????when?2
50?????????then?isnull(wi.untreadName,wi.creByName)
51?????else?wi.creByName
52?????end?+?'
53?交辦時(shí)間:'+
54?????convert(nvarchar,case?wi.state1
55?????when?2
56?????????then?isnull(wi.UntreadTime,wi.creDate)
57?????else?wi.creDate?
58?????end,120)
59?????--?+?wi.wiDesc
60?FROM?CFWorkitems?wi,?CFTasks?t,?CFwiTodo?a,?CFProcesses?p,?Users?u,?Inserted?i?
61?WHERE?u.UserID?=?a.userId?and?wi.wiId?=?a.wiId?--and?wi.tId=t.tId?and?wi.pId=p.pId?
62?????and?t.tType<>3?and?wi.state?=0?and?a.userId?=?i.userId
63?ORDER?BY?(case?wi.state1?when?2?then?isnull(wi.Untreadtime,wi.creDate)?else?wi.creDate?end)?desc?
64?
65?
66?--由于ES本身在存儲(chǔ)表單數(shù)據(jù)的過程中使用了事務(wù),再在觸發(fā)器中操作遠(yuǎn)程數(shù)據(jù)庫就會(huì)引起【嵌套事務(wù)】。
67?--以上是個(gè)人猜測,未經(jīng)證實(shí);以下是針對“無法在此會(huì)話中啟動(dòng)更多的事務(wù)”的解決方法。
68?--用于?SQL?Server?的?Microsoft?OLE?DB?提供程序不支持嵌套事務(wù)。
69?--因此,對于隱性或顯式事務(wù)的內(nèi)部數(shù)據(jù)修改操作和分布式分區(qū)視圖上的數(shù)據(jù)修改操作,
70?--應(yīng)將?XACT_ABORT?設(shè)置為?ON。
71?SET?XACT_ABORT?ON
72?
73?--用觸發(fā)器修改遠(yuǎn)程數(shù)據(jù)的兩種方式。
74?--方式一:較安全,配置較復(fù)雜。
75?--????需要在源數(shù)據(jù)庫服務(wù)器建立一個(gè)指向目標(biāo)服務(wù)器的鏈接服務(wù)器,
76?--????登陸方式保存在鏈接服務(wù)器中,不會(huì)在觸發(fā)器中顯示,比較安全。
77?/**
78?INSERT?INTO?[RTX數(shù)據(jù)庫地址].RTX.dbo.Msg_Queue(Receiver,Title,MsgInfo)?
79?????VALUES(@Receiver,'Excel服務(wù)器消息提醒',@MsgInfo)???
80?**/
81?--方式二:不安全,無需另外配置。
82?INSERT?INTO?OPENDATASOURCE('SQLOLEDB','Data?Source=RTX數(shù)據(jù)庫地址;User?ID=rtx;Password=rtx'
83?????).RTX.dbo.Msg_Queue(Receiver,Title,MsgInfo)?
84?????VALUES(@Receiver,'消息提醒','Excel服務(wù)器消息提醒
85?'+@MsgInfo)???
86?
87?END
88?
89?GO
90?
91?--設(shè)置該觸發(fā)器為最后執(zhí)行
92?EXEC?sp_settriggerorder?'FG_TR_MessageQueue','Last','Insert'
由于我的RTX數(shù)據(jù)庫和ESSys數(shù)據(jù)庫不在同一臺(tái)服務(wù)器上,因此SQL腳本中涉及到用觸發(fā)器修改遠(yuǎn)程數(shù)據(jù)庫的問題,需要對服務(wù)器的MDTC安全選項(xiàng)進(jìn)行配置;如果在同一臺(tái)數(shù)據(jù)庫上那就不需要了,簡單修改一下SQL腳本的相關(guān)代碼就可以。
MSDTC安全選項(xiàng)的配置如果不對,在ES中保存工作流表單時(shí)就會(huì)出現(xiàn)“新事務(wù)不能登錄到指定的事務(wù)管理器中”的錯(cuò)誤。我的配置方式如下圖,安全性低,不推薦模仿,僅供參考。
管理工具—— 組件服務(wù)——我的電腦——屬性
源服務(wù)器(ESSys所在的服務(wù)器)
?
目標(biāo)服務(wù)器(RTX數(shù)據(jù)庫所在服務(wù)器)
如果設(shè)置為“要求對雙方進(jìn)行驗(yàn)證”,那么安全性就有保障了,不過我不知道在這種情況下DTC登陸帳戶應(yīng)該如何設(shè)置,萬望高手賜教!!
?
OK,基本上大功告成了,江湖慣例,上效果圖~
?相關(guān)代碼下載:SendNotify_V1_fix.rar (最近發(fā)現(xiàn)消息不能群發(fā)所有人,原來是SendNotify.vbs中關(guān)于iSendMode的處理參數(shù)寫錯(cuò)了,請重新下載,抱歉抱歉~)
?
PS:老大說我的這個(gè)設(shè)計(jì)架構(gòu)對RTX服務(wù)器的耦合度太高,應(yīng)該讓RTX服務(wù)器對其它應(yīng)用服務(wù)器透明,所有配置只在RTX服務(wù)器這邊完成,其它應(yīng)用服務(wù)器只提供各自的消息隊(duì)列表,我覺得蠻有道理的,不過那樣就不能用腳本來寫程序了,所有應(yīng)用服務(wù)器的后臺(tái)數(shù)據(jù)庫密碼要明文寫在腳本里面太不安全了,過段時(shí)間用其它語言寫一個(gè)像模像樣的程序吧,最好還是運(yùn)行后在桌面右下角有圖標(biāo)的~~
?
拋磚引玉,如果看官從中獲得了一點(diǎn)點(diǎn)啟發(fā),那我就很欣慰了,如果你把我后面想做的事都做了,就把代碼發(fā)我一份吧~~ (懶人嘛)
轉(zhuǎn)載于:https://www.cnblogs.com/cancelpj/archive/2009/02/17/1392425.html
總結(jié)
以上是生活随笔為你收集整理的【腾讯通服务器的消息集成解决方案】之与勤哲Excel服务器的集成的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 笔记“SQL与Access”
- 下一篇: eigrp ospf 邻居建立过程比