lunes, 7 de marzo de 2011

Rechazo de emails con envío masivo

Hola,

Voy a comentar un problema que tuvimos con el envío de correos (inbound) al servidor...

Configuración de servidor:

Windows Server 2008
Alfresco 3.1.1
Lotus Notes
SQLServer


Situación:

de 3 a 5 usuarios enviando varios correos de forma simultánea al servidor

Resultado:

15:21:37,884 ERROR [org.alfresco.email.server.impl.subetha.SubethaEmailServer] Email message processing failed
org.alfresco.error.AlfrescoRuntimeException: Email message processing failed
    at org.alfresco.email.server.EmailServiceImpl.processMessage(EmailServiceImpl.java:235)
    at org.alfresco.email.server.EmailServiceImpl.importMessage(EmailServiceImpl.java:147)
    at es.sic.utils.CustomEmailServiceImpl_.importMessage(CustomEmailServiceImpl_.java:17)
    at org.alfresco.email.server.impl.subetha.SubethaEmailServer$Handler.processDelivery(SubethaEmailServer.java:177)
    at org.alfresco.email.server.impl.subetha.SubethaEmailServer$Handler.data(SubethaEmailServer.java:132)
    at org.subethamail.smtp.command.DataCommand.execute(DataCommand.java:56)
    at org.subethamail.smtp.server.CommandHandler.handleCommand(CommandHandler.java:58)
    at org.subethamail.smtp.server.ConnectionHandler.run(ConnectionHandler.java:113)
Caused by: org.alfresco.error.AlfrescoRuntimeException: IOException while attempting to detect charset encoding.
    at org.alfresco.encoding.AbstractCharactersetFinder.detectCharset(AbstractCharactersetFinder.java:102)
    at org.alfresco.repo.content.encoding.ContentCharsetFinder.getCharset(ContentCharsetFinder.java:100)
    at org.alfresco.email.server.handler.AbstractEmailMessageHandler.writeContent(AbstractEmailMessageHandler.java:220)
    at org.alfresco.email.server.handler.FolderEmailMessageHandler.addAlfrescoContent(FolderEmailMessageHandler.java:134)
    at org.alfresco.email.server.handler.FolderEmailMessageHandler.processMessage(FolderEmailMessageHandler.java:80)
    at org.alfresco.email.server.EmailServiceImpl$3.execute(EmailServiceImpl.java:207)
    at org.alfresco.repo.transaction.RetryingTransactionHelper.doInTransaction(RetryingTransactionHelper.java:322)
    at org.alfresco.repo.transaction.RetryingTransactionHelper.doInTransaction(RetryingTransactionHelper.java:248)
    at org.alfresco.email.server.EmailServiceImpl$4.doWork(EmailServiceImpl.java:215)
    at org.alfresco.repo.security.authentication.AuthenticationUtil.runAs(AuthenticationUtil.java:497)
    at org.alfresco.email.server.EmailServiceImpl.processMessage(EmailServiceImpl.java:218)
    ... 7 more
Caused by: java.io.IOException: Stream closed
    at java.io.PushbackInputStream.ensureOpen(PushbackInputStream.java:57)
    at java.io.PushbackInputStream.read(PushbackInputStream.java:118)
    at com.sun.mail.util.QPDecoderStream.read(QPDecoderStream.java:55)
    at com.sun.mail.util.QPDecoderStream.read(QPDecoderStream.java:134)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
    at java.io.FilterInputStream.read(FilterInputStream.java:90)
    at org.alfresco.encoding.AbstractCharactersetFinder.detectCharset(AbstractCharactersetFinder.java:88)
    ... 17 more

   
   
Al principio pensamos que era un problema de configuración de Lotus Notes y que venia con un charset que Alfresco no reconocía, pero descubrimos que no, por lo que añadimos estas dos lineas en el fichero custom-email-server.properties

email.server.connections.max=5

Con este cambio conseguimos mejorar el resultado, pero seguíamos teniendo rechazos cuando llegaban correos con muchos adjuntos, por lo que teníamos que encolar los correos y mandarlos con un retardo de por lo menos 10 segundos.
Al final decidimos hacer nuestra propia clase, que extiende de la clase de Alfresco que trata los emails (EmailServiceImpl) y sincroniza el método que los procesa. De momento, no hemos tenido ningún problema.


public class CustomEmailServiceImpl_ extends EmailServiceImpl{  
     /**
     * {@inheritDoc}
     */
    @Override
    public void importMessage(EmailMessage message)
    {
        synchronized (this) {
            super.importMessage(message);
        }
    }
    /**
     * {@inheritDoc}
     */
    @Override
    public  void importMessage(NodeRef nodeRef, EmailMessage message)
    {
        synchronized (this) {
            super.importMessage(nodeRef, message);
        }
    }

}

No hay comentarios:

Publicar un comentario