-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathApplicationeploymentCheckerValve.java
82 lines (66 loc) · 3.21 KB
/
ApplicationeploymentCheckerValve.java
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
import java.io.IOException;
import java.io.Writer;
import java.util.List;
import java.util.Set;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
import org.apache.catalina.valves.ValveBase;
import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory;
public class ApplicationeploymentCheckerValve extends ValveBase {
private static final Log LOG = LogFactory.getLog(ApplicationeploymentCheckerValve.class);
private static final Set<String> CATALINA_APPS = Set.of("my_app_1", "my_app_2");
private ObjectName oNameCatalinaApps;
public ApplicationeploymentCheckerValve() {
super(true);
try {
oNameCatalinaApps = new ObjectName("Catalina:type=Deployer," + "host=localhost");
} catch (MalformedObjectNameException e) {
LOG.error("Unable to initialize object name.", e);
}
}
@Override public void invoke(Request request, Response response) throws IOException, ServletException {
if (!appsDeploymentComplete()) {
LOG.error("Rejecting the request method " + request.getMethod() + " on URI " + request.getRequestURI());
response.setStatus(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
Writer writer = response.getWriter();
writer.write("The requested resource [" + request.getRequestURI() + "] is not available. Please try again" +
" later.");
response.finishResponse();
return;
}
this.getNext().invoke(request, response);
}
private boolean appsDeploymentComplete() {
MBeanServer mBeanServer = null;
final List<MBeanServer> mBeanServers = MBeanServerFactory.findMBeanServer(null);
if (!mBeanServers.isEmpty()) {
mBeanServer = mBeanServers.get(0);
}
if (mBeanServer != null) {
try {
for (String app : CATALINA_APPS) {
boolean isDeploymentComplete = (Boolean) mBeanServer.invoke(oNameCatalinaApps, "isDeployed",
new Object[] {app},
new String[] {String.class.getName()});
if (!isDeploymentComplete) {
LOG.error("Deployment in-progress for application " + app);
return false;
}
LOG.debug("Deployment complete for application " + app);
}
} catch (Exception e) {
// You can throw exception and return 503 in this case as well
LOG.error("Unable to get the application deployment status. Ignore this exception and assume " +
"application deployment is complete.", e);
}
}
return true;
}
}