ludc
2025-01-16 986aa62ed00bee39363bab41b4eeb8259d446efd
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/**
 * Copyright (C) 2007  Bull S. A. S.
 * Bull, Rue Jean Jaures, B.P.68, 78340, Les Clayes-sous-Bois
 * This library is free software; you can redistribute it and/or modify it under the terms
 * of the GNU Lesser General Public License as published by the Free Software Foundation
 * version 2.1 of the License.
 * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Lesser General Public License for more details.
 * You should have received a copy of the GNU Lesser General Public License along with this
 * program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
 * Floor, Boston, MA  02110-1301, USA.
 **/
package org.jbpm.pvm.internal.wire.descriptor;
 
import org.jbpm.api.JbpmException;
import org.jbpm.internal.log.Log;
import org.jbpm.pvm.internal.jobexecutor.JobExecutor;
import org.jbpm.pvm.internal.util.Listener;
import org.jbpm.pvm.internal.wire.WireContext;
 
/**
 * @author Pascal Verdage
 * 
 * Descriptor for the JobExecutor.
 * If it is automatically started, a listener is created to stop it when
 * the environementFactory is closed
 * @see org.jbpm.pvm.internal.env.EnvironmentFactory
 * @see org.jbpm.pvm.internal.wire.binding.JobExecutorBinding
 */
public class JobExecutorDescriptor extends ObjectDescriptor {
  private static final long serialVersionUID = 1L;
  private static final Log log = Log.getLog(JobExecutorDescriptor.class.getName());
 
  
  private boolean autoStart = false;
 
  public JobExecutorDescriptor() {
    super(JobExecutor.class.getName());
  }
 
  public Object construct(WireContext wireContext) {
    JobExecutor jobExecutor = (JobExecutor) super.construct(wireContext);
    if (autoStart) {
      wireContext.addListener(new JobExecutorStopper(jobExecutor));
    }
    return jobExecutor;
  }
 
  public void setAutoStart(boolean autoStart) {
    this.autoStart = autoStart;
  }
  
  public static class JobExecutorStopper implements Listener {
    JobExecutor jobExecutor;
    public JobExecutorStopper(JobExecutor jobExecutor) {
      this.jobExecutor = jobExecutor;
    }
    public void event(Object source, String eventName, Object info) {
      if (WireContext.EVENT_CLOSE.equals(eventName)) {
        log.trace("stopping jobExecutor");
        // wait to prevent from calling stop before the run method (activation)
        // has been called (after a system context switching)
        //TODO: do not wait
        try {
          Thread.sleep(200);
        } catch (InterruptedException e) {
          e.printStackTrace();
          throw new JbpmException("exception while stopping JobExecutor");
        }
        jobExecutor.stop(true);
      }
    }
  }
}