LifeCycle.java
2.27 KB
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package com.diligrp.cashier.shared.service;
public abstract class LifeCycle implements ILifeCycle {
private final static int FAILED = -1;
private final static int STOPPED = 0;
private final static int STARTING = 1;
private final static int STARTED = 2;
private final static int STOPPING = 3;
private final Object lock = new Object();
private volatile int state = STOPPED;
@Override
public void start() throws Exception {
// Double check
if (state == STARTED || state == STARTING) {
return;
}
synchronized (lock) {
try {
if (state == STARTED || state == STARTING) {
return;
}
setState(STARTING);
doStart();
setState(STARTED);
} catch (Throwable ex) {
setState(FAILED);
throw new Exception("Start the component exception", ex);
}
}
}
@Override
public void stop() throws Exception {
// Double check
if (state == STOPPING || state == STOPPED) {
return;
}
synchronized (lock) {
try {
if (state == STOPPING || state == STOPPED) {
return;
}
setState(STOPPING);
doStop();
setState(STOPPED);
} catch (Throwable ex) {
setState(FAILED);
throw new Exception("Stop the component exception", ex);
}
}
}
protected void doStart() throws Exception {
}
protected void doStop() throws Exception {
}
@Override
public boolean isRunning() {
final int _state = state;
return _state == STARTED || _state == STARTING;
}
@Override
public boolean isStarted() {
return state == STARTED;
}
@Override
public String getState() {
switch (state) {
case STARTED:
return "started";
case STOPPED:
return "stopped";
case STARTING:
return "starting";
case STOPPING:
return "stopping";
case FAILED:
return "failed";
default:
return "unknown";
}
}
private void setState(int state) {
this.state = state;
}
}