HA-JavaMail: High-Availability JavaMail |
Introduction | ||
HA-JavaMail is a JavaMail transport proxy that adds efficiency and reliability to an underlying JavaMail provider.
HA-JavaMail is NOT an SMTP implementation - it's a wrapper around an existing implementation that provides several client-side optimizations designed to maximize throughput.
Features | ||
- High-Availibility
- Manages connections to multiple mail servers.
- Message sending will retry with the next available transport until successful.
- Detected dead connections are automatically re-opened and made available.
- Efficiency
- Messages are sent asynchronously to minimize impact of network latency between client and mail server.
- Configurable sending strategies, e.g. email address host grouping minimizes work required to lookup domains.
- Tranparent integration
- Implements the javax.mail.Transport interface
- Integration is as simple as placing HA-JavaMail jar file into classpath.
Sample Usage | ||
e.g.
java.util.Properties properties = new java.util.Properties();
properties.setProperty("mail.transport.protocol", "smtp");
properties.setProperty("mail.host", "mail1.domain.com,mail2.domain.com");
properties.setProperty("mail.transport.pool-size", "10");
javax.mail.Session session = javax.mail.Session.getInstance(properties);
javax.mail.Transport transport = session.getTransport();
long startTime = System.currentTimeMillis();
transport.connect();
javax.mail.Address address = new javax.mail.internet.InternetAddress("test@domain.com");
for (int i = 1; i ≤ 100; ++i)
{
javax.mail.Message message = new javax.mail.internet.MimeMessage(session);
message.setRecipient(javax.mail.Message.RecipientType.TO, address);
message.setSubject("Test #" + i);
message.setText("");
transport.sendMessage(message, message.getAllRecipients());
}
transport.close();
long endTime = System.currentTimeMillis();
System.out.println("Total execution time = " + (startTime - endTime) + " ms");
Configuration | ||
HA-JavaMail is configured entirely via session properties.
Session Property | Default | Description |
---|---|---|
mail.host or mail.protocol.host | Required | Comma seperated list of mail server host names. |
mail.transport.pool-size | 1 | Number of connections to manage per server. |
mail.transport.connect-timeout | 0 | Number of seconds to wait for the first successful transport connection before timing out. 0 means wait forever. |
mail.transport.connect-retry-period | 60 | Number of seconds to wait between transport connection attempts. |
mail.transport.sender-strategy | net.sf.hajavamail.SimpleSenderStrategy | net.sf.hajavamail.SenderStrategy implementation used to send mail. Also available out of the box is net.sf.hajavamail.HostGroupingSenderStrategy. |
Performance | ||
Using HA-JavaMail in conjunction with Sun's JavaMail implementation is significantly faster than Sun's JavaMail implementation alone.
Note: HA-JavaMail (number of servers * Pool size)