ActiveMQを使ったJMSのメール送信サンプルを紹介します。
ActiveMQは下記からダウンロードが可能です。
AcitveMQ:
http://activemq.apache.org/download.html
また、サンプルでは別途下記も必要になります。
Commons Email:
Commons Email Downloads
JavaMail:
http://java.sun.com/products/javamail/
JAF:
http://java.sun.com/products/javabeans/jaf/downloads/index.html
まずは普通にmail送信を行った場合。
test パッケージにTestNonJms.java として作成します。
-
package test;
-
-
import org.apache.commons.mail.EmailException;
-
import org.apache.commons.mail.SimpleEmail;
-
-
public class TestNonJms {
-
-
-
try {
-
final SimpleEmail email = new SimpleEmail();
-
email.setFrom("送信者アドレス");
-
email.addTo("受信者アドレス");
-
email.setSubject("JMS test");
-
email.setContent("メールのテストです。", "text/plain; charset=ISO-2022-JP");
-
email.setHostName("SMTPサーバーアドレス");
-
email.send();
-
} catch (EmailException e) {
-
e.printStackTrace();
-
}
-
-
-
}
-
}
メールサーバの性能、トラフィック等によって値は変動しますが、3回実行して下記の様になりました。
-
non Jms:1672
-
non Jms:1625
-
non Jms:1625
続いてJMSを使用した場合です。
test.serverパッケージにTestJmsServer.javaとしておきます。
MessageBrokerよりメッセージを取得し処理するクラスになります。
-
package test.server;
-
-
import javax.jms.JMSException;
-
import javax.jms.ObjectMessage;
-
import javax.jms.Queue;
-
import javax.jms.QueueConnection;
-
import javax.jms.QueueReceiver;
-
import javax.jms.QueueSession;
-
-
import org.apache.activemq.ActiveMQConnection;
-
import org.apache.activemq.ActiveMQConnectionFactory;
-
import org.apache.commons.mail.EmailException;
-
import org.apache.commons.mail.SimpleEmail;
-
-
import test.TestMessage;
-
-
public class TestJmsServer {
-
public static boolean bQuit = false;
-
-
QueueConnection connection = null;
-
QueueSession session = null;
-
QueueReceiver receiver = null;
-
-
try{
-
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_BROKER_URL);
-
connection = factory.createQueueConnection();
-
-
session = connection.createQueueSession(false,QueueSession.AUTO_ACKNOWLEDGE);
-
Queue queue = session.createQueue("TestMailQueue");
-
-
receiver = session.createReceiver(queue);
-
-
connection.start();
-
-
while(!bQuit) {
-
ObjectMessage msg = (ObjectMessage)receiver.receive();
-
TestMessage mailMessage = (TestMessage)msg.getObject();
-
-
try {
-
final SimpleEmail email = new SimpleEmail();
-
email.setFrom(mailMessage.getFromAddr());
-
email.addTo(mailMessage.getToAddr());
-
email.setSubject(mailMessage.getSubject());
-
email.setContent(mailMessage.getMessage(), "text/plain; charset=ISO-2022-JP");
-
email.setHostName("SMTPサーバーアドレス");
-
email.send();
-
-
} catch (EmailException e) {
-
e.printStackTrace();
-
bQuit = true;
-
}
-
}
-
-
} catch (JMSException e) {
-
e.printStackTrace();
-
-
} finally {
-
try {
-
if (receiver != null) {
-
receiver.close();
-
}
-
if (session != null) {
-
session.close();
-
}
-
if (connection != null) {
-
connection.close();
-
}
-
-
} catch (JMSException e) {
-
e.printStackTrace();
-
}
-
}
-
}
-
}
testパッケージにTestMessage.javaを作成します。
メッセージを格納するクラスになります。
-
package test;
-
-
import java.io.Serializable;
-
-
-
private static final long serialVersionUID = 5997289309760126077L;
-
-
private String subject;
-
private String fromAddr;
-
private String toAddr;
-
private String message;
-
-
return subject;
-
}
-
this.subject = subject;
-
}
-
return fromAddr;
-
}
-
this.fromAddr = fromAddr;
-
}
-
return toAddr;
-
}
-
this.toAddr = toAddr;
-
}
-
return message;
-
}
-
this.message = message;
-
}
-
}
testパッケージにTestJms.javaを作成します。
JMSを利用してTestNonJmsと同等の処理を行うクラスになります。
-
package test;
-
-
import javax.jms.JMSException;
-
import javax.jms.Message;
-
import javax.jms.Queue;
-
import javax.jms.QueueConnection;
-
import javax.jms.QueueConnectionFactory;
-
import javax.jms.QueueSender;
-
import javax.jms.QueueSession;
-
-
import org.apache.activemq.ActiveMQConnection;
-
import org.apache.activemq.ActiveMQConnectionFactory;
-
-
public class TestJms {
-
-
-
-
QueueConnection connection = null;
-
QueueSession session = null;
-
QueueSender sender = null;
-
-
try {
-
-
QueueConnectionFactory factory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_BROKER_URL);
-
connection = factory.createQueueConnection();
-
-
session = connection.createQueueSession(false,QueueSession.AUTO_ACKNOWLEDGE);
-
Queue queue = session.createQueue("TestMailQueue");
-
sender= session.createSender(queue);
-
-
connection.start();
-
-
TestMessage mailMessage = new TestMessage();
-
mailMessage.setSubject("ActiveMQ test");
-
mailMessage.setFromAddr("送信者アドレス");
-
mailMessage.setToAddr("受信者アドレス");
-
mailMessage.setMessage("メールのテストです。");
-
-
Message msg = session.createObjectMessage(mailMessage);
-
-
sender.send(msg);
-
-
} catch (JMSException e) {
-
e.printStackTrace();
-
-
} finally {
-
try {
-
if (sender != null) {
-
sender.close();
-
}
-
if (session != null) {
-
session.close();
-
}
-
if (connection != null) {
-
connection.close();
-
}
-
} catch (JMSException e) {
-
e.printStackTrace();
-
}
-
}
-
-
-
}
-
}
まず、コマンドプロンプトよりActiveMQのアーカイブに含まれているbin/activemq.bat(MessageBroker)を実行しておきます。
続いてTestJmsServerを実行します。これでJMSが使える状態になりました。
TestJmsを実行してみます。
3回実行して下記の様になりました。
-
TestJms:687
-
TestJms:671
-
TestJms:656
TestNonJmsを実行した時よりも大分処理時間が短くなっている事が判ります。
この様にメールの送信や処理に多少の遅延が許させる処理等を非同期化する事でアプリケーションのパフォーマンスを上げる事が出来ます。




