org.zenoss.zep.impl.MigratedEventQueueListener.java Source code

Java tutorial

Introduction

Here is the source code for org.zenoss.zep.impl.MigratedEventQueueListener.java

Source

/*****************************************************************************
 * 
 * Copyright (C) Zenoss, Inc. 2011, all rights reserved.
 * 
 * This content is made available according to terms specified in
 * License.zenoss under the directory where your Zenoss product is installed.
 * 
 ****************************************************************************/

package org.zenoss.zep.impl;

import com.google.protobuf.Message;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.DuplicateKeyException;
import org.zenoss.amqp.AmqpException;
import org.zenoss.amqp.Channel;
import org.zenoss.protobufs.zep.Zep.EventSummary;
import org.zenoss.zep.annotations.TransactionalRollbackAllExceptions;
import org.zenoss.zep.dao.EventStoreDao;
import org.zenoss.zep.dao.EventSummaryBaseDao;

/**
 * Used to import migrated events into ZEP.
 */
public class MigratedEventQueueListener extends AbstractQueueListener {

    private static final Logger logger = LoggerFactory.getLogger(MigratedEventQueueListener.class);

    private String queueIdentifier;
    private int prefetchCount = 100;
    private EventSummaryBaseDao eventSummaryBaseDao;
    private EventStoreDao eventStoreDao;

    public void setPrefetchCount(int prefetchCount) {
        this.prefetchCount = prefetchCount;
    }

    public void setEventSummaryBaseDao(EventSummaryBaseDao eventSummaryBaseDao) {
        this.eventSummaryBaseDao = eventSummaryBaseDao;
    }

    public void setEventStoreDao(EventStoreDao eventStoreDao) {
        this.eventStoreDao = eventStoreDao;
    }

    public void setQueueIdentifier(String queueIdentifier) {
        this.queueIdentifier = queueIdentifier;
    }

    @Override
    protected void configureChannel(Channel channel) throws AmqpException {
        logger.debug("Using prefetch count: {} for queue: {}", this.prefetchCount, getQueueIdentifier());
        channel.setQos(0, this.prefetchCount);
    }

    @Override
    protected String getQueueIdentifier() {
        return this.queueIdentifier;
    }

    @Override
    @TransactionalRollbackAllExceptions
    public void handle(Message message) throws Exception {
        EventSummary summary = (EventSummary) message;
        try {
            // ZEN-5286 - Avoid duplicate UUIDs stored in event_summary/event_archive.
            // This check is prone to race conditions but this is worked around by having a single threaded
            // executor processing all migrated events (in both the summary and archive queues). Multi-instance
            // ZEP (if implemented) should come up with a better protection for this to ensure that duplicate
            // events are never imported into the system.
            if (this.eventStoreDao.findByUuid(summary.getUuid()) != null) {
                throw new DuplicateKeyException("Found existing event");
            }
            this.eventSummaryBaseDao.importEvent(summary);
        } catch (DuplicateKeyException e) {
            // Create event summary entry - if we get a duplicate key exception just skip importing this event as it
            // either has already been imported or there is already an active event with the same fingerprint.
            logger.info("Event with UUID {} already exists in database - skipping", summary.getUuid());
        }
    }
}