1 遅延メールの送信

標準JMS APIでは、遅延メッセージを送信するメカニズムは定義されません。ただし、アプリケーションによっては、メッセージがメッセージシステムに送信されても、期限が切れるまで宛先のコンシューマに送信されないように設定する必要があります。

Novell exteNd Messaging PlatformのJMSは、メッセージの送信を遅延できるようにするJMS_jbmq_Delayメッセージプロパティを定義します。 持続メッセージは、JMSサーバに送信されると確実に保存されますが、サーバは遅延時間が過ぎるまで、メッセージを転送しません。

Schedulerクラスのソースコードは、次のとおりです。

package delay;
                                                                           
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
                                                                           
import javax.swing.JLabel;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.JTextArea;
import javax.swing.JSplitPane;
import javax.swing.JTextField;
                                                                           
import javax.naming.InitialContext;
                                                                           
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.Message;
import javax.jms.TextMessage;
import javax.jms.QueueSession;
import javax.jms.QueueSender;
import javax.jms.MessageListener;
import javax.jms.QueueReceiver;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
                                                                           
/**
   This class ilustrates how to use the JMS_jbmq_Delay property to
   send delayed messages.
 */
                                                                           
public class Scheduler
{
    QueueReceiver receiver;
                                                                           
    JFrame     frame    = new JFrame("Scheduler");
    JButton    send     = new JButton("Send");
    JTextArea  incoming = new JTextArea();
    JTextField message  = new JTextField();
    JTextField delay    = new JTextField();
                                                                           
    public static void main(String[] args) throws Exception
    {
    |   Scheduler scheduler = new Scheduler();
    }
                                                                           
    public Scheduler() throws Exception
    {
    |   // create sender and receiver
    |   InitialContext ctx = new InitialContext();
    |   QueueConnectionFactory factory = (QueueConnectionFactory)
    |       ctx.lookup("queue/connectionFactory");
    |   final Queue queue = (Queue) ctx.lookup("queue/queue0");
    |   QueueConnection conn = factory.createQueueConnection();
    |   final QueueSession session = conn.createQueueSession(false,
    |       Session.AUTO_ACKNOWLEDGE);
    |   final QueueSender sender = session.createSender(queue);
    |   receiver = session.createReceiver(queue);
    |                                                                      
    |   // create the gui
    |   incoming.setEditable(false);
    |                                                                      
    |   JPanel panel = new JPanel(new BorderLayout());
    |                                                                      
    |   JPanel p1 = new JPanel();
    |   JPanel p2 = new JPanel(new GridLayout(2,1));
    |   JPanel p3 = new JPanel(new BorderLayout());
    |   p3.add(new JLabel("Message:"), BorderLayout.WEST);
    |   message.setColumns(50);
    |   p3.add(message);
    |   p2.add(p3);
    |   JPanel p4 = new JPanel(new BorderLayout());
    |   p4.add(new JLabel("Delay:"), BorderLayout.WEST);
    |   message.setColumns(10);
    |   p4.add(delay);
    |   p2.add(p4);
    |   JPanel p5 = new JPanel();
    |   p5.add(send);
    |   p1.add(p2);
    |   panel.add(p1);
    |   panel.add(p5, BorderLayout.EAST);
    |                                                                      
    |   // replace receiver according to blocked user
    |   send.addActionListener(new ActionListener() {
    |   |   public void actionPerformed(ActionEvent ev) {
    |   |   |   try {
    |   |   |   |   TextMessage msg;
    |   |   |   |   msg = session.createTextMessage(message.getText());
    |   |   |   |   long time = Long.parseLong(delay.getText());
    |   |   |   |   msg.setLongProperty("JMS_jbmq_Delay", time*1000);
    |   |   |   |   sender.send(msg);
    |   |   |   } catch (Exception ex) {
    |   |   |   |   ex.printStackTrace();
    |   |   |   }
    |   |   }
    |   });
    |                                                                      
    |   receiver.setMessageListener(new MessageListener() {
    |   |   public void onMessage(Message m) {
    |   |   |   try {
    |   |   |   |   TextMessage msg = (TextMessage) m;
    |   |   |   |   incoming.append(msg.getText());
    |   |   |   } catch (Exception ex) { ex.printStackTrace(); }
    |   |   }
    |   });
    |                                                                      
    |   // now start the connection
    |   conn.start();
    |                                                                      
    |   // setup rest of gui
    |   JSplitPane split = new JSplitPane(JSplitPane.VERTICAL_SPLIT,
    |       panel, incoming);
    |   split.setOneTouchExpandable(true);
    |   split.setDividerLocation(205);
    |                                                                      
    |   frame.getContentPane().setLayout(new BorderLayout());
    |   frame.getContentPane().add(split);
    |   frame.setSize(new Dimension(400,300));
    |   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    |   frame.setVisible(true);
    }
}
スケジューラアプリケーションにより、遅延メッセージを入力する領域、および受信メッセージを表示する領域のあるGUIが作成されます。メッセージを送信するには、テキストおよびメッセージ遅延を入力して、[送信]ボタンをクリックします。着信メッセージは、遅延の期限が切れるとGUIの下部に表示されます。

トップに戻る


Copyright © 2000-2003, Novell, Inc.All rights reserved.