001    /*
002    @license.text@
003     */
004    package biz.hammurapi.jms;
005    
006    import java.io.IOException;
007    import java.util.Timer;
008    import java.util.TimerTask;
009    
010    import javax.jms.JMSException;
011    import javax.jms.Session;
012    import javax.jms.TextMessage;
013    import javax.jms.Topic;
014    import javax.jms.TopicConnection;
015    import javax.jms.TopicPublisher;
016    import javax.jms.TopicSession;
017    import javax.xml.parsers.ParserConfigurationException;
018    import javax.xml.transform.TransformerException;
019    
020    import biz.hammurapi.config.ConfigurationException;
021    
022    /**
023     * Sends collected metrics to JMS topic.
024     * @author Pavel Vlasov
025     * @revision $Revision$
026     */
027    public class JmsTopicSliceConsumer extends JmsSliceConsumer {
028    
029            private Topic topic;
030            private TopicConnection connection;
031    
032            /**
033             * @param timer Shared timer to schedule send. If null then internal timer is used.
034             * @param interval Send interval.
035             * @param connection JMS connection.
036             * @param topic JMS topic.
037             */
038            public JmsTopicSliceConsumer(Timer timer, long interval, TopicConnection connection, Topic topic) {
039                    super(timer, interval);
040                    this.connection=connection;
041                    this.topic=topic;
042            }
043            
044            private TimerTask sendTask=new TimerTask() {
045    
046                    public void run() {
047                            try {
048                                    TopicSession session=connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
049                                    try {
050                                            TextMessage msg = session.createTextMessage();
051                                            msg.setText(getSlicesXml());
052                                            TopicPublisher publisher = session.createPublisher(topic);
053                                            try {
054                                                    publisher.publish(msg);
055                                            } finally {
056                                                    publisher.close();
057                                            }
058                                    } finally {
059                                            session.close();
060                                    }
061                            } catch (JMSException e) {
062                                    System.err.println("[WARNING] Could not send metrics to topic: "+e);
063                                    e.printStackTrace();
064                            } catch (IOException e) {
065                                    System.err.println("[WARNING] Could not write slices to message: "+e);
066                                    e.printStackTrace();
067                            } catch (TransformerException e) {
068                                    System.err.println("[WARNING] Could not write slices to XML: "+e);
069                                    e.printStackTrace();
070                            } catch (ParserConfigurationException e) {
071                                    System.err.println("[WARNING] Could not write slices to XML: "+e);
072                                    e.printStackTrace();
073                            }
074                            
075                    }
076                    
077            };
078            
079            public void start() throws ConfigurationException {
080                    super.start();
081                    timer.schedule(sendTask, interval, interval);
082            }
083            
084            public void stop() throws ConfigurationException {
085                    sendTask.cancel();
086                    // Send remaining metrics.
087                    sendTask.run();
088                    super.stop();
089            }
090    
091    }