Java中的电子邮件服务引发“内存不足”错误

前端之家收集整理的这篇文章主要介绍了Java中的电子邮件服务引发“内存不足”错误 前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我正在后台(在命令提示符下)运行电子邮件服务,这是为了继续运行并在队列表中提取记录以进行处理.

这是我的Email.java

  1. public class Email {
  2. MysqLConnect con=new MysqLConnect();
  3. public PreparedStatement preparedStatement = null;
  4. public Connection con1 = con.connect();
  5. public Email() throws Exception {
  6. }
  7. //pick up queue and send email
  8. public void email() throws Exception {
  9. try{
  10. while(true) {
  11. String sql = "SELECT id,subject,recipient,content FROM emailqueue WHERE status='Pending' ";
  12. PreparedStatement statement = con1.prepareStatement(sql);
  13. ResultSet rs = statement.executeQuery();
  14. while (rs.next()) {
  15. String subject = rs.getString("subject");
  16. String recipient = rs.getString("recipient");
  17. String content = rs.getString("content");
  18. String id = rs.getString("id");
  19. sendEmail(recipient,content,id);
  20. }
  21. }
  22. }catch(Exception e){
  23. e.printStackTrace();
  24. }
  25. con1.close();
  26. Thread.sleep(2000);
  27. }
  28. //Schedule a service for picking email
  29. public void schedule(){
  30. Thread service;
  31. service = new Thread(new Runnable() {
  32. public void run() {
  33. try {
  34. System.out.println("Email service is ready");
  35. email();
  36. } catch (Exception e) {
  37. e.printStackTrace();
  38. }
  39. }
  40. });
  41. service.start();
  42. }
  43. public void sendEmail(String recipient,String subject,String content,String id) {
  44. try {
  45. //final String fromEmail = "lordjesus0371@gmail.com"; //requires valid gmail id
  46. // final String password = "htasia123"; // correct password for gmail id
  47. // InitialContext ctx = new InitialContext();
  48. String host = get_attributevalue("MAIL_SERVER");
  49. String port = get_attributevalue("MAIL_PORT");
  50. final String senderaddress = get_attributevalue("SENDER_ADDRESS");
  51. final String password = get_attributevalue("MAIL_PASSWORD");
  52. System.out.println("Please Wait,sending email...");
  53. /*Setup mail server */
  54. Properties props = new Properties();
  55. props.put("mail.smtp.host",host); //SMTP Host
  56. props.put("mail.smtp.port",port); //TLS Port
  57. props.put("mail.smtp.auth","true"); //enable authentication
  58. props.put("mail.smtp.starttls.enable","true"); //enable STARTTLS
  59. //create Authenticator object to pass in Session.getInstance argument
  60. Authenticator auth = new Authenticator() {
  61. //override the getPasswordAuthentication method
  62. protected PasswordAuthentication getPasswordAuthentication() {
  63. return new PasswordAuthentication(senderaddress,password);
  64. }
  65. };
  66. Session session = Session.getInstance(props,auth);
  67. session.setDebug(true);
  68. // Define message
  69. MimeMessage message = new MimeMessage(session);
  70. // Set From: header field of the header.
  71. message.setFrom(new InternetAddress(senderaddress));
  72. message.addRecipients(Message.RecipientType.TO,InternetAddress.parse(recipient));
  73. // Set Subject: header field
  74. message.setSubject(subject);
  75. // Now set the actual message
  76. message.setText(content);
  77. Transport.send(message);
  78. delivered(id);
  79. System.out.print("Email sent");
  80. } catch (Exception e) {
  81. System.out.println(e.getMessage());
  82. try{
  83. error(id);
  84. } catch (sqlException e1) {
  85. e1.printStackTrace();
  86. }
  87. }
  88. }

在我的Main方法中:

  1. public static void main(String[] args) throws Exception {
  2. Email runEmailService=new Email();
  3. runEmailService.schedule();
  4. }

它能够提取记录并处理电子邮件,但是一段时间后会抛出:

  1. Exception in thread "Thread-1" java.lang.OutOfMemoryError: Java heap space
  2. Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "Thread-1"

并且程序停止运行.

有没有一种方法可以防止这种情况的发生,使我的程序继续运行?

最佳答案
语句和结果集资源可能还没有被释放,并且因为您没有关闭它们而被保存在内存中.

考虑在while(rs.next())循环之后关闭它们:

  1. rs.close();
  2. statement.close();

请注意,您可以使用“尝试使用reousrces”来让事物自行关闭

  1. try (PreparedStatement statement = con1.prepareStatement(sql); ResultSet rs = statement.executeQuery())

cf. Java 7 Automatic Resource Management JDBC (try-with-resources statement)

  1. public void email() throws Exception {
  2. String sql = "SELECT id,content FROM emailqueue WHERE status='Pending' ";
  3. while (true) {
  4. try (PreparedStatement statement = con1.prepareStatement(sql); ResultSet rs = statement.executeQuery()) {
  5. while (rs.next()) {
  6. String subject = rs.getString("subject");
  7. String recipient = rs.getString("recipient");
  8. String content = rs.getString("content");
  9. String id = rs.getString("id");
  10. sendEmail(recipient,id);
  11. }
  12. } catch (Exception e) {
  13. e.printStackTrace();
  14. }
  15. }
  16. con1.close();
  17. Thread.sleep(2000);
  18. }

猜你在找的Java相关文章