背景
在handler中执行耗时比较久的程序时,流程不会立马结束,客户端界面无法执行其他操作,只能等待,解决这种问题有一下3种方式
- 通过dispatcher调度程序解决该问题
- 通过开发一个war接口,异步执行耗时操作解决该问题
- 通过调用exe或bat,主程序不等待bat或exe执行结束也可解决,不过该方式有局限性,bat或exe必须和客户端在一台电脑上
- 本次介绍dispatcher调度程序
2.1使用dispatcher调度程序的前提是Teamcenter必须安装有该模块
2.2 Handler创建dispatcher请求
引入头文件dispatcher_itk.h,方法为DISPATCHER_create_request
示例:
char request_arg[2048];
vector<tag_t> targets;
targets.push_back(rev);
int trans_obj_count = targets.size();
tag_t* primary_objs primary_objs = (tag_t*)MEM_alloc(sizeof(tag_t) *trans_obj_count); // 主对象
const char** request_args = (const char**)MEM_alloc(sizeof(char*) *(1)); // 传参(key=value形式)
string input_str = "";
char* uid_string = NULL;
for (int i = 0; i < trans_obj_count; i++)
{
primary_objs[i] = targets.at(i);
input_str.append(";");
ITK__convert_tag_to_uid(targets.at(i), &uid_string);
input_str.append(uid_string);
}
string uids_str = STString::substring(input_str,1, input_str.length()-1);
memset(request_arg, 0, sizeof(request_arg));
sprintf(request_arg, "rev_uids=%s", uids_str.c_str());
request_args[0] = request_arg;
string provider_name = "SIEMENS"; // provider名称
string service_name = "test"; // 服务名称
ITKCALL(DISPATCHER_create_request(provider_name.c_str(), service_name.c_str(), 3, 0, 0, 0, trans_obj_count, primary_objs, NULL, 1, request_args, "WORKFLOW", 0, NULL, NULL, &request));
2.2创建dispatcherclient jar包
2.2.1 创建普通java工程
创建DispatcherTest工程
lib文件夹下依赖从以下路径获取
2.2.2 创建TaskPrep类
继承com.teamcenter.ets.extract.DefaultTaskPrep,将要传给bat的参数写在testTxt中
2.2.3 创建DatabaseOperation类
继承com.teamcenter.ets.load.DefaultDatabaseOperation
2.2.4 在src下创建DispatcherTest.properties
SIEMENS是provider名,test是服务名,等号后面是类的全限定名
执行顺序:先执行TaskPrep,后执行DatabaseOperation
2.2.5 导出jar包
将导出的jar包放在\Siemens\Dispatcher\DispatcherClient\lib目录下
2.3. 配置
2.3.1 打开\Siemens\Dispatcher\Module\conf\translator.xml文件,加入以下一段配置
provider和service需要和上面程序中调用的一致
dir:可执行程序所在的目录
name:可执行程序名字
optionKey:传给可执行程序的参数,和jar包中addOptions方法中一致,需要传多个参数时,添加多个<Option>标签即可
2.3.2 在\Siemens\Dispatcher\Module\Translators目录下新建一个test文件夹
里面放可执行bat
bat内容:
调度服务执行该bat时,会将testText文件路径传给该bat
2.3.3 修改\Siemens\Dispatcher\DispatcherClient\conf\Service.properties文件
把DispatcherTest.properties加入配置
这样调度服务执行时,通过找到properties文件,去执行对应的TaskPrep和DatabaseOperation