- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我们的 Cadence 工作流中,我们经常需要在继续之前为外部事件等待一定的时间(即电子邮件已读、链接已点击等)。
我想知道将这些事件通知我们的工作流程的最佳方式是什么。信号是正确的方式,还是我们应该创建一个等待事件的事件?
据我所知,我们需要创建一个信号 channel ch := workflow.GetSignalChannel(ctx, SignalName)
,但是上下文在事件中不可用。
最佳答案
信号是向工作流发送事件的推荐方式。
Go 工作流的常用模式是使用 Selector 等待多个信号 channel 以及一个定时器 future 。
去样本:
sig1Ch := workflow.GetSignalChannel(ctx, "signal1")
sig2Ch := workflow.GetSignalChannel(ctx, "signal2")
timeout := workflow.NewTimer(ctx, time.Minute * 30)
s := workflow.NewSelector(ctx)
var signal1 *Signal1Struct
var signal2 *Signal2Struct
s.AddFuture(timeout, func(f Future) {
})
s.AddReceive(sig1Ch, func(c Channel, more bool) {
c.Receive(ctx, signal1)
})
s.AddReceive(sig2Ch, func(c Channel, more bool) {
c.Receive(ctx, signal2)
})
s.Select(ctx)
if signal1 == nil && signal2 == nil {
// handle timeout
} else {
// process signals
}
Java 示例:
public interface MyWorkflow {
@WorkflowMethod
void main();
@SignalMethod
void signal1(Signal1Struct signal);
@SignalMethod
void signal2(Signal2Struct signal);
}
public class MyWorkflowImpl implements MyWorkflow {
private Signal1Struct signal1;
private Signal2Struct signal2;
@Override
public void main() {
Workflow.await(Duration.ofMinutes(30),
() -> signal1 != null || signal2 != null);
if (signal1 == null && signal2 == null) {
// handle timeout
}
// process signals
}
@Override
public void signal1(Signal1Struct signal) {
signal1 = signal;
}
@Override
public void signal2(Signal2Struct signal) {
signal2 = signal;
}
}
请注意,考虑工作流工作器中断是个好主意。例如,假设上述工作流已启动,并且在启动后 40 分钟收到信号,而所有工作流工作人员都已关闭。在这种情况下,当 worker 被带回来时,timeout
future 和 signCh
都不是空的。由于 Selector 不保证顺序,因此即使信号是在计时器之后收到的,信号也有可能在计时器之前传送。所以你的代码逻辑应该考虑到这一点。例如,硬性要求必须忽略工作流开始后 30 分钟后收到的信号。然后上面的示例必须修改为:
去样本:
...
start := workflow.Now(ctx); // must use workflow clock
s.Select(ctx)
duration := workflow.Now(ctx).Sub(start)
if duration.Minutes() >= 30 || (signal1 == nil && signal2 == nil) {
// handle timeout
} else {
// process signals
}
Java 示例:
public void main() {
long start = Workflow.currentTimeMillis(); // must use workflow clock
Duration timeout = Duration.ofMinutes(30);
Workflow.await(timeout, () -> signal1 != null || signal2 != null);
long duration = Workflow.currentTimeMillis() - start;
if (timeout.toMillis() <= duration || (signal1 == null && signal2 == null)) {
// handle timeout
}
// process signals
}
即使工作流执行延迟一个小时,更新后的代码也能正常运行。
去样本:
c, err := client.NewClient(client.Options{
HostPort: client.DefaultHostPort,
})
if err != nil {
log.Fatalln("Unable to create client", err)
}
defer c.Close()
err := c.SignalWorkflow(context.Background(), <workflowId>, "", "signal1", Signal1Struct{})
Java 示例:
WorkflowServiceStubs service = WorkflowServiceStubs.newInstance();
WorkflowClient client = WorkflowClient.newInstance(service);
GreetingWorkflow myWorkflow =
client.newWorkflowStub(MyWorkflow.class, <workflowId>);
myWorkflow.signal1(new Signal1Struct());
关于cadence-workflow - 将外部事件发送到工作流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56568871/
我正在尝试使用 Uber Cadence 了解子工作流程的用例。与简单地将工作流程拆分为函数相比,子工作流程的优势是什么?我有一个相当复杂的工作流程,我正在考虑将其拆分为多个子工作流程,但我不确定这样
在有关工作流程重置的设计中我应该考虑什么? 最佳答案 工作流程重置可能是 Cadence/Temporal 中最强大、最独特的功能。它允许您将任何工作流程执行重置到历史记录的任何先前点,并保留所有信号
我正在尝试执行 https://cadenceworkflow.io/docs/06_javaclient/01_quick_start 中提供的 Cadence java 客户端示例当我使用 CLI
在我们的 Cadence 工作流中,我们经常需要在继续之前为外部事件等待一定的时间(即电子邮件已读、链接已点击等)。 我想知道将这些事件通知我们的工作流程的最佳方式是什么。信号是正确的方式,还是我们应
Temporal.io与cadenceworkflow.io有何关系?如果根据节奏工作流服务启动新项目,应该使用什么? 最佳答案 免责声明:我是Cadence项目的原始联合创始人和技术主管,目前是Te
对于长时间运行的事件,我们可以使用心跳来通知事件是在运行还是停止。 我们有一个工作流,它根据父工作流生成的分组调用带有一些参数的多个子工作流。子工作流程是长期运行的工作流程。 有没有办法让子工作流发送
节奏默认使用什么时区? 如何根据时区更改cron表达式?例如,如果用户输入的时间与节奏的服务器时区不同,则假设用户每天输入格林尼治标准时间+ 5下午1点,则该时间应在服务器上午9点运行(假设节奏的服务
-(void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)cha
我正在为使用 UUID 从联系人服务检索联系人的节奏事件功能编写单元测试。我想知道我应该将什么上下文传递给节奏事件。 activity.Register(GetContactActivityFunc)
我有一个单元格(称为A),它在更高层次的单元格(称为P)中使用一次。当我将 A 放在 P 中时,它的边框比 A 的实际内容大得多。当我下降到 A 并进行缩放时,它被缩小了,表明边缘存在一些东西。 我可
是否有 Cadence 工作流根据外部输入更改 sleep 持续时间的示例? 我正在寻找的场景是这样的:工作流进入休眠状态直到时间 X,但在 sleep 开始之后但在它完成之前,有一个外部触发器导致时
在我的单元测试中,我想断言调用了 workflow.Sleep()。我该怎么做? 最佳答案 可以使用 TestWorkflowEnvironment.Now() 函数访问模拟时间。例如: before
如何根据信号更改节奏工作流程中的 sleep 持续时间?这是使用java客户端的正确方法吗? private int timeout; @Override @WorkflowMethod public
我正在通过蓝牙连接到 Cycling Speed 和 Cadence 服务,并将外围设备保存到一个数组中(用于 tableview)。 我已经实现了这个结构 struct BTPeripheral:
我在使用蓝牙 LE 脚踏圈速和速度传感器 (Wahoo SC) 时遇到问题。我使用的是 Android BluetoothGattLe 示例应用程序,我已针对踏频和速度传感器对其进行了调整。 它可以与
我是一名优秀的程序员,十分优秀!