dispatcher请求调用

背景

在handler中执行耗时比较久的程序时,流程不会立马结束,客户端界面无法执行其他操作,只能等待,解决这种问题有一下3种方式

  1. 通过dispatcher调度程序解决该问题
  2. 通过开发一个war接口,异步执行耗时操作解决该问题
  3. 通过调用exe或bat,主程序不等待bat或exe执行结束也可解决,不过该方式有局限性,bat或exe必须和客户端在一台电脑上
  1. 本次介绍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

  • 14
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Dispatcher是一个常用的设计模式,用于将请求与处理程序进行解耦。它允许根据请求的类型将请求分发给不同的处理程序。以下是一个示例,演示了如何使用Dispatcher模式来处理不同类型的请求。 ```python class Dispatcher: def __init__(self): self.handlers = {} def add_handler(self, request_type, handler): self.handlers[request_type] = handler def dispatch(self, request): request_type = request.get('type') if request_type in self.handlers: handler = self.handlers[request_type] handler.handle(request) else: print("No handler found for request type: ", request_type) class RequestHandler: def handle(self, request): raise NotImplementedError("Subclasses must implement handle() method") class LoginHandler(RequestHandler): def handle(self, request): print("Handling login request:", request) class LogoutHandler(RequestHandler): def handle(self, request): print("Handling logout request:", request) # 创建一个Dispatcher对象 dispatcher = Dispatcher() # 创建不同类型的请求处理程序 login_handler = LoginHandler() logout_handler = LogoutHandler() # 将处理程序添加到Dispatcherdispatcher.add_handler('login', login_handler) dispatcher.add_handler('logout', logout_handler) # 创建不同类型的请求 login_request = {'type': 'login', 'username': 'user1', 'password': 'pass1'} logout_request = {'type': 'logout', 'username': 'user1'} # 分发请求 dispatcher.dispatch(login_request) dispatcher.dispatch(logout_request) ``` 这个例子中,我们创建了一个Dispatcher类,它维护了一个字典,将请求类型与处理程序进行映射。我们还创建了两个处理程序:LoginHandler和LogoutHandler,它们分别处理登录和注销请求。我们将这些处理程序添加到Dispatcher中,并通过调用dispatch方法来分发请求
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值