I tried to follow this example, but when I copied this class to my project I failed to run it.
I've no idea how my imports should look like, because eclipse suggests a lot of options. I tried
import javax.jms.Connection;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQObjectMessage;
import org.apache.log4j.Logger;
import org.apache.log4j.spi.LoggingEvent;
But I got:
log4j:WARN No appenders could be found for logger (org.apache.activemq.transport.tcp.TcpTransport).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
This tutorial isn't clear for me. Do you know anything with more details (to absolute begginer)? Or maybe you know how to solve my problem with this exception?
EDIT:
log4.properties is exact copy of file in example
log4j.rootLogger=INFO, stdout, jms
## Be sure that ActiveMQ messages are not logged to 'jms' appender
log4j.logger.org.apache.activemq=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %-5p %c - %m%n
## Configure 'jms' appender. You'll also need jndi.properties file in order to make it work
log4j.appender.jms=org.apache.log4j.net.JMSAppender
log4j.appender.jms.InitialContextFactoryName=org.apache.activemq.jndi.ActiveMQInitialContextFactory
log4j.appender.jms.ProviderURL=tcp://localhost:61616
log4j.appender.jms.TopicBindingName=logTopic
log4j.appender.jms.TopicConnectionFactoryBindingName=ConnectionFactory
I think you have problem in you configuration log4j.properties file. Look carefuly to it configuration. You can try to find tutorials about configuration log4j with google for example look this
This is the tested code -
In log4j.xml make entry for the JMSAppender class as below -
<appender name="amqAppender" class="com.appender.JMSQueueAppender">
<param name="brokerUri" value="failover:(tcp://host1:port,tcp://host2:port,tcp://host3:port)?randomize=false" />
<param name="queueName" value="MobiviteQueue" />
</appender>
And to use it -
<root>
<level value="ERROR" />
<appender-ref ref="amqAppender" />
</root>
And the appeneder class is -
package com.appender;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.ObjectMessage;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.log4j.Appender;
import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.Logger;
import org.apache.log4j.spi.LoggingEvent;
public class JMSQueueAppender extends AppenderSkeleton implements Appender {
private static Logger logger = Logger.getLogger(JMSQueueAppender.class);
private String brokerUri;
private String queueName;
@Override
protected synchronized void append(LoggingEvent event) {
try {
//System.out.println("JMSQueueAppender -----append method is called brokerUri ------ "+brokerUri);
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(brokerUri);
// Create a Connection
javax.jms.Connection connection = connectionFactory.createConnection();
connection.start();
// Create a Session
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// Create the destination (Topic or Queue)
Destination destination = session.createQueue(queueName);
// Create a MessageProducer from the Session to the Topic or Queue
MessageProducer producer = session.createProducer(destination);
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
ObjectMessage message = session.createObjectMessage(event);
// Tell the producer to send the message
producer.send(message);
// Clean up
session.close();
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public String getBrokerUri() {
return brokerUri;
}
public void setBrokerUri(String brokerUri) {
this.brokerUri = brokerUri;
}
public String getQueueName() {
return queueName;
}
public void setQueueName(String queueName) {
this.queueName = queueName;
}
public void close() {
// TODO Auto-generated method stub
}
public boolean requiresLayout() {
// TODO Auto-generated method stub
return false;
}
}