View Javadoc

1   /***
2    * 
3    * Copyright 2004 Protique Ltd
4    * 
5    * Licensed under the Apache License, Version 2.0 (the "License"); 
6    * you may not use this file except in compliance with the License. 
7    * You may obtain a copy of the License at 
8    * 
9    * http://www.apache.org/licenses/LICENSE-2.0
10   * 
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS, 
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
14   * See the License for the specific language governing permissions and 
15   * limitations under the License. 
16   * 
17   **/
18  package org.codehaus.activemq.util;
19  
20  import org.apache.log4j.AppenderSkeleton;
21  import org.apache.log4j.spi.LoggingEvent;
22  
23  import javax.jms.Connection;
24  import javax.jms.Destination;
25  import javax.jms.JMSException;
26  import javax.jms.Message;
27  import javax.jms.MessageProducer;
28  import javax.jms.Session;
29  import javax.naming.NamingException;
30  import java.io.Serializable;
31  import java.util.ArrayList;
32  import java.util.Iterator;
33  import java.util.List;
34  
35  /***
36   * An abstract base class for implementation inheritence for a log4j JMS appender
37   *
38   * @version $Revision: 1.1 $
39   */
40  public abstract class JmsLogAppenderSupport extends AppenderSkeleton {
41  
42      public static final int JMS_PUBLISH_ERROR_CODE = 61616;
43  
44      private Connection connection;
45      private Session session;
46      private MessageProducer producer;
47      private boolean allowTextMessages = true;
48      private String subjectPrefix = "log4j.";
49  
50      public JmsLogAppenderSupport() {
51      }
52  
53      public Connection getConnection() throws JMSException, NamingException {
54          if (connection == null) {
55              connection = createConnection();
56          }
57          return connection;
58      }
59  
60      public void setConnection(Connection connection) {
61          this.connection = connection;
62      }
63  
64      public Session getSession() throws JMSException, NamingException {
65          if (session == null) {
66              session = createSession();
67          }
68          return session;
69      }
70  
71      public void setSession(Session session) {
72          this.session = session;
73      }
74  
75      public MessageProducer getProducer() throws JMSException, NamingException {
76          if (producer == null) {
77              producer = createProducer();
78          }
79          return producer;
80      }
81  
82      public void setProducer(MessageProducer producer) {
83          this.producer = producer;
84      }
85  
86      public void close() {
87          List errors = new ArrayList();
88          if (producer != null) {
89              try {
90                  producer.close();
91              }
92              catch (JMSException e) {
93                  errors.add(e);
94              }
95          }
96          if (session != null) {
97              try {
98                  session.close();
99              }
100             catch (JMSException e) {
101                 errors.add(e);
102             }
103         }
104         if (connection != null) {
105             try {
106                 connection.close();
107             }
108             catch (JMSException e) {
109                 errors.add(e);
110             }
111         }
112         for (Iterator iter = errors.iterator(); iter.hasNext();) {
113             JMSException e = (JMSException) iter.next();
114             getErrorHandler().error("Error closing JMS resources: " + e, e, JMS_PUBLISH_ERROR_CODE);
115         }
116     }
117 
118     public boolean requiresLayout() {
119         return false;
120     }
121 
122     public void activateOptions() {
123         try {
124             // lets ensure we're all created
125             getProducer();
126         }
127         catch (Exception e) {
128             getErrorHandler().error("Could not create JMS resources: " + e, e, JMS_PUBLISH_ERROR_CODE);
129         }
130     }
131 
132 
133     // Implementation methods
134     //-------------------------------------------------------------------------
135     protected abstract Connection createConnection() throws JMSException, NamingException;
136 
137     protected Session createSession() throws JMSException, NamingException {
138         return getConnection().createSession(false, Session.AUTO_ACKNOWLEDGE);
139     }
140 
141     protected MessageProducer createProducer() throws JMSException, NamingException {
142         return getSession().createProducer(null);
143     }
144 
145     protected void append(LoggingEvent event) {
146         System.out.println("#### Calling append with event: " + event);
147         try {
148             Message message = createMessage(event);
149             Destination destination = getDestination(event);
150             getProducer().send(destination, message);
151         }
152         catch (Exception e) {
153             getErrorHandler().error("Could not send message due to: " + e, e, JMS_PUBLISH_ERROR_CODE, event);
154         }
155     }
156 
157     protected Message createMessage(LoggingEvent event) throws JMSException, NamingException {
158         Message answer = null;
159         Object value = event.getMessage();
160         if (allowTextMessages && value instanceof String) {
161             answer = getSession().createTextMessage((String) value);
162         }
163         else {
164             answer = getSession().createObjectMessage((Serializable) value);
165         }
166         answer.setStringProperty("level", event.getLevel().toString());
167         answer.setIntProperty("levelInt", event.getLevel().toInt());
168         answer.setStringProperty("threadName", event.getThreadName());
169         return answer;
170     }
171 
172     protected Destination getDestination(LoggingEvent event) throws JMSException, NamingException {
173         String name = subjectPrefix + event.getLoggerName();
174         return getSession().createTopic(name);
175     }
176 }