You are viewing a plain text version of this content. The canonical link for it is here.
Posted to mailet-api@james.apache.org by Danny Angus <da...@apache.org> on 2007/09/24 17:57:25 UTC

Re: Mail instance and multiple spool.store()

Stefano,
I think this may be a bug, I suspect that if anything else changed the
recipients between "store" and the actual write, that data would be
lost.
Given that mailets are multi threaded I suspect that this could
happen, resulting in mail being "lost" by some recipients and double
copies to others.

Hmm, I'll see if I can *make* it happen.

d.


On 5/31/05, Stefano Bagnara <ap...@bago.org> wrote:
> I see that RemoteDelivery does this:
>
> String name = mail.getName();
> for (Iterator i = targets.keySet().iterator(); i.hasNext(); ) {
>     String host = (String) i.next();
>     Collection rec = (Collection) targets.get(host);
>     if (isDebug) {
>         StringBuffer logMessageBuffer =
>             new StringBuffer(128)
>                     .append("Sending mail to ")
>                     .append(rec)
>                     .append(" on host ")
>                     .append(host);
>         log(logMessageBuffer.toString());
>     }
>     mail.setRecipients(rec);
>     StringBuffer nameBuffer =
>         new StringBuffer(128)
>                 .append(name)
>                 .append("-to-")
>                 .append(host);
>     mail.setName(nameBuffer.toString());
>     outgoing.store(mail);
> }
>
> Please note that at every iteration the same "mail" instance is changed and
> stored in the repository with a new name.
>
> Is this a supported way to handle Mailets Mail objects? Wouldn't be more
> correct to clone the original mail at each iteration, assigning the new name
> in the duplicate method and setting its recipients before storing it?
>
> Currently it works fine because RemoteDelivery does not support passthrough
> and because we use the setName that is not and should not be available via
> Mail interface.
>
> We should pay attention to this issues when talking about the new mailet
> API.
>
> Stefano
>
>

Re: Mail instance and multiple spool.store()

Posted by Stefano Bagnara <ap...@bago.org>.
Danny Angus ha scritto:
> Stefano,
> I think this may be a bug, I suspect that if anything else changed the
> recipients between "store" and the actual write, that data would be
> lost.
> Given that mailets are multi threaded I suspect that this could
> happen, resulting in mail being "lost" by some recipients and double
> copies to others.

I don't think it may happens: mailets are multi threaded but a single
mail is processed by a single mailet at each time. Mail objects are
never accessed by multiple threads concurrently.

Stefano

> Hmm, I'll see if I can *make* it happen.
> 
> d.
> 
> 
> On 5/31/05, Stefano Bagnara <ap...@bago.org> wrote:
>> I see that RemoteDelivery does this:
>>
>> String name = mail.getName();
>> for (Iterator i = targets.keySet().iterator(); i.hasNext(); ) {
>>     String host = (String) i.next();
>>     Collection rec = (Collection) targets.get(host);
>>     if (isDebug) {
>>         StringBuffer logMessageBuffer =
>>             new StringBuffer(128)
>>                     .append("Sending mail to ")
>>                     .append(rec)
>>                     .append(" on host ")
>>                     .append(host);
>>         log(logMessageBuffer.toString());
>>     }
>>     mail.setRecipients(rec);
>>     StringBuffer nameBuffer =
>>         new StringBuffer(128)
>>                 .append(name)
>>                 .append("-to-")
>>                 .append(host);
>>     mail.setName(nameBuffer.toString());
>>     outgoing.store(mail);
>> }
>>
>> Please note that at every iteration the same "mail" instance is changed and
>> stored in the repository with a new name.
>>
>> Is this a supported way to handle Mailets Mail objects? Wouldn't be more
>> correct to clone the original mail at each iteration, assigning the new name
>> in the duplicate method and setting its recipients before storing it?
>>
>> Currently it works fine because RemoteDelivery does not support passthrough
>> and because we use the setName that is not and should not be available via
>> Mail interface.
>>
>> We should pay attention to this issues when talking about the new mailet
>> API.
>>
>> Stefano
>>
>>
>