二开案例.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.缓存清理
本文2024-09-23 04:01:03发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-162572.html