in jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/instance/impl/WorkflowProcessInstanceImpl.java [670:743]
public void signalEvent(String type, Object event) {
logger.debug("Signal {} received with data {} in process instance {}", type, event, getStringId());
synchronized (this) {
if (getState() != KogitoProcessInstance.STATE_ACTIVE) {
return;
}
if (TIMER_TRIGGERED_EVENT.equals(type)) {
TimerInstance timer = (TimerInstance) event;
if (timer.getId().equals(slaTimerId)) {
handleSLAViolation();
// no need to pass the event along as it was purely for SLA tracking
return;
}
if (timer.getId().equals(cancelTimerId)) {
logger.debug("Cancelling process instance id {} because timer {} expires ", getStringId(), cancelTimerId);
// The cancelTimer is being executed, so this id is not valid anymore. Avoid an invalid job canceling
// for it as part of the process aborting sequence.
this.cancelTimerId = null;
setState(KogitoProcessInstance.STATE_ABORTED);
return;
}
}
if ("slaViolation".equals(type)) {
handleSLAViolation();
// no need to pass the event along as it was purely for SLA tracking
return;
}
try {
this.activatingNodeIds = new ArrayList<>();
List<KogitoEventListener> listeners = eventListeners.get(type);
if (listeners != null) {
for (KogitoEventListener listener : listeners) {
listener.signalEvent(type, event);
}
}
listeners = externalEventListeners.get(type);
if (listeners != null) {
for (KogitoEventListener listener : listeners) {
listener.signalEvent(type, event);
}
}
signal(this, (node) -> this.getNodeInstance(node), () -> this.getWorkflowProcess().getNodes(), type, event);
if (((org.jbpm.workflow.core.WorkflowProcess) getWorkflowProcess()).isDynamic()) {
for (org.kie.api.definition.process.Node node : getWorkflowProcess().getNodes()) {
if (type.equals(node.getName()) && node.getIncomingConnections().isEmpty()) {
NodeInstance nodeInstance = getNodeInstance(node);
if (event != null) {
Map<String, Object> dynamicParams = new HashMap<>(getVariables());
if (event instanceof Map) {
dynamicParams.putAll((Map<String, Object>) event);
} else {
dynamicParams.put("Data", event);
}
nodeInstance.setDynamicParameters(dynamicParams);
}
nodeInstance.trigger(null, Node.CONNECTION_DEFAULT_TYPE);
} else if (node instanceof CompositeNode) {
Optional<NodeInstance> instance = this.nodeInstances.stream().filter(ni -> Objects.equals(ni.getNodeId(), node.getId())).findFirst();
instance.ifPresent(n -> ((CompositeNodeInstance) n).signalEvent(type, event));
}
}
}
} finally {
if (this.activatingNodeIds != null) {
this.activatingNodeIds.clear();
this.activatingNodeIds = null;
}
}
}
}