這可能是最完美的K3Cloud插件熱更新方案了...


特別聲明

之所以會有這篇文章,是因為本人在使用過程中發現,金蝶自帶的熱更新不好用(具體下面有描述),但是和個別QQ好友溝通時發現,他們的熱更新並沒有問題。所以本文只適合金蝶自帶熱更新有異常想換掉的同學,其他的直接右上角關掉...

前言

眾所周知,金蝶K3Cloud的插件更新后是要重啟IIS的。重啟后系統還比較卡,而且要重新登錄啥的,非常麻煩。目前也有不少熱更新的方案,早期我也做過反射熱更新的,但始終有點不方便(詳見方案說明),之前翻翻金蝶的接口,發現了有方法可以修改運行時的原數據,所以有了本文。

現有方案

反射、MEF等方法

  • 說明
    本人做過反射方法,也發現有人用過MEF實現的熱更新。本質是寫個標准金蝶金蝶插件,通過加載實際插件,並轉發事件達成熱更新的效果。

  • 優點
    沒什么特殊的優點...

  • 缺點
    BOS IDE需要掛個假插件,實際發布的時候又要取消掉再掛上正式的插件,很麻煩。

金蝶標准方案

  • 說明
    金蝶自帶方案本應是最完美的方案,畢竟可以修改原代碼,按道理說根本沒第三方方案的事。然而給你機會你不中用啊...

  • 優點
    無侵入性,BOS IDE無需任何額外配置。不需要發布時候做特殊處理。

  • 缺點
    本人以v7.6版本親測(其他版本不好說),不好用...

    1. 穩定性太差。測試時發現,只有第一次更改插件會熱更新,第二次以后均無效果...(這個我也見過有人說過,應該不只我一個人遇到)

    2. 無法調試。這是最致命的問題。熱更新的后的dll沒辦法調試,我推測可能跟其了更是實現的方法有關,它是復制dll到另外目錄實現熱更新,具體沒仔細研究。

    3. 表單需關閉重開才能實現熱更新

本方案特點

  1. 無侵入性:不會永久修改元數據。無需做任何特殊即可實現熱更新,否則總會有失誤忘記修改的時候。
  2. 自動禁用BOS插件:當要熱更新的插件已經在BOS IDE配置時,正常熱更新插件會觸發一次,BOS IDE配置的插件也會觸發一次,導致插件重復運行。所以,本方案運行時,如果BOS IDE已配置相同插件,則BOS IDE配置的插件會被自動禁用。
  3. 即時熱更新 :不需要關閉單據重新打開也能熱更新。
  4. 可調試:這很重要,調試不了難道靠ShowMessage彈窗調試嗎。
  5. 統一文件配置,方便管理

使用方法(使用工具)

  • 下載K3CloudDevTools。地址:http://123.57.89.55:996/Home/Download
  • 點擊菜單“插件熱更新”,顯示熱更新界面
    image
  • 維護好金蝶Bin目錄
  • 點擊“添加”,選擇表單ID
  • 在對應的插件欄目輸入真實的插件類名(格式:完整命名空間.類名,dll文件名),多個插件用回車隔開
  • 操作插件比較特殊,需維護:操作代碼=插件內碼,如果一個操作代碼有多個插件,則維護多行
  • 保存,點擊“安裝”,根據實際情況選擇是否重啟IIS或者清除緩存(詳見:需重啟情況說明)
  • 不需要此功能可以點擊卸載,會對安裝時進行的所以操作進行反操作。
  • 新增功能“導入”,可在BOS IDE配置好插件后,點擊導入。系統會自動根據已配置的插件(移除金蝶的插件),其余插件會導入到配置里面,無需維護。

使用方法(手工)

  • 下載工具,從里面復制出文件:K3CloudDevTools.HotPlugin.dll,復制到金蝶WebSite的bin目錄
  • 在Bin目錄新建SuyanaHotPlugin.json文件(文件名必須叫這名字),按以下格式維護數據:
    image
  • 執行SQL
INSERT INTO T_META_FORMMETASERVICEPLUGIN (FID,FOBJECTID,FCLASSNAME,FSEQ) 
VALUES (???,表單標識,'K3CloudDevTools.HotPlugin.AbstractDynamicFormMetaServiceProxyPlugIn,K3CloudDevTools.HotPlugin',999)
  • 首次安裝或添加新表單id時需重啟

需重啟情況說明

本方案在特定情況下需要重啟的

  1. 首次安裝(從未使用本方案或卸載后再次安裝都視為首次安裝)
  2. 新增的業務對象添加插件(這個有辦法可以不重啟,先不弄了,目前需要重啟)

以下情況可以通過清除K3Cloud緩存而不需要重啟(但表單需關閉重開)

  1. 為已有表單添加其他插件
  2. 啟用或禁用

清除緩存方法:金蝶K3Cloud搜索“緩存”,在出來的窗口全選,點“清除”

操作演示

業務對象:動態表單,按鈕Key:FButton1,添加插件,當按鈕點擊時,彈出固定文本和記錄執行時間
測試目的:即時更新、BOS IDE自動禁用同名插件測試、支持調試。
真實插件代碼:

using System;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Util;
namespace HotPluginTest.BusinessPlugIn {
    public class DynamicFormTest: AbstractDynamicFormPlugIn {
        public override void ButtonClick(ButtonClickEventArgs e) {
            base.ButtonClick(e);
            if (e.Key.EqualsIgnoreCase("FButton1")) {
                View.ShowErrMessage("333333");

                //記錄執行日志,用於查詢插件是否與BOS所掛插件重復執行,請查看Bin目錄的!HotPluginLog.log文件查看輸出日志
                var guid = Guid.NewGuid().ToString();
                var dt = DateTime.Now.ToString();
                K3CloudSimpleLogger.Default.Log($"DynamicFormTest-ButtonClick-FButton1 插件已運行於:{dt} {guid}");
            }
        }
    }
}

BOS IDE插件配置:
image

測試截圖:
image

日志:
image

日志說明

本操作會在bin目錄生成文件名為:!HotPluginLog.log的日志文件,如有問題可以查看日期排查原因。

其他說明

  • 只建議在測試環境使用,不要為了方便在正式環境使用,可能會有不可預料的性能或其他問題

  • 本方案需同時滿足3個條件方能運行:數據庫記錄+配置文件+dll。正式環境只要不滿足這3個條件的任何一個就不會影響到正式環境,無需擔心

  • 目前不支持單據轉換插件,沒寫過這插件...

  • 部分插件操作(特別是彈窗)可能因為本身存在緩存導致插件雖然熱更新了,但顯示不會變化。此非熱更新問題,調試是有執行的。已知的有BeforeF7Select,例如修改:e.DynamicFormShowParameter.MultiSelect,在彈出窗口后再改代碼,雖然熱更新了,但界面不會變化,這種需關閉表單重新打開才會有效果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM