金曜日 3 13, 2009
金曜日 3 13, 2009
前回に引き続き、E メールを送信する MBean を作成し、管理ルールを設定してみます。
まずは MBean インタフェース。メール送信に必要な情報を属性として持たせます。外部に設定ファイルなどを置くことを最初考えましたが、MBean の属性とした方がお手軽です。
package poormansem.action;
/**
*
* @author ogino
*/
public interface AlertEmailMBean {
public String getHost();
public void setHost(String host);
public String getUser();
public void setUser(String user);
public String getSender();
public void setSender(String sender);
public String getReceiver();
public void setReceiver(String receiver);
}
そして、その実装クラス。上の MBean インタフェースと共に、NotificationListener を実装します。
package poormansem.action;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.MimeMessage;
import javax.management.Notification;
import javax.management.NotificationListener;
import javax.management.monitor.MonitorNotification;
/**
*
* @author ogino
*/
public class AlertEmail implements NotificationListener, AlertEmailMBean {
Logger logger;
String host;
String user;
String sender;
String receiver;
public AlertEmail() {
logger = Logger.getLogger(AlertEmail.class.getName());
}
public void handleNotification(Notification notification, Object handback) {
String observedAttribute = ((MonitorNotification) notification).getObservedAttribute();
String notificationMessage;
if (notification.getType().equals(MonitorNotification.THRESHOLD_HIGH_VALUE_EXCEEDED)) {
notificationMessage = observedAttribute + " exceeded high threshold.";
} else {
notificationMessage = observedAttribute + " exceeded low threshold.";
}
logger.log(Level.INFO, notificationMessage);
if (host == null || user == null || sender == null || receiver == null) {
logger.log(Level.WARNING, "Cannot send email as AlertEmail MBean properties not set.");
} else {
//Construct mail message..
Properties props = System.getProperties();
props.put("mail.host", host);
props.put("mail.user", user);
props.put("mail.from", sender);
Session session = Session.getDefaultInstance(props);
try {
MimeMessage msg = new MimeMessage(session);
msg.setSubject("GF Self Management Alert");
msg.setRecipients(Message.RecipientType.TO, receiver);
msg.setText(notificationMessage);
Transport.send(msg);
logger.log(Level.INFO, "Self Management alert email sent...");
} catch (MessagingException mex) {
logger.log(Level.SEVERE, null, mex);
}
}
}
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public String getReceiver() {
return receiver;
}
public void setReceiver(String receiver) {
this.receiver = receiver;
}
public String getSender() {
return sender;
}
public void setSender(String sender) {
this.sender = sender;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
}
前回と同様これを適当な jar ファイルにパッケージし、GlassFish にカスタム MBean として配備します。途中、属性 host, user, sender, reciever を設定します。今回はそれぞれ、localhost, root, 自分のメールアドレス、自分のメールアドレス、としています。
これで、前回作成したものと合わせ、監視とアクションの MBean が共に配備できました。さっそく、管理ルールの設定をします。
「設定」 -> 「管理ルール」 で、全ての規則が有効になっていることを確認、「新規...」をクリックし、以下のように設定します。まずは CPULoad が 1 を超えたらメール通知するルールを設定してみます。
監視対象の MBean としては、前回作成した SystemMonitor の MBean オブジェクト名を入力します。今回の場合、user:impl-class-name=poormansem.mbean.SystemMonitor,name=SystemMonitorMBean,server=server になりますが、これは jconsole で MBeanInfo を確認してもよいですし、GlassFish の管理コンソールでも確認できます。管理コンソールで見ることができる値には ,server=server はありませんので、管理ルールの作成の際には最後に追加して入力して下さい。しきい値の 0 - 1 は、早めにメール送信を確認できるよう適当に指定しています。
サーバを再起動してしばらくすると、下記のメールを受信できました。やったー。
2 回にわけて、カスタム MBean を作って管理ルールの作成のしかたを見てきましたがどうでしたか。管理ルールは割と簡単なプログラム (MBean) を書くことで、GlassFish の管理面でとても可能性が広がる機能です。例えば負荷に応じてクラスタ内でインスタンスを増減させたりなど色々なことが想像できるとおもいます。ぜひご活用下さい。