陈清红
2025-04-14 880f3c0257eeb8c37761d484258fdd102a369a19
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Quintiq file version 2.0
#parent: #root
StaticMethod AppendFinalize (LibOpt_Task task, stream[JSON] str) as stream[JSON]
{
  Description:
  [*
    Add the `LibOpt_Component.OnFinalize` step to the given stream.
    This will create a new stream that deletes the task after the given stream is finished.
  *]
  TextBody:
  [*
    component := task.Component();
    
    do_finalize := str->|component->DoFinalize( task );
    
    // Handle exception has a higher priority to make sure the run can be set as failed.
    // When the run is set as failed, no other calls to `OnFinalize` are made.
    // When a task is finalized, all its children tasks are also finalized.
    // This means that if the child task throws an error when finalizing, the parent task will too.
    // By calling the error handling with elevated priority, we force the error handling before any other calls to `DoFinalize`.
    // This allows us to set the run to be failed, allowing us to stop finalizing tasks and thus stop throwing more errors.
    handle_error := task->Annotate( ReactiveAnnotation::Priority( 1 ) )->HandleExceptionFinalize( do_finalize->Exception() );
    
    // Note that the below Merge method is also emitting str. 
    // By using the Merge method, 'str' can be emitted before handle_error and do_finalize are completed. 
    // This leads to a speedup in the optimizer.
    return str->Merge( handle_error->|stream[JSON]::Success(),
                       do_finalize->IgnoreException() );
  *]
}