2016-12-01 4 views
1

Слишком много потоков в заблокированном состоянии в моем потоке Dump.This делает мое приложение безответным. Когда я просмотрел код, я обнаружил, что функция синхронизирована из-за к которому поток переходит в состояние блока. Если этот метод не выполнен Синхронизировано, то несколько потоков, обращающихся к одному и тому же методу в одно и то же время, могут вызвать проблемы, подобные одному потоку почты, мешать другому потоку. Как мне изменить свой код так, чтобы мое приложение не пострадало. Это мой код-java.lang.Thread.State: BLOCKED (на объектном мониторе)

// Mailtransport класс

public final boolean openConnection() throws MailingException { 
    boolean flag = false; 

    if (transport == null) { 

     mailsession = MailSession.getMailSession(); 
     try { 
      transport = (SMTPTransport) mailsession.getNewTransport(); 
      flag = true; 
      // System.out.println("\n--MailTransport.java ------------ Connection is SUccessful -- "+transport.isConnected()); 
     } catch (MailingException mex) { 
      setStatusmessage(new StringBuffer(statusMessages[1]).append(
        " -- ").append(mailsession.getSmtphost()).append(
        "<BR> Contact").append(
        "<A HREF=\"mailto:" + returnPath + "\">").append(
        "Administrator").append("</A>").toString()); 
      throw mex; 
     } 
    } else { 
     flag = true; 
    } 
    return flag; 
} 

// MailSession класс

public synchronized Transport getNewTransport() throws MailingException 
{  
    try 
    { 
     return getNewTransport(mailtype); 

    } catch (MailingException e) 
    { 
     throw e; 
    } catch (Exception e) 
    { 
     throw new MailingException(" Exception in MailSession.getTransport ", e); 
    } 
} 





public static MailSession getMailSession() 
{ 
    MailSession _mailSession = MultiTenancyUtil.getTenantMailSession(); 
    if (_mailSession == null) 
    { 
     synchronized (MailSession.class) 
     { 
      if (_mailSession == null) 
      { 
       _mailSession = new MailSession(); 
       _mailSession.initialize(); 
       MultiTenancyUtil.getTenantResources().setMailSession(_mailSession); 
      } 
     } 
    } 
    return _mailSession; 
} 





    public Transport getNewTransport(String type) throws MailingException 
{ 
    Transport transport = null; 
    try 
    { 
     transport = session.getTransport(type); 
     if (StringUtil.isvalidInteger(getSmtpprot())) 
     { 
      transport.connect(getSmtphost(), Integer.parseInt(getSmtpprot()), username, password); 
     } else 
     { 
      transport.connect(getSmtphost(), username, password); 
     } 
    } catch (MessagingException ex) 
    { 
     MailingException mailex = null; 
     Exception nex = ex.getNextException(); 
     if (nex != null) 
     { 
      if (nex instanceof SocketTimeoutException) 
      { 
       mailex = new SMTPServerException("Connection to Server Failed. SMTP server does not Exist on host--" + getSmtphost() + " -- Mention the proper Host. Other wise Server is very Slow"); 
       mailex.setCause(ex); 
      } 
      if (nex instanceof ConnectException) 
      { 
       mailex = new SMTPServerException("Connection to Server Failed. Unable to connect to port" + getSmtpprot() + " on SMTP server host---" + getSmtphost() + " -- Mention the proper Server and Port."); 
       mailex.setCause(ex); 
      } 
     } 
     if (mailex == null) 
     { 
      mailex = new SMTPServerException("Connection to Server Failed"); 
      mailex.setCause(ex); 
     } 

     throw mailex; 
    } catch (Exception ex) 
    { 
     MailingException mailex = new MailingException("Connection to Server Failed"); 
     mailex.setCause(ex); 
     throw mailex; 
    } 
    return transport; 
} 

Это часть моей нити dump-

 at javax.mail.Service.connect(Service.java:275) 
    at javax.mail.Service.connect(Service.java:156) 
    at  com.appnetix.app.util.mail.MailSession.getNewTransport(MailSession.java:199) 
    at com.appnetix.app.util.mail.MailSession.getNewTransport(MailSession.java:249) 
locked <0x00000007211b9480> (a com.appnetix.app.util.mail.MailSession) 
    at com.appnetix.app.util.mail.MailTransport.openConnection(MailTransport.java:122) 
    at com.appnetix.app.util.mail.MailSenderBase.init(MailSenderBase.java:107) 
    at com.appnetix.app.util.MailSender.sendMail(MailSender.java:193) 
    at com.appnetix.app.util.MailSender.sendMail(MailSender.java:175) 

ответ

1

Вот некоторые советы:

Don ' t отправлять письма по основному потоку. Создайте пул потоков, обрабатывающий электронные письма. Это полезно, потому что обычно вам не нужно ждать, пока письмо будет отправлено успешно, чтобы дать ответ на метод вызова. Достаточно сказать, что я уже взял вашу электронную почту, и я отправлю ее как можно скорее (асинхронно).

Вы уверены, что вам нужно синхронизировать getNewTransport? Попробуйте переписать метод getNewTransport, чтобы вернуть новый Transport без использования изменяемых переменных экземпляра. При этом вы можете исключить использование synchronized.

+0

Как удалить изменяемую переменную экземпляра, чтобы сделать ее несинхронизированной и работать правильно? –

+0

Код должен быть синхронизирован только для доступа к переменным, которые могут быть изменены более чем одним потоком. Если у вас синхронизация монотонных приложений не требуется. Если у вас многопоточное приложение, но общие переменные - это немодифицируемая синхронизация, не требуется. –

Смежные вопросы