EJB 3.0では、MDBのBeanクラスに@MessageDriven
アノテーションを使用して、どのメッセージキューを監視するか(すなわち、queue/mdb
など)を指定します。キューが存在しない場合はJBossコンテナがデプロイ時に自動的に作成します。XML設定ファイルは必要ありません!
BeanクラスはMessageListener
インタフェースを実装する必要があります。MessageListener
インタフェースはonMessage()
メソッドを1つだけ定義しています。MDBが監視するキューにメッセージが届くと、JBossコンテナはBeanクラスのonMessage()
メソッドを呼び、受信したメッセージを引数で渡します。この例では、CalculatorBean.onMessage()
メソッドは、メッセージ本体を取得し、計算用引数を切り出し、計算を行い、JSPページが結果を受け取れるように、結果を静的なデータ管理クラスに保存します。サービス要求メッセージ内のタイムスタンプ"sent"を計算結果レコードの一意なIDとして使用しています(処理量の少ないwebサイトでは十分機能します)。JSPページcheck.jspはこのメッセージIDをもとに計算結果レコードをピックアップし、内容を表示します。
@MessageDriven(activationConfig =
{
@ActivationConfigProperty(propertyName="destinationType",
propertyValue="javax.jms.Queue"),
@ActivationConfigProperty(propertyName="destination",
propertyValue="queue/mdb")
})
public class CalculatorBean implements MessageListener {
public void onMessage (Message msg) {
try {
TextMessage tmsg = (TextMessage) msg;
Timestamp sent =
new Timestamp(tmsg.getLongProperty("sent"));
StringTokenizer st =
new StringTokenizer(tmsg.getText(), ",");
int start = Integer.parseInt(st.nextToken());
int end = Integer.parseInt(st.nextToken());
double growthrate = Double.parseDouble(st.nextToken());
double saving = Double.parseDouble(st.nextToken());
double result =
calculate (start, end, growthrate, saving);
RecordManager.addRecord (sent, result);
} catch (Exception e) {
e.printStackTrace ();
}
}
// ... ...
}