朱 佳,李慶坤
(1.江蘇省蘇州市城市管理監督指揮中心,江蘇 蘇州 215000;2.北京數字政通科技股份有限公司,北京 100000)
在數字化城市管理建設的過程中,會根據城市的行政級別、規模、職能部門設置等具體情況,進行因地制宜的數字城市管理模式建設。在十多年不斷的改革和實踐中,數字化城市管理探索出五類監督指揮模式,分別是一級監督一級指揮、一級監督兩級指揮、兩級監督一級指揮、兩級監督兩級指揮以及綜合監督管理模式。各個地區可以根據自己城市的實際規模和工作需要,選擇其中適合自己的一類進行擴展完善。
蘇州市數字城管建設時考慮到蘇州市各區城市管理的實際運行情況,采用了兩級監督兩級指揮的監督管理模式,如圖1所示。市區兩級各有自行獨立的數字城管業務系統,同時擁有自己的信息采集來源渠道,既可在各自平臺進行獨立監督指揮,又能夠根據實際需要將問題上報市級平臺或接收市級平臺下派的問題,保證了城市管理問題處置的靈活性,提升了問題屬地處置效率和處置效果。
為了能將各下轄區縣級子系統互連互通,并在之間較好地傳遞數據、交換信息,系統集成性能的安全性和穩定性至關重要。通過基于WebService技術的擴展標記語言(eXtensible Markup Language,XML)進行多系統間接口的信息交互能夠讓信息更加清晰有序、可讀性強、靈活應對接口協議的變更[1]。

圖1 蘇州市數字城管運行模式現狀
但是由于兩級監督兩級指揮模式涉及市區兩級獨立平臺的數據交互對接(如圖2所示),在實際運行中不可避免地會因為網絡問題或者數據內容寫入錯誤導致工單無法正常傳輸,滯留在接口中影響城市管理問題的及時接收處辦和反饋[2-3]。
針對這些問題,蘇州市數字城管在不斷實踐探索的基礎上,從后端代碼優化到前端機制建立等多角度總結出多個查漏補缺的方法,這些方法互相補充互相完善,為蘇州市兩級數字城管的無故障運行打下了堅實的技術基礎。
蘇州市級數字城管平臺與各個區級平臺之間采用簡單對象訪問協議(Simple Object Access Protocol,SOAP)調用的方式傳遞工單基本數據,并根據實際運行需要開發共計16個對接接口,涉及案件上報、任務分派、拒簽、延期、結案等多個上下行業務交互場景,承載傳遞的數據內容以XML方式進行通信。XML是一種可擴展標記語言,用戶可自定義標簽進行數據傳輸[4]。
但由于標簽的數據類型不同,且用戶行為不一致,會導致很多因為個人習慣或者手誤寫下的字符無法被正確解析入庫,從而導致卡在接口中無法及時在目的平臺生成工單信息。針對這類問題可以通過XML的CDATA函數進行轉義過濾,避免標簽中文本非法字符導致的解析錯誤。
CDATA函數由""結束,它會將方括號內的所有內容當作字符串處理,避免文本中出現XML語言的保留字符或者實體對解析造成影響。
比如未加CDATA轉義符的XML語言執行的市區對接下行任務分派語句為:
結果接收方在執行這段代碼后出現報錯:
DEBUG -【插入數據出錯!】java.sql.SQLException:ORA-00917:缺失逗號。
之所以會報ORA-00917缺失逗號的錯誤,是因為受理員輸入有誤,案發時間的冒號變成了單引號,XML程序在

圖2 信息從市級平臺到區級平臺
“ ‘ ”,未將該符號視作標簽中的普通字符,而是當作正常的XML代碼解析,然而XML代碼要求該符號需要成對出現,但是程序只找到了一個,所以會報缺失逗號的警告。想要去掉該警告,只需要讓XML停止識別此類保留字符,僅視作普通字符串進行傳輸。在XML語言定義中,“<”、“>”、“&”、“‘”、““”這五個字符都是XML語言的保留字符,錯誤地加在XML標簽中將會導致解析程序無法正確讀取標簽而解析報錯,然而在人為輸入描述的過程中不可避免地會有人使用這些符號進行特定的表述或者因手誤輸入錯誤,所以為了避免解析失敗就需要使用進行特殊字符的轉義。
因此上述報錯XML語句在文字描述字段增加函數過濾后變為:
這時再進行XML解析將不再報錯,工單數據可正常入庫并在前端業務系統進行實時展示。
因此為避免工單流轉因人為輸入信息問題導致的特殊字符無法解析,在市區對接中嚴格明確所有人為輸入意見類字符串類型字段均需在傳輸中添加函數進行轉義過濾,以避免這類隱患的再次發生。
因工單本身的文字描述不規范導致的接口解析問題,在一定程度上可以通過上述轉義字符方式避免。但是接口傳輸不可避免地會受到網絡環境等客觀因素影響,而網絡環境波動導致的影響與需發送的數據內容無關,無需人為介入修改任何信息,僅需要在網絡情況恢復時再次重發即可。此時就需要后臺程序定時掃描失敗任務并自行調用接口程序重新發送。
據了解,數字城管各市區對接項目都建立了失敗任務自動重發機制,但是其重發機制是失敗后連續重新執行3~5次,重發的間隔有時還不到1 s,但是很多網絡波動導致的失敗在幾秒內可能無法恢復,因此短時間內多次重發在大多數情況下沒有良好效果。
針對這個問題并結合實際情況,蘇州市級數字城管優化了接口數據重發機制,從不間斷短時間多次調用改為首次失敗后每隔10 min重新發送一次,連續發送3次。仍然失敗的拉長重發間隔,半小時重發一次,連續發送3次。通過優化這個機制盡量避開一些偶然因素導致的接口掉線情況。
然而一直不停地持續重發也沒有意義,在實際運行中必然存在某些地區因為網絡故障或者設備檢修等原因停電斷網數小時的情況,所以設定最大重發次數上限為6次,如果一張工單兩個小時都無法發送成功,就會停止重發并在業務前端相關人員工作界面進行顯示(如圖3所示)。

圖3 需重發內容的前端提示截圖
蘇州市級數字城管在數據庫接口表里通過Taskstateid來標識任務是否成功,失敗的任務會將該值置為-1。同時還有一個Retrytimes字段用來標識任務重發的次數。當定時輪詢任務掃描到Taskstateid=-1的任務,接口就會自動執行重發,每發送一次Retrytimes字段值+1(表1),網絡正常的情況下大部分任務均會在3次之內發送成功,而那些Retrytimes>3且Taskstateid=-1的任務則會顯示在管理員賬號的業務系統前臺任務欄。

表1 數據庫重發字段信息
在網絡服務中斷或者停電等導致接口超時的狀況恢復后,相應人員可以在任務欄選中工單并點擊重發按鈕,系統會在數據庫中將對應任務的Retrytimes重置為0,上述輪詢程序掃描到該任務以后會繼續向目的區平臺發送請求,因網絡問題導致的接口滯留基本可以通過該手段解決,既避免聯系信息技術人員后臺處理耗時費力延誤工單處置,又進一步增強了用戶的使用便捷性和主動性。
近年來,手機短信息服務(SMS)在我國得到廣泛應用,在電子政務建設中,短信息服務可以用于業務流轉提醒、事項告知、受理答復通知等情景[5-6]。因此重發機制可以配合短信預警機制共同使用,建立完善的短信預警機制并設定對應預警場景。
比如,當接口任務返回報錯語句中包含“ConnectException、Timeout”等常見接口返回報錯關鍵字的時候,工單進入重發欄并根據定時任務設計的間隔開始輪巡掃描計數,超過一張則調用短信發送程序,發送短信到指定接收預警手機號。
重發欄短信預警機制核心語句如下:
select count(*) into iCount from tobuffertask where taskstateid=-1 and retrytimes=6 and (callinfo like ′%ConnectException%′ or callinfo like ′%Timeout%′);
if iCount > 0 then
sMsgText:= ′[重發欄預警]有′||iCount||′張工單未能成功同步,請及時重發。′;
其中短信發送服務直接調用短信平臺發布的WebService地址,調用方法如下:
MessageService.MessageService messageService = new Oceansoft.SMS.WebUI.MessageService.MessageService();
StringreturnGuid=messageService.SendMessage(sendMobile,reciveMobiles,content,code,userName);
對應的發送短信XML結構為:
重發欄預警只是短信預警方式中最基本的一種,除此以外還有任務積壓預警、長時間無單預警等。比如蘇州市數字城管設置當市區接口超過20條任務未執行,則發送短信,因為正常情況下市區對接接口是不會積累20條以上的任務無法處理的,所以超過20條極有可能代表市區接口程序異常導致任務積壓,需要及時主動排查解決。
任務積壓短信預警機制核心語句如下:
select count(*) into iCount from dltrans.tobuffertask b where b.sendercode′00′ and b.taskstateid=0;
if iCount > 20 then
sMsgText:= ′市區下行接口程序可能發生異常,′||iCount||′條任務未發送,請及時排查。′;
同樣,根據實際運行模式和對接需要,建立其他各種預警場景,并設置對應短信觸發情景和內容,可直觀清楚地提醒相關運維人員把握對接接口運行情況。
轉義符和前臺重發機制分別解決了因主觀原因輸入錯誤引起的接口異常,以及因客觀接口網絡問題引起的傳輸異常,但是由于對接平臺的多量化會導致對接問題的多樣化,因此針對不屬于上述兩個原因的對接問題就需要用其他方法進行解決排查歸類。
蘇州市級數字城管使用的前端接口異常查詢功能會將所有Taskstateid=-1的任務羅列出來,對于前臺重發機制是一種有效補充,因為前臺重發機制僅會將某幾類可以通過重發解決的報錯顯示在前臺供相關人員手動重發,但接口異常查詢功能卻可以顯示所有失敗的任務,這些任務的失敗原因也是多種多樣的。查詢界面主體字段如圖4所示。

圖4 接口異常查詢界面
運維人員可以定期到該頁面查詢一段時間內的異常對接報錯工單,并針對報錯具體問題具體分析,一一排查解決并及時優化重發及預警邏輯,以避免交辦工單長時間停滯在接口中。建立前端接口異常查詢功能也僅是一種查詢和預警手段,具體問題的解決還是需要聯系信息技術人員進一步排查,并根據排查結果督促對接雙方相對應地做好防范措施,盡量避免同樣的報錯再次發生影響日常的業務工作。
兩級監督兩級指揮的城市管理模式涉及多個業務平臺之間的信息交互,所以對接機制的完善非常重要,要能夠盡量充分地考慮到各種情況下的對接情形。蘇州市數字城管在這種管理模式下,基于WebService技術,探索并建立了完善的接口對接機制,在很大程度上保證了工單流程的順暢,提升了城市管理的效率[7]。同時WebService的松耦合方式也有助于增量方式開發、部署分布式計算環境,極大地降低了電子政務的成本,為持續性開發提供了良好基礎[8]。