当前位置: 首页 > 知识库问答 >
问题:

如何返回信号的处理结果?

庾奇思
2023-03-14

特别是如果信号处理需要调用一个/一些活动,我如何实现?

我试图返回数据或异常,但它不起作用。

无法从信号方法返回数据。抛出异常将阻止工作流执行。

共有1个答案

唐煜
2023-03-14

在信号方法中返回数据或抛出异常是错误的,因为信号方法是异步的。处理过程必须类似于Kafka处理消息,并且不能通过方法返回结果。

所以下面的代码不起作用:

public class SampleWorkflow{
   public Result mySignalMethod(SignalRequest req){
      Result result = activityStub.execute(req)
      if(...){
          throw new RuntimeException(...)
      }
   return result
   }

}

你必须做什么:

  • 确保信号不返回任何内容
  • 使用查询方法返回结果
  • 在信号方法处理中,将结果存储到工作流状态中,以便查询可以返回状态

如果您还使用设计模式将信号请求存储到队列中,并让工作流方法来处理信号,这将为您带来一些好处。

  • 保证信号处理的FIFO排序
  • 确保重置工作流不会遇到问题——重置后,信号将被保留并移动到工作流历史记录的早期位置。有时工作流不会初始化以重放信号。
  • 也使异常处理更容易

请参见示例代码中的设计模式:Cadence Java sample/Temporal Java sample

如果我们应用了以上所有内容,示例代码应该如下所示:

public class SampleWorkflow{

   private Queue<SignalRequest> queue = new Queue<>();
   private Response<Result> lastSignalResponse;

   public void myWorkflowMethod(){
        Async.procedure(
                () -> {
                    while (true) {
                        Workflow.await(() -> !queue.isEmpty());
                        final SignalRequest req =
                                queue.poll();
                        // alternatively, you can use async to start an activity:  
                        try{
                             Result result = activityStub.execute(req); 
                        }catch (ActivityException e){
                             lastSignalResponse = new Response( e );
                        }

                        if(...){
                            lastSignalResponse = new Response( new RuntimeException(...) );
                        }else{
                             lastSignalResponse = new Response( result);  
                        }
                    }
                });

      ...
   }

   public Response myQueryMethod(){
       return lastSignalResponse;
   }

   public Result mySignalMethod(SignalRequest req){
      queue.add(req)
   }

}

在应用程序代码中,您应该发出信号,然后查询工作流以获得结果:


  workflowStub.mySignalMethod(req)
  Response response = workflowStub.myQueryMethod()

如果您想使用aysnc活动,请遵循以下示例节奏/示例时间

  • 信号通过工作流决策任务(时态工作流任务)执行。决策任务不能返回结果。在当前设计中,没有让决策任务将结果返回到应用html" target="_blank">程序代码的机制。
  • 工作流代码中的抛出异常将阻止决策任务或使工作流失败)。
  • 查询方法旨在返回结果 - 但是,查询无法计划活动或修改工作流状态。
  • 缺少让应用代码进行同步 API 调用以更新和返回数据。它需要一个复杂的设计:https://github.com/temporalio/proposals/pull/53
 类似资料:
  • 问题内容: 我正在使用具有以下签名的类: 我正试图通过其他班级来称呼它: 但是在这里我得到这个错误: 为什么在Class扩展行中将我指定为第三个参数? 问题答案: 您可以通过对返回的AsyncTask调用AsyhncTask的get()方法来获得结果,但是当它等待获取结果时,它将把它从异步任务变成同步任务。 由于您的AsyncTask位于单独的类中,因此您可以创建一个接口类并在AsyncTask中

  • 问题内容: 我只是在Mac OS X中玩信号。 为什么在我的信号处理程序完成后,以下代码为什么没有产生SIGSEGV的默认行为?在Linux下,代码可以正常工作。 编辑: 我得到的输出如下: 问题是我希望程序在输出之后终止,但是它永远运行了,我不得不中断它。 问题答案: 这实际上使我的大脑冻结了几分钟,而在今天和这个年龄段中永远不使用的原因在我体内变得越来越强大。 首先,从手册页 signal()

  • 信号 信号是一种进程间通信(IPC)机制,主要用于处理异步事件。 不同的Unix衍生版所支持的信号类型并不完全相同。除了支持POSIX规定的信号外,还支持其他信号。 术语解释 术语 解释 生成信号 发生了一个需要引起进程注意的事件而导致信号出现时。也叫发送信号 信号交付 被发送信号的那个进程识别到了信号并采取了适当动作。也叫接收信号 信号句柄 当信号出现时调用进行专门处理的函数。这个函数称为捕获函

  • 阻塞信号是保持该信号并推迟发送,直到阻塞解除,但不会丢失。 结构体sigset_t(信号集合) 其中每一位对应系统支持的一种信号。结构体内部是数组。 函数 函数名 描述 [[sigemptyset sigempty]] 初始化信号集为空集 [[sigfillset sigfillset]] 初始化信号集包含全部信号 [[sigaddset sigaddset]] 向信号集中添加信号 [[sigde

  • Linux常用31个信号(1~31)。signal.h中有个常量NSIG定义了信号的个数,其值通常为为64。 编号 信号 编号 信号 编号 信号 1 SIGHUP 2 SIGINT 3 SIGQUIT 4 SIGILL 5 SIGTRAP 6 SIGABRT 7 SIGBUS 8 SIGFPE 9 SIGKILL 10 SIGUSR1 11 SIGSEGV 12 SIGUSR2 13 SIGPIP

  • 我有一个web服务,它从另一个系统接收xml事件,使用特定的工作流处理它们,并将潜在错误列表作为HTTP响应发送回。 事件处理工作流由几个使用Guava的EventBus实现的处理程序(例如:预处理器、持久器和验证器)组成。处理程序相互发送事件。类似这样: 问题是:如何将处理结果从Validator处理程序深度返回到起点(Request estHandler),以便用户接收HTTP响应? 我考虑两