mirror of
https://github.com/sartography/spiff-arena.git
synced 2025-02-13 18:06:32 +00:00
Feature/run error handler from dequeued (#424)
* run the error handler from the dequeued method instead of marking all failed process instances as error w/ burnettk * do not commit some_cache_dir w/ burnettk --------- Co-authored-by: jasquat <jasquat@users.noreply.github.com>
This commit is contained in:
parent
796dc9dbec
commit
1c84e5bb47
1
spiffworkflow-backend/.gitignore
vendored
1
spiffworkflow-backend/.gitignore
vendored
@ -20,3 +20,4 @@ node_modules
|
|||||||
/src/spiffworkflow_backend/config/secrets.py
|
/src/spiffworkflow_backend/config/secrets.py
|
||||||
*null-ls_*
|
*null-ls_*
|
||||||
/local_wheels/*.whl
|
/local_wheels/*.whl
|
||||||
|
/some_cache_dir
|
||||||
|
@ -1,11 +1,9 @@
|
|||||||
from flask import current_app
|
from flask import current_app
|
||||||
from flask import g
|
from flask import g
|
||||||
from spiffworkflow_backend.models.db import db
|
from spiffworkflow_backend.models.db import db
|
||||||
from spiffworkflow_backend.models.message_instance import MessageInstanceModel
|
|
||||||
from spiffworkflow_backend.models.process_instance import ProcessInstanceModel
|
from spiffworkflow_backend.models.process_instance import ProcessInstanceModel
|
||||||
from spiffworkflow_backend.models.process_instance import ProcessInstanceStatus
|
from spiffworkflow_backend.models.process_instance import ProcessInstanceStatus
|
||||||
from spiffworkflow_backend.models.process_model import ProcessModelInfo
|
from spiffworkflow_backend.models.process_model import ProcessModelInfo
|
||||||
from spiffworkflow_backend.services.message_service import MessageService
|
|
||||||
from spiffworkflow_backend.services.process_model_service import ProcessModelService
|
from spiffworkflow_backend.services.process_model_service import ProcessModelService
|
||||||
|
|
||||||
|
|
||||||
@ -57,6 +55,12 @@ class ErrorHandlingService:
|
|||||||
process_instance: ProcessInstanceModel,
|
process_instance: ProcessInstanceModel,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Send a BPMN Message - which may kick off a waiting process."""
|
"""Send a BPMN Message - which may kick off a waiting process."""
|
||||||
|
|
||||||
|
# importing here to avoid circular imports since these imports are only needed here at runtime.
|
||||||
|
# we were not able to figure out which specific import was causing the issue.
|
||||||
|
from spiffworkflow_backend.models.message_instance import MessageInstanceModel
|
||||||
|
from spiffworkflow_backend.services.message_service import MessageService
|
||||||
|
|
||||||
message_text = (
|
message_text = (
|
||||||
f"There was an exception running process {process_model.id}.\nOriginal Error:\n{error.__repr__()}"
|
f"There was an exception running process {process_model.id}.\nOriginal Error:\n{error.__repr__()}"
|
||||||
)
|
)
|
||||||
|
@ -4,9 +4,9 @@ from collections.abc import Generator
|
|||||||
|
|
||||||
from spiffworkflow_backend.models.db import db
|
from spiffworkflow_backend.models.db import db
|
||||||
from spiffworkflow_backend.models.process_instance import ProcessInstanceModel
|
from spiffworkflow_backend.models.process_instance import ProcessInstanceModel
|
||||||
from spiffworkflow_backend.models.process_instance import ProcessInstanceStatus
|
|
||||||
from spiffworkflow_backend.models.process_instance_event import ProcessInstanceEventType
|
from spiffworkflow_backend.models.process_instance_event import ProcessInstanceEventType
|
||||||
from spiffworkflow_backend.models.process_instance_queue import ProcessInstanceQueueModel
|
from spiffworkflow_backend.models.process_instance_queue import ProcessInstanceQueueModel
|
||||||
|
from spiffworkflow_backend.services.error_handling_service import ErrorHandlingService
|
||||||
from spiffworkflow_backend.services.process_instance_lock_service import ProcessInstanceLockService
|
from spiffworkflow_backend.services.process_instance_lock_service import ProcessInstanceLockService
|
||||||
from spiffworkflow_backend.services.process_instance_tmp_service import ProcessInstanceTmpService
|
from spiffworkflow_backend.services.process_instance_tmp_service import ProcessInstanceTmpService
|
||||||
from spiffworkflow_backend.services.workflow_execution_service import WorkflowExecutionServiceError
|
from spiffworkflow_backend.services.workflow_execution_service import WorkflowExecutionServiceError
|
||||||
@ -97,15 +97,13 @@ class ProcessInstanceQueueService:
|
|||||||
try:
|
try:
|
||||||
yield
|
yield
|
||||||
except Exception as ex:
|
except Exception as ex:
|
||||||
process_instance.status = ProcessInstanceStatus.error.value
|
|
||||||
db.session.add(process_instance)
|
|
||||||
# these events are handled in the WorkflowExecutionService.
|
# these events are handled in the WorkflowExecutionService.
|
||||||
# that is, we don't need to add error_detail records here, etc.
|
# that is, we don't need to add error_detail records here, etc.
|
||||||
if not isinstance(ex, WorkflowExecutionServiceError):
|
if not isinstance(ex, WorkflowExecutionServiceError):
|
||||||
ProcessInstanceTmpService.add_event_to_process_instance(
|
ProcessInstanceTmpService.add_event_to_process_instance(
|
||||||
process_instance, ProcessInstanceEventType.process_instance_error.value, exception=ex
|
process_instance, ProcessInstanceEventType.process_instance_error.value, exception=ex
|
||||||
)
|
)
|
||||||
db.session.commit()
|
ErrorHandlingService.handle_error(process_instance, ex)
|
||||||
raise ex
|
raise ex
|
||||||
finally:
|
finally:
|
||||||
if not reentering_lock:
|
if not reentering_lock:
|
||||||
|
@ -6,7 +6,6 @@ from spiffworkflow_backend.models.message_instance import MessageInstanceModel
|
|||||||
from spiffworkflow_backend.models.process_instance import ProcessInstanceModel
|
from spiffworkflow_backend.models.process_instance import ProcessInstanceModel
|
||||||
from spiffworkflow_backend.models.process_instance import ProcessInstanceStatus
|
from spiffworkflow_backend.models.process_instance import ProcessInstanceStatus
|
||||||
from spiffworkflow_backend.models.process_model import ProcessModelInfo
|
from spiffworkflow_backend.models.process_model import ProcessModelInfo
|
||||||
from spiffworkflow_backend.services.error_handling_service import ErrorHandlingService
|
|
||||||
from spiffworkflow_backend.services.process_instance_processor import ProcessInstanceProcessor
|
from spiffworkflow_backend.services.process_instance_processor import ProcessInstanceProcessor
|
||||||
from spiffworkflow_backend.services.process_model_service import ProcessModelService
|
from spiffworkflow_backend.services.process_model_service import ProcessModelService
|
||||||
from spiffworkflow_backend.services.workflow_execution_service import WorkflowExecutionServiceError
|
from spiffworkflow_backend.services.workflow_execution_service import WorkflowExecutionServiceError
|
||||||
@ -24,9 +23,10 @@ class TestErrorHandlingService(BaseTest):
|
|||||||
def run_process_model_and_handle_error(self, process_model: ProcessModelInfo) -> ProcessInstanceModel:
|
def run_process_model_and_handle_error(self, process_model: ProcessModelInfo) -> ProcessInstanceModel:
|
||||||
process_instance = self.create_process_instance_from_process_model(process_model)
|
process_instance = self.create_process_instance_from_process_model(process_model)
|
||||||
pip = ProcessInstanceProcessor(process_instance)
|
pip = ProcessInstanceProcessor(process_instance)
|
||||||
with pytest.raises(WorkflowExecutionServiceError) as e:
|
|
||||||
|
# the error handler will be called from dequeued within do_engine_steps now
|
||||||
|
with pytest.raises(WorkflowExecutionServiceError):
|
||||||
pip.do_engine_steps(save=True)
|
pip.do_engine_steps(save=True)
|
||||||
ErrorHandlingService().handle_error(process_instance, e.value)
|
|
||||||
return process_instance
|
return process_instance
|
||||||
|
|
||||||
def test_handle_error_suspends_or_faults_process(
|
def test_handle_error_suspends_or_faults_process(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user