我在struts动作中运行无限循环。当java服务器(托管在tomcat上)启动时,它会调用以下文件,里面有无限循环。
package Android;
import dao.DBService;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.sql.ResultSet;
import java.util.Properties;
import javax.mail.*;
import javax.net.ssl.HttpsURLConnection;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.json.JSONObject;
public class MainThread extends org.apache.struts.action.Action {
private static final String SUCCESS = "success";
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
PrintWriter out=response.getWriter();
out.print("hii<br/>");
//String flag = "1";
//String q = "select count(*) from info;";
int t = -1;
while(t<0){
String q = "select * from info;";
ResultSet rs = DBService.selectData(q);
while(rs.next())
{
int change = uidChange(rs.getString(1), rs.getString(2), rs.getString(4),out); //Function that checks for a new mail
if(change==1 && rs.getString(5).equals("1"))// && rs.getString(5) == 1)
{
int res = sendNotification(rs.getString(3)); //sending notification to GCM Server
if(res == 200)
{
q = "update info set flag = '0' where username = '"+rs.getString(1)+"';";
DBService.updateData(q);
}
}
}
}
return mapping.findForward(SUCCESS);
}
public int uidChange(String usn, String pwd, String lastuid, PrintWriter out)
{
Properties props = new Properties();
props.setProperty("mail.store.protocol", "imaps");
props.put("mail.imaps.ssl.trust", "*");
try {
Session session = Session.getInstance(props, null);
Store store = session.getStore();
store.connect("****", usn, pwd); //Real store location in original code
Folder inbox = store.getFolder("INBOX");
inbox.open(Folder.READ_ONLY);
UIDFolder in = (UIDFolder) inbox;
Message[] msg1 = inbox.getMessages();
long highuid = in.getUID(msg1[msg1.length-1]);
inbox.close(true);
store.close();
if(highuid>Long.parseLong(lastuid))
return 1;
else
return 0;
} catch (Exception mex) {
return 2;
}
}
public int sendNotification(String regid) throws Exception
{
String url = "https://android.googleapis.com/gcm/send";
URL obj = new URL(url);
HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();
//add request header
String s="New Mail";
con.setRequestMethod("POST");
String KEY = "application/json";
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Authorization", "key=***"); //Real key in the original code
String urlParameters = "{ \"data\": {\n"
+ "\"msg\": \"" + s + "\"\n"
+ "},\n"
+ "\"registration_ids\": [ \""+regid+"\" ] \n"
+ "}";
// Send post request
con.setDoOutput(true);
JSONObject json = new JSONObject(urlParameters);
DataOutputStream wr = new DataOutputStream(con.getOutputStream());
wr.writeBytes(urlParameters);
wr.flush();
wr.close();
return con.getResponseCode();
}
}
这是DBService.java文件
package dao;
import java.sql.*;
public class DBService
{
private static Connection con;
static
{
try
{
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/maildb";
String user="root";
String password="";
con = DriverManager.getConnection(url,user,password);
}
catch(Exception ee)
{
System.err.println("Error : "+ee.getMessage());
}
}
//method to get Connection Object
public static Connection getConnection()
{
return con;
}
//method to perform CUID Operations
public static int updateData(String sql)
{
try{
Statement st = con.createStatement();
int ur = st.executeUpdate(sql);
return ur;
}
catch(Exception ee)
{
System.err.println("UPDATE ERROR : "+ee.getMessage());
return 0;
}
}
//method to perform SQL Projection Operations
public static ResultSet selectData(String sql)
{
try{
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(sql);
return rs;
}
catch(Exception ee)
{
System.err.println("SELECT ERROR : "+ee.getMessage());
return null;
}
}
}
它运行正常(30分钟左右),但过了一段时间后我得到
java.lang.OutOfMemoryError: Java heap space
例外。完整的跟踪如下:
例外
javax.servlet.ServletException: The HTTP Monitor server side component intercepted and rethrew an error while processing a JSP or servlet. Please see the stack trace under the root cause message below to identify the problem.
org.netbeans.modules.web.monitor.server.MonitorFilter.rethrow(MonitorFilter.java:1656)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:473)
根本原因
java.lang.OutOfMemoryError: Java heap space
sun.security.provider.DigestBase.engineDigest(DigestBase.java:163)
java.security.MessageDigest$Delegate.engineDigest(MessageDigest.java:576)
java.security.MessageDigest.digest(MessageDigest.java:353)
com.sun.crypto.provider.HmacCore.doFinal(HmacCore.java:207)
com.sun.crypto.provider.HmacSHA1.engineDoFinal(HmacSHA1.java:110)
javax.crypto.Mac.doFinal(Mac.java:546)
sun.security.ssl.MAC.compute(MAC.java:252)
sun.security.ssl.MAC.compute(MAC.java:160)
sun.security.ssl.InputRecord.checkMacTags(InputRecord.java:243)
sun.security.ssl.InputRecord.decrypt(InputRecord.java:194)
sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:969)
sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:884)
sun.security.ssl.AppInputStream.read(AppInputStream.java:102)
com.sun.mail.util.TraceInputStream.read(TraceInputStream.java:124)
java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
java.io.BufferedInputStream.read(BufferedInputStream.java:254)
com.sun.mail.iap.ResponseInputStream.readResponse(ResponseInputStream.java:95)
com.sun.mail.iap.Response.<init>(Response.java:95)
com.sun.mail.imap.protocol.IMAPResponse.<init>(IMAPResponse.java:60)
com.sun.mail.imap.protocol.IMAPProtocol.readResponse(IMAPProtocol.java:293)
com.sun.mail.iap.Protocol.command(Protocol.java:313)
com.sun.mail.imap.protocol.IMAPProtocol.examine(IMAPProtocol.java:952)
com.sun.mail.imap.IMAPFolder.open(IMAPFolder.java:974)
com.sun.mail.imap.IMAPFolder.open(IMAPFolder.java:919)
Android.MainThread.uidChange(MainThread.java:100)
Android.MainThread.execute(MainThread.java:59)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:425)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:228)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:449)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.27 logs.
答案 0 :(得分:-1)
而(t <0)是罪魁祸首。你没有在任何地方增加变量t的值,所以它总是-1(小于0)