標準JMS APIでは、遅延メッセージを送信するメカニズムは定義されません。ただし、アプリケーションによっては、メッセージがメッセージシステムに送信されても、期限が切れるまで宛先のコンシューマに送信されないように設定する必要があります。Novell exteNd Messaging PlatformのJMSは、メッセージの送信を遅延できるようにする
JMS_jbmq_Delay
メッセージプロパティを定義します。 持続メッセージは、JMSサーバに送信されると確実に保存されますが、サーバは遅延時間が過ぎるまで、メッセージを転送しません。
Scheduler
クラスのソースコードは、次のとおりです。スケジューラアプリケーションにより、遅延メッセージを入力する領域、および受信メッセージを表示する領域のあるGUIが作成されます。メッセージを送信するには、テキストおよびメッセージ遅延を入力して、[送信]ボタンをクリックします。着信メッセージは、遅延の期限が切れるとGUIの下部に表示されます。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); } }
Copyright © 2000-2003, Novell, Inc.All rights reserved. |