我正在编写一个使用cadence工作流的项目(cadenceClient3.6.2),我在2018年通过maxim观看了一个谈话,其中提到,cadence工作流是虚拟对象,最好不要将它们视为具有起点和端点的进程,因为它们可以始终处于活动状态。
public interface SubscriptionWorkflow {
@WorkflowMethod
void manageSubscription(String customerId);
@SignalMethod
void cancelSubscription();
@SignalMethod
void updateBillingPeriodChargeAmount(int billingPeriodChargeAmount);
@QueryMethod
String queryCustomerId();
@QueryMethod
int queryBillingPeriodNumber();
@QueryMethod
int queryBillingPeriodChargeAmount();
}
这部分代码来自https://cadenceworkflow.io/docs/concepts/workflows/#example
在实现工作流时,需要通过如下代码指定executionStartToCloseTimoutSeconds
public interface SubscriptionWorkflow {
@WorkflowMethod(executionStartToCloseTimoutSeconds = ...)
void manageSubscription(String customerId);
...
}
或者动态地喜欢
WorkflowOptions options = new WorkflowOptions.Builder().setWorkflowId(...).setTaskList(...)
.setExecutionStartToCloseTimeout(...).build();
WorkflowStub workflowStub = workflowClient.newUntypedWorkflowStub("SubscriptionWorkflow::manageSubscription",options);
workflowStub.start(...);
它也可以从cli中传递。
docker run --network=host --rm ubercadence/cli:master --do test-domain workflow start --tasklist the_default_task_list --workflow_type SubscriptionWorkflow::manageSubscription --execution_timeout 3600 --input \"id\"
在不指定此超时的情况下启动工作流似乎是可能的,对于工作流中的所有活动也是如此。
如果我想让工作流在我的情况下永远存在,有没有办法不添加超时呢?其活动也一样
这是否被认为是一个坏的设计,拥有永久的工作流程,在一般情况下?
发布于 2022-09-28 17:30:28
我假设您的工作流将永远运行,因为它正在实现某种循环。
在这种情况下,工作流最终将构建一个如此大的历史对象,使其不再具有性能,因为每个循环迭代都会被持久化,然后再进行处理。
最终,它将打击配置限制的历史事件和失败。
不知道为什么要永远运行工作流,就很难提供解决方案。
您可以使用Workflow.continueAsNew()进行调查,它创建了一个具有相同ID的新工作流,但是可以重新启动历史记录,然后避免遇到任何限制。
https://stackoverflow.com/questions/73847041
复制相似问题