अब ऐसा करने का एक तरीका है, जो tomcat v8.5.24 से शुरू होता है।
उन्होंने 2 विधियों को नाम दिया:
- reloadSslHostConfig (स्ट्रिंग होस्टनाम) - एक विशिष्ट होस्ट को पुनः लोड करने के लिए
- reloadSslHostConfigs () - सभी को पुनः लोड करें
उन्हें विभिन्न तरीकों से बुलाया जा सकता है:
- Jmx का उपयोग करना
- प्रबंधक सेवा का उपयोग करना (in tomcat v9.xx)
- कस्टम प्रोटोकॉल बनाकर - मैंने अपने शोध के दौरान इस तरह पाया
रास्ता 1 और रास्ता 2 का विवरण आसानी से टॉमकैट डॉक्स में उपलब्ध है।
रास्ते 3 के उपयोग के बारे में जाने का विवरण:
- उदाहरण के लिए अपनी पसंद के प्रोटोकॉल का विस्तार करने वाला एक वर्ग बनाएं। Http11NioProtocol
- डिफ़ॉल्ट व्यवहार रखने के लिए आवश्यक तरीकों को ओवरराइड करें और बस सुपर को कॉल करें
- समय-समय पर reloadSslHostConfigs विधि को कॉल करने के लिए इस वर्ग में एक धागा बनाएं
- इस क्लास को एक जार में पैकेज करें और उस जार को टॉमकैट के लिबर फोल्डर में रखें
- इस कस्टम परिभाषित प्रोटोकॉल का उपयोग करने के लिए server.xml में कनेक्टर में प्रोटोकॉल संपादित करें
नीचे नमूना कोड खोजें:
मुख्य प्रोटोकॉल वर्ग:
package com.myown.connector;
import java.io.File;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.net.URL;
import java.net.URLConnection;
import java.nio.file.StandardCopyOption;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentMap;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.net.ssl.SSLSessionContext;
import org.apache.coyote.http11.Http11NioProtocol;
import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory;
import org.apache.tomcat.util.modeler.Registry;
import org.apache.tomcat.util.net.AbstractEndpoint;
import org.apache.tomcat.util.net.AbstractJsseEndpoint;
import org.apache.tomcat.util.net.GetSslConfig;
import org.apache.tomcat.util.net.SSLContext;
import org.apache.tomcat.util.net.SSLHostConfig;
import org.apache.tomcat.util.net.SSLHostConfigCertificate;
import org.apache.tomcat.util.net.SSLImplementation;
import org.apache.tomcat.util.net.SSLUtil;
public class ReloadProtocol extends Http11NioProtocol {
private static final Log log = LogFactory.getLog(Http12ProtocolSSL.class);
public ReloadProtocol() {
super();
RefreshSslConfigThread refresher = new
RefreshSslConfigThread(this.getEndpoint(), this);
refresher.start();
}
@Override
public void setKeystorePass(String s) {
super.setKeystorePass(s);
}
@Override
public void setKeyPass(String s) {
super.setKeyPass(s);
}
@Override
public void setTruststorePass(String p) {
super.setTruststorePass(p);
}
class RefreshSslConfigThread extends Thread {
AbstractJsseEndpoint<?> abstractJsseEndpoint = null;
Http11NioProtocol protocol = null;
public RefreshSslConfigThread(AbstractJsseEndpoint<?> abstractJsseEndpoint, Http11NioProtocol protocol) {
this.abstractJsseEndpoint = abstractJsseEndpoint;
this.protocol = protocol;
}
public void run() {
int timeBetweenRefreshesInt = 1000000; // time in milli-seconds
while (true) {
try {
abstractJsseEndpoint.reloadSslHostConfigs();
System.out.println("Config Updated");
} catch (Exception e) {
System.out.println("Problem while reloading.");
}
try {
Thread.sleep(timeBetweenRefreshesInt);
} catch (InterruptedException e) {
System.out.println("Error while sleeping");
}
}
}
}
}
Server.xml में कनेक्टर को प्रोटोकॉल के रूप में इसका उल्लेख करना चाहिए:
<Connector protocol="com.myown.connector.ReloadProtocol"
..........
उम्मीद है की यह मदद करेगा।
bindOnInit="false"
विकल्प के साथ कॉन्फ़िगर किया गया हो ।