1 package org.onap.so.bpmn.common.workflow.context;
3 * ============LICENSE_START=======================================================
5 * ================================================================================
6 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
7 * ================================================================================
8 * Modifications Copyright (c) 2019 Samsung
9 * ================================================================================
10 * Licensed under the Apache License, Version 2.0 (the "License");
11 * you may not use this file except in compliance with the License.
12 * You may obtain a copy of the License at
14 * http://www.apache.org/licenses/LICENSE-2.0
16 * Unless required by applicable law or agreed to in writing, software
17 * distributed under the License is distributed on an "AS IS" BASIS,
18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19 * See the License for the specific language governing permissions and
20 * limitations under the License.
21 * ============LICENSE_END=========================================================
26 import java.util.concurrent.DelayQueue;
27 import java.util.concurrent.TimeUnit;
29 import org.onap.so.logger.ErrorCode;
30 import org.onap.so.logger.MessageEnum;
31 import org.slf4j.Logger;
32 import org.slf4j.LoggerFactory;
33 import org.springframework.stereotype.Component;
36 * Workflow Context Holder instance which can be accessed elsewhere either in groovy scripts or Java
42 public class WorkflowContextHolder {
44 private static Logger logger = LoggerFactory.getLogger(WorkflowContextHolder.class);
45 private static final String logMarker = "[WORKFLOW-CONTEXT-HOLDER]";
46 private static WorkflowContextHolder instance = null;
49 private long defaultContextTimeout=60000;
52 * Delay Queue which holds workflow context holder objects
54 private final DelayQueue<WorkflowContext> responseQueue = new DelayQueue<>();
55 private final TimeoutThread timeoutThread = new TimeoutThread();
57 private WorkflowContextHolder() {
58 timeoutThread.start();
62 * Singleton holder which eliminates hot lock
63 * Since the JVM synchronizes static method there is no synchronization needed for this method
66 public static synchronized WorkflowContextHolder getInstance() {
67 if (instance == null) {
68 instance = new WorkflowContextHolder();
73 public void put(WorkflowContext context) {
74 logger.debug("{} Adding context to the queue: {}", logMarker, context.getRequestId());
75 responseQueue.put(context);
78 public void remove(WorkflowContext context) {
79 logger.debug("{} Removing context from the queue: {}", logMarker, context.getRequestId());
80 responseQueue.remove(context);
83 public WorkflowContext getWorkflowContext(String requestId) {
84 // Note: DelayQueue interator is threadsafe
85 for (WorkflowContext context : responseQueue) {
86 if (requestId.equals(context.getRequestId())) {
94 * Builds the callback response object to respond to client
96 * @param processInstanceId
98 * @param callbackResponse
101 public void processCallback(String processKey, String processInstanceId,
102 String requestId, WorkflowCallbackResponse callbackResponse) {
103 WorkflowResponse workflowResponse = new WorkflowResponse();
104 workflowResponse.setResponse(callbackResponse.getResponse());
105 workflowResponse.setProcessInstanceID(processInstanceId);
106 workflowResponse.setMessageCode(callbackResponse.getStatusCode());
107 workflowResponse.setMessage(callbackResponse.getMessage());
108 WorkflowContext context = new WorkflowContext(processKey, requestId, defaultContextTimeout,workflowResponse);
114 * Timeout thread which monitors the delay queue for expired context and send timeout response
118 private class TimeoutThread extends Thread {
121 while (!isInterrupted()) {
123 WorkflowContext requestObject = responseQueue.take();
124 logger.debug("Time remaining for request id: {}:{}", requestObject.getRequestId(), requestObject
126 (TimeUnit.MILLISECONDS));
127 logger.debug("Preparing timeout response for {}:{}", requestObject.getProcessKey(), requestObject
129 } catch (InterruptedException e) {
130 Thread.currentThread().interrupt();
131 } catch (Exception e) {
132 logger.debug("WorkflowContextHolder timeout thread caught exception: ", e);
133 logger.error("{} {} {} {}", MessageEnum.BPMN_GENERAL_EXCEPTION.toString(), "BPMN",
134 ErrorCode.UnknownError.getValue(), "Error in WorkflowContextHolder timeout thread");
137 logger.debug("WorkflowContextHolder timeout thread interrupted, quitting");