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.Connection;
011    import javax.jms.Destination;
012    import javax.jms.JMSException;
013    import javax.jms.MessageProducer;
014    import javax.jms.Session;
015    import javax.jms.TextMessage;
016    import javax.xml.parsers.ParserConfigurationException;
017    import javax.xml.transform.TransformerException;
018    
019    import biz.hammurapi.config.ConfigurationException;
020    
021    /**
022     * Sends collected metrics to JMS destination (JMS 1.1).
023     * @author Pavel Vlasov
024     * @revision $Revision$
025     */
026    public class JmsDestinationSliceConsumer extends JmsSliceConsumer {
027    
028            private Destination destination;
029            private Connection connection;
030    
031            /**
032             * @param timer Shared timer to schedule send. If null then internal timer is used.
033             * @param interval Send interval.
034             * @param connection JMS connection.
035             * @param queue JMS queue.
036             */
037            public JmsDestinationSliceConsumer(Timer timer, long interval, Connection connection, Destination destination) {
038                    super(timer, interval);
039                    this.connection=connection;
040                    this.destination=destination;
041            }
042            
043            private TimerTask sendTask=new TimerTask() {
044    
045                    public void run() {
046                            try {
047                                    Session session=connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
048                                    try {
049                                            TextMessage msg = session.createTextMessage();
050                                            msg.setText(getSlicesXml());
051                                            MessageProducer producer = session.createProducer(destination);
052                                            try {
053                                                    producer.send(msg);
054                                            } finally {
055                                                    producer.close();
056                                            }
057                                    } finally {
058                                            session.close();
059                                    }
060                            } catch (JMSException e) {
061                                    System.err.println("[WARNING] Could not send metrics to queue: "+e);
062                                    e.printStackTrace();
063                            } catch (IOException e) {
064                                    System.err.println("[WARNING] Could not write slices to message: "+e);
065                                    e.printStackTrace();
066                            } catch (TransformerException e) {
067                                    System.err.println("[WARNING] Could not write slices to XML: "+e);
068                                    e.printStackTrace();
069                            } catch (ParserConfigurationException e) {
070                                    System.err.println("[WARNING] Could not write slices to XML: "+e);
071                                    e.printStackTrace();
072                            }
073                            
074                    }
075                    
076            };
077            
078            public void start() throws ConfigurationException {
079                    super.start();
080                    timer.schedule(sendTask, interval, interval);
081            }
082            
083            public void stop() throws ConfigurationException {
084                    sendTask.cancel();
085                    // Send remaining metrics.
086                    sendTask.run();
087                    super.stop();
088            }
089    
090    }