On 2008-05-21, citizen Dave Miller testified:
Bart Ogryczak wrote:
Hi,
I'm trying to send a quiet a few mails using multithreaded aplication,
sending to various outgoing SMTP servers (EXIM). Some of those mails
get resent after exactly 3600s, with different MsgID. How can I avoid
that?
For troubleshooting help, please post your code.
public class MailSender implements Runnable {
private BlockingQueue<Map> queue;
Session mailSession;
/*... more stuff related to generation of content...*/
public MailSender(BlockingQueue<Map> queue, String smtp) {
this.queue = queue;
if(smtp.contains(":")) {
String[] smtpSplit = smtp.split(":");
smtpHost = smtpSplit[0];
smtpPort = Integer.parseInt(smtpSplit[1]);
} else {
smtpHost = smtp;
smtpPort = 25;
}
}
public void run() {
try {
while(true) {
Map t = queue.take(); //content data
if(t.containsKey(this.config.getString("POISON"))) break;
try {
Properties props = new Properties();
props.put("mail.smtp.allow8bitmime", "true");
props.put("mail.smtp.host", smtpHost);
props.put("mail.smtp.port", ""+smtpPort );
props.put("mail.smtp.from", "sender@my.host" );
props.put("mail.from", "sender@my.host" );
mailSession = Session.getInstance(props);
SimpleEmail email = new SimpleEmail(); /* from apache.commons.mail */
email.setMailSession(mailSession);
email.setFrom("my@from");
email.addTo(t.get("email")+"");
email.setSubject("my subject");
email.setCharset("UTF-8");
String html = contentGenerator.getContent(t);
email.setContent(html,"text/html");
try {
email.send();
} catch (Exception e) {
System.out.println("send failed "+t);
e.printStackTrace(System.out);
}
} catch (Exception e) {
System.out.println("failed processing "+t);
e.printStackTrace(System.out);
}
}
} catch(InterruptedException e) {}
System.out.println("terminated");
} //end run
} //end class
In the main app, I create 50 threads sending to 8 SMTP servers.
taskQueue = new LinkedBlockingQueue<Map>(config.getInt("TASK_QUEUE"));
String[] smtp = config.getStringArray("SMTP_SERVERS");
Collections.shuffle(Arrays.asList(smtp));
for(int i=0;i<nThrsTasks;i++) {
new Thread(new MailSender(taskQueue,smtp[i%smtp.length])).start();
}
bart
Sorry that I can't be of more help. The "exactly 3600s" (1 hour) says
it's a retry by Exim. Why the message is being successfully sent and
also placed in one of the Exim's failed queue is, I think, the question.
Exim retry queue(s) and try to backtrack those messages.