二开案例.WebApi.缓存清理

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:1

二开案例.WebApi.缓存清理

【应用场景】

直接去数据库改了基础资料数据,登录金蝶云星空,在业务单据上看到的对应基础资料数据还是修改前的数据,未及时刷新,此时,可通过设定某个程序主动调用WebApi,完成对指定的应用站点下的指定缓存块的缓存刷新。


【案例演示】

数据库直接改了物料名称,打开采购订单列表,能立即看到最新的物料数据。


【实现步骤】

<1>添加自定义WebApi接口类,实现缓存清理的功能,代码如下。

using Kingdee.BOS.App.Core;

using Kingdee.BOS.Core.Const;

using Kingdee.BOS.ServiceFacade.KDServiceFx;

using Kingdee.BOS.ServiceHelper;

using Kingdee.BOS.Util;

using Kingdee.BOS.WebApi.ServicesStub;

using System.Collections.Generic;


namespace Jac.XkDemo.BOS.WebApi

{

    /// <summary>

    /// 【WebApi】缓存清理

    /// </summary>

    public class CacheManagerWebApiService : AbstractWebApiBusinessService

    {

        public CacheManagerWebApiService(KDServiceContext context)

            : base(context)

        {

            //

        }


        /// <summary>

        /// 清理缓存(整个基础资料的数据缓存全清)

        /// </summary>

        /// <param name="formIds">业务对象标识</param>

        /// <returns></returns>

        public bool ClearCacheByFormIds(List<string> formIds)

        {

            if (formIds == null || formIds.Count == 0)

            {

                return false;

            }


            var area = this.KDContext.Session.AppContext.GetAreaCacheKey();

            foreach (var formId in formIds)

            {

                var metadata = FormMetaDataCache.GetCachedFormMetaData(this.KDContext.Session.AppContext, formId);

                if (metadata != null)

                {

                    CacheUtil.ClearCache(area, metadata.BusinessInfo.GetEntity(0).TableName);

                    CacheUtil.ClearCache(this.KDContext.Session.AppContext.DBId + formId, CacheRegionConst.BOS_QuickBaseDataCache);

                }

            }


            return true;

        }


        /// <summary>

        /// 清理缓存(只清理指定内码的数据缓存)

        /// </summary>

        /// <param name="formId">业务对象标识</param>

        /// <param name="keys">数据内码</param>

        public bool ClearCacheByPrimaryKeys(string formId, List<string> keys)

        {

            if (keys == null || keys.Count == 0)

            {

                return false;

            }


            var metadata = FormMetaDataCache.GetCachedFormMetaData(this.KDContext.Session.AppContext, formId);

            if (metadata == null)

            {

                return false;

            }


            using (DataEntityCacheManager cacheManager = new DataEntityCacheManager(this.KDContext.Session.AppContext, metadata.BusinessInfo.GetDynamicObjectType()))

            {

                cacheManager.RemoveCacheByPrimaryKeys(keys);

            }


            CacheUtil.ClearCache(this.KDContext.Session.AppContext.DBId + formId, CacheRegionConst.BOS_QuickBaseDataCache);

            return true;

        }

    }

}


<2>拷贝WebApi接口组件到应用站点的WebSite\Bin目录下,重启IIS,开发完毕。



接下来是验证我们新加的WebApi接口。

【WebApi单元测试示例】

<1>添加WebApi单元测试类,代码如下。

using Kingdee.BOS.WebApi.Client;

using Microsoft.VisualStudio.TestTools.UnitTesting;

using System.Collections.Generic;


namespace Jac.XkDemo.BOS.WebApi.Tests

{

    [TestClass]

    public class CacheManagerWebApiServiceTests

    {

        #region 测试参数


        private string url = "http://localhost/k3cloud/";

        private string dbid = "5f3a43d65be160";

        private string userName = "demo";

        private string password = "888888";

        private int lcid = 2052;


        #endregion


        [TestMethod]

        public void ClearCacheByFormIdsTest()

        {

            // Init

            var apiClient = new K3CloudApiClient(url);

            var isLoginOk = apiClient.Login(dbid, userName, password, lcid);

            var rval = false;

            // Action

            if (isLoginOk)

            {

                // 清空物料的所有数据缓存(传入参数为物料的业务对象标识)

                rval = apiClient.Execute<bool>("Jac.XkDemo.BOS.WebApi.CacheManagerWebApiService.ClearCacheByFormIds,Jac.XkDemo.BOS.WebApi", new object[] {new List<string>(new[] {"BD_MATERIAL"})});

            }


            // Assert

            Assert.IsTrue(isLoginOk);

            Assert.IsTrue(rval);

        }


        [TestMethod]

        public void ClearCacheByPrimaryKeysTest()

        {

            // Init

            var apiClient = new K3CloudApiClient(url);

            var isLoginOk = apiClient.Login(dbid, userName, password, lcid);

            var rval = false;

            // Action

            if (isLoginOk)

            {

                // 清空物料的指定的某两条数据的数据缓存(传入参数为物料的业务对象标识)

                rval = apiClient.Execute<bool>("Jac.XkDemo.BOS.WebApi.CacheManagerWebApiService.ClearCacheByPrimaryKeys,Jac.XkDemo.BOS.WebApi", new object[] {"BD_MATERIAL", new List<string>(new[] {"187802", "187803"})});

            }


            // Assert

            Assert.IsTrue(isLoginOk);

            Assert.IsTrue(rval);

        }

    }

}


<2>启动调试测试,完成单元测试。


测试步骤如下:

<1>登录业务站点,打开采购订单列表(此时会产生物料数据的缓存)。

<2>连接到数据库,在业务数据库中执行修改物料的SQL,例如:

UPDATE T_BD_MATERIAL_L SET FNAME=FNAME+'666' WHERE FMATERIALID IN (187802,187803)

<3>再次打开采购订单列表,此时显示的物料数据还是旧的缓存数据。

<4>启动单元测试,确保WebApi接口被调用成功。

<5>再次打开采购订单列表,此时显示的物料数据已经是最新的数据啦。







【参考资料】

【二开案例.WebApi.从零开发自定义WebApi接口】https://vip.kingdee.com/article/97030089581136896

【K/3 Cloud系统集成】https://vip.kingdee.com/article/9185

















【金蝶云星空BOS二次开发案例演示】https://vip.kingdee.com/article/94751030918525696

二开案例.WebApi.缓存清理

【应用场景】直接去数据库改了基础资料数据,登录金蝶云星空,在业务单据上看到的对应基础资料数据还是修改前的数据,未及时刷新,此时,可...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息