这可能是最完美的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,在弹出窗口后再改代码,虽然热更新了,但界面不会变化,这种需关闭表单重新打开才会有效果。

posted @ 2021-12-01 11:45  苏暖暖  阅读(673)  评论(0编辑  收藏  举报