Cadence 工作流:将主机特定对象(如数据库连接、服务客户端等)传递给 activity 实现
Cadence Workflow: Pass host specific objects like database connections, service clients, etc to activity implementation
当 cadence worker 出现时,它会初始化某些资源,如数据库连接和其他服务的客户端。使这些资源可从 activity 实现访问的正确模式是什么?
去
您可以通过上下文将您的 activity 需要的任何内容传递给您的 activity。
这是它的工作原理:
1) 在开始你的 worker 之前,将你需要的任何值设置为一个上下文(下面的代码发生在你设置你的 worker 的地方):
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) 在您的 activity 代码中,从上下文中检索您的节俭客户端:
func MyActivity(ctx context.Context) error {
myThriftClient := ctx.Value("my_thrift_client").(ThriftClient)
// now you can make thrift calls using myThriftClient
}
Java
Worker.registerActivityImplementations
接受一个 activity 对象实例。因此,任何依赖项都可以在该对象注册到 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();
在 Java 中,我们使用 Suppliers 来传递有状态的客户端和服务,例如 gcs、数据库...
所以在每个 activity 运行 上,基于我们如何实现 Supplier 的 get 方法,请求的 client/service 被提供给 activity,而不需要事先实例化它们activity实现实例化。
当 cadence worker 出现时,它会初始化某些资源,如数据库连接和其他服务的客户端。使这些资源可从 activity 实现访问的正确模式是什么?
去
您可以通过上下文将您的 activity 需要的任何内容传递给您的 activity。
这是它的工作原理:
1) 在开始你的 worker 之前,将你需要的任何值设置为一个上下文(下面的代码发生在你设置你的 worker 的地方):
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) 在您的 activity 代码中,从上下文中检索您的节俭客户端:
func MyActivity(ctx context.Context) error {
myThriftClient := ctx.Value("my_thrift_client").(ThriftClient)
// now you can make thrift calls using myThriftClient
}
Java
Worker.registerActivityImplementations
接受一个 activity 对象实例。因此,任何依赖项都可以在该对象注册到 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();
在 Java 中,我们使用 Suppliers 来传递有状态的客户端和服务,例如 gcs、数据库... 所以在每个 activity 运行 上,基于我们如何实现 Supplier 的 get 方法,请求的 client/service 被提供给 activity,而不需要事先实例化它们activity实现实例化。