/**
* Copyright (c) 2009 - 2012 Red Hat, Inc.
*
* This software is licensed to you under the GNU General Public License,
* version 2 (GPLv2). There is NO WARRANTY for this software, express or
* implied, including the implied warranties of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
* along with this software; if not, see
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
*
* Red Hat trademarks are not licensed under GPLv2. No permission is
* granted to use or replicate Red Hat trademarks that are incorporated
* in this software or its documentation.
*/
package org.candlepin.audit;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.inject.Inject;
import org.hornetq.api.core.HornetQException;
import org.hornetq.api.core.HornetQExceptionType;
import org.hornetq.api.core.TransportConfiguration;
import org.hornetq.api.core.client.ClientConsumer;
import org.hornetq.api.core.client.ClientSession;
import org.hornetq.api.core.client.ClientSessionFactory;
import org.hornetq.api.core.client.HornetQClient;
import org.hornetq.core.remoting.impl.invm.InVMConnectorFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* EventSource
*/
public class EventSource {
private static Logger log = LoggerFactory.getLogger(EventSource.class);
static final String QUEUE_ADDRESS = "event";
private ClientSession session;
private ClientSessionFactory factory;
private ObjectMapper mapper;
@Inject
public EventSource(ObjectMapper mapper) {
this.mapper = mapper;
try {
factory = createSessionFactory();
// Specify a message ack batch size of 0 to have hornetq immediately ack
// any message successfully received with the server. Not doing so can lead
// to duplicate messages if the server goes down before the batch ack size is
// reached.
session = factory.createSession(true, true, 0);
session.start();
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* @return new instance of {@link ClientSessionFactory}
* @throws Exception
*/
protected ClientSessionFactory createSessionFactory() throws Exception {
return HornetQClient.createServerLocatorWithoutHA(
new TransportConfiguration(
InVMConnectorFactory.class.getName())).createSessionFactory();
}
protected void shutDown() {
try {
session.stop();
session.close();
factory.close();
}
catch (HornetQException e) {
log.warn("Exception while trying to shutdown hornetq", e);
}
}
void registerListener(EventListener listener) {
String queueName = QUEUE_ADDRESS + "." + listener.getClass().getCanonicalName();
log.debug("registering listener for " + queueName);
try {
try {
// Create a durable queue that will be persisted to disk:
session.createQueue(QUEUE_ADDRESS, queueName, true);
log.debug("created new event queue " + queueName);
}
catch (HornetQException e) {
// if the queue exists already we already created it in a previous run,
// so that's fine.
if (e.getType() != HornetQExceptionType.QUEUE_EXISTS) {
throw e;
}
}
ClientConsumer consumer = session.createConsumer(queueName);
consumer.setMessageHandler(new ListenerWrapper(listener, mapper));
}
catch (HornetQException e) {
log.error("Unable to register listener :" + listener, e);
}
}
}