001: /*
002: * ====================================================================
003: *
004: * XFLOW - Process Management System
005: * Copyright (C) 2003 Rob Tan
006: * All rights reserved.
007: *
008: * Redistribution and use in source and binary forms, with or without
009: * modification, are permitted provided that the following conditions
010: * are met:
011: *
012: * 1. Redistributions of source code must retain the above copyright
013: * notice, this list of conditions, and the following disclaimer.
014: *
015: * 2. Redistributions in binary form must reproduce the above copyright
016: * notice, this list of conditions, and the disclaimer that follows
017: * these conditions in the documentation and/or other materials
018: * provided with the distribution.
019: *
020: * 3. The name "XFlow" must not be used to endorse or promote products
021: * derived from this software without prior written permission. For
022: * written permission, please contact rcktan@yahoo.com
023: *
024: * 4. Products derived from this software may not be called "XFlow", nor
025: * may "XFlow" appear in their name, without prior written permission
026: * from the XFlow Project Management (rcktan@yahoo.com)
027: *
028: * In addition, we request (but do not require) that you include in the
029: * end-user documentation provided with the redistribution and/or in the
030: * software itself an acknowledgement equivalent to the following:
031: * "This product includes software developed by the
032: * XFlow Project (http://xflow.sourceforge.net/)."
033: * Alternatively, the acknowledgment may be graphical using the logos
034: * available at http://xflow.sourceforge.net/
035: *
036: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
037: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
038: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
039: * DISCLAIMED. IN NO EVENT SHALL THE XFLOW AUTHORS OR THE PROJECT
040: * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
041: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
042: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
043: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
044: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
045: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
046: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
047: * SUCH DAMAGE.
048: *
049: * ====================================================================
050: * This software consists of voluntary contributions made by many
051: * individuals on behalf of the XFlow Project and was originally
052: * created by Rob Tan (rcktan@yahoo.com)
053: * For more information on the XFlow Project, please see:
054: * <http://xflow.sourceforge.net/>.
055: * ====================================================================
056: */
057:
058: package xflow.server.controller;
059:
060: import java.io.*;
061: import java.util.*;
062: import java.lang.*;
063: import java.sql.*;
064:
065: import xflow.common.*;
066: import xflow.util.*;
067: import xflow.server.util.*;
068:
069: import org.apache.log4j.Logger;
070:
071: public class TimeoutDetector extends Thread {
072: private static Logger log = Logger.getLogger(TimeoutDetector.class);
073:
074: public void run() {
075: while (true) {
076: try {
077: Vector v = WorkflowP.getProcessesWithTimeouts();
078: for (int i = 0; i < v.size(); i++) {
079: ProcessWithTimeout pto = (ProcessWithTimeout) v
080: .elementAt(i);
081: processTimeout(pto);
082: }
083: Thread.sleep(60000);
084: } catch (Exception e) {
085: }
086: }
087: }
088:
089: public void processTimeout(ProcessWithTimeout pto) {
090: // Get start times of items sitting in inboxes that qualify for timeout checks
091: try {
092: java.sql.Date stime = InboxP.getTimeStarted(pto.workflowId,
093: pto.processName);
094: if (stime == null) {
095: return;
096: }
097: long startTimeMillis = stime.getTime();
098: long currentTimeMillis = System.currentTimeMillis();
099: long diffTimeMillis = currentTimeMillis - startTimeMillis;
100: int diffTimeMins = (int) diffTimeMillis / 60000;
101: //System.out.println ("Diff time is: " + diffTimeMins + " mins.");
102: if (diffTimeMins > pto.timeoutMinutes) {
103: log.info("Processing timed out: " + pto.workflowId
104: + " " + pto.processName);
105:
106: // Update the inbox item with the timeout flag
107: InboxP.setTimeoutFlag(pto.workflowId, pto.processName);
108:
109: // Start the timeout handler workflow
110: if (pto.timeoutHandler != null
111: && !pto.timeoutHandler.equals("")) {
112: WorkItem witem = new WorkItem();
113: witem.setPayload("Timeout");
114: witem.setPayloadType(WorkItem.JAVA_OBJECT);
115: witem.setProperty("WorkflowId", new Integer(
116: pto.workflowId));
117: witem.setProperty("Process", pto.processName);
118: WorkflowProcessor.startWorkflow(pto.timeoutHandler,
119: -1, witem, "System");
120: }
121: }
122: } catch (Exception e) {
123: e.printStackTrace();
124: }
125: }
126:
127: }
|