在struts操作中运行无限循环:错误

时间:2014-04-20 05:33:34

标签: java struts

我在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.

1 个答案:

答案 0 :(得分:-1)

而(t <0)是罪魁祸首。你没有在任何地方增加变量t的值,所以它总是-1(小于0)