0

当 cadence worker 出现时,它会初始化某些资源,例如数据库连接和其他服务的客户端。使这些资源可以从活动实现中访问的正确模式是什么?

4

2 回答 2

1

您可以通过上下文将您的活动所需的任何内容传递给您的活动。

下面是它的工作原理:

1)在你开始你的工人之前,将你需要的任何东西设置为一个上下文(下面的代码发生在你设置你的工人的地方):

myThriftClient := ... // create my thrift client
myContext := context.WithValue(context.Background(), "my_thrift_client", myThriftClient)

2) 使用在第 1 步中创建的上下文作为您用于启动工作人员的工作人员选项的 BackgroundActivityContext:

workerOptions := cadence.WorkerOptions{
    MetricsScope:          myScope,
    Logger:                myLogger,
    BackgroundActivityContext: myContext,
}
worker := cadence.NewWorker(service, domain, taskList, workerOptions)

3)在您的活动代码中,从上下文中检索您的节俭客户端:

func MyActivity(ctx context.Context) error { 
  myThriftClient := ctx.Value("my_thrift_client").(ThriftClient)
  // now you can make thrift calls using myThriftClient
}

爪哇

Worker.registerActivityImplementations接受一个活动对象实例。因此,任何依赖项都可以在此对象注册到 worker 之前与它相关联。

Worker.Factory factory = new Worker.Factory(DOMAIN);
Worker worker = factory.newWorker(TASK_LIST);
// Initialize activities instance with all its dependencies
MyActivities activities = new MyActivitiesImpl(dbPool, serviceAClient);
worker.registerActivitiesImplementations(activities);
// Start listening to the workflow and activity task lists.
factory.start();
于 2019-09-30T15:26:17.993 回答
0

在Java中,我们使用供应商传递有状态的客户端和服务,如gcs,数据库......所以在每个活动运行的基础上我们如何实现供应商的get方法,所请求的客户端/服务被提供给活动而不需要在 activityImpl 实例化时预先实例化它们。

于 2019-10-02T17:42:46.947 回答