我有两个不同的A和B Web应用程序托管在Tomcat上。 B应用程序在4个独立的tomcat物理系统上托管。并且应用程序A被托管在具有单独的tomcat的第五物理系统上。无论何时在应用程序A上发生登录/注销事件,它都需要将此通知发送给所有4 B应用程序。申请A创建每个事件的一个线程,该线程发出请求使用下面的代码全部4个B级应用:OutOfMemoryError:无法创建新的本地线程
public class SendNotification implements Runnable {
private String action;
private String loginid;
private Thread thread;
StringBuilder sb = new StringBuilder();
public static SendNotification getInstance() {
return new SendNotification();
}
public void sendNotification(String action, String loginid){
this.action = action;
this.loginid = loginid;
sb.append(loginid)
.append("_")
.append(action)
.append(new Date().getTime());
thread = new Thread(this, sb.toString());
thread.start();
}
public void run(){
String methodName = "run";
int len = 4;
for(int i=0;i<len;i++){
synchronized(this){
StringBuilder url = new StringBuilder()
.append(<Server_B_i_IP:PORT>)
.append("&action=").append(action)
.append("&loginid=").append(loginid);
URL urlObj = null;
InputStream openStream = null;
try {
urlObj = new URL(url.toString());
openStream = urlObj.openStream();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
try {
if(openStream != null){
openStream.close();
}
openStream = null;
urlObj = null;
url = null;
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
destroyObject();
}
private void destroyObject() {
thread = null;
}
}
但一段时间后启动tomcat抛出以下异常: 异常的线程“qe01lj_login_success1320054407929”java.lang.OutOfMemoryError:无法创建新的本地线程 在java.lang.Thread.start0(本地方法) at java.lang.Thread.start(Thread.java:574) at com.sun .net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:836) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1030) 在com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1057) 在COM。 sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1041) at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:402) at sun.net.www。 protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:170) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:917) at sun.net.www.protocol.https.HttpsURLConnectionImpl。 getInputStream(HttpsURLConnectionImpl.java:234) at java.net.URL.openStream(URL.java:1007) at com.test。 sendNotification.run(sendNotification.java:69) at java.lang.Thread.run(Thread.java:595)
如何解决上述问题? 这些应用程序正在运行HTTPS在Tomcat 5.5.17与jdk1.5.0_13
谢谢Stephen提供的答复。如果您查看getInstance()方法,它将创建SendNotification类的新对象。因此它不是一个单独的类。 如果我删除同步块,该怎么办?这会解决问题吗? – sushil
SendNotification类的每个实例创建新的线程,并且此线程使用URL类的openStream()方法向所有4 B应用程序发出请求。 所以我的问题是,openStream()方法是否创建了与应用程序B通信的新线程? 如果我们看看Exception StackTrace,它显示 无法在java.lang.Thread.start(Thread.java:574) – sushil
的java.lang.Thread.start0(Native Method)上创建新的本地线程。因此,对于每个请求有5个线程被创建? (一个由SendNotification类和4个由openStream()方法)? 如果是,那么如果应用程序A同时获得100个登录请求,则它一次将创建500个线程。 以下是tomcat连接器端口配置: –
sushil