Cadence工作流程:将主机特定对象(例如数据库连接,服务客户端等)传递给活动实现

时间:2019-09-30 15:26:17

标签: cadence-workflow

节奏控制器出现时,它将初始化某些资源,例如数据库连接和其他服务的客户端。使活动实施可访问这些资源的正确模式是什么?

2 个答案:

答案 0 :(得分: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)在您的活动代码中,从上下文中检索您的thrift客户:

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

Java

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();

答案 1 :(得分:0)

在Java中,我们使用Suppliers传递有状态的客户端和服务,例如gcs,数据库... 因此,根据我们如何实现Supplier的get方法而执行的每个活动,都将向活动提供所请求的客户端/服务,而无需在activityImpl实例化之前预先实例化它们。