All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.ebay.jetstream.event.channel.file.OutboundRollingFileChannel Maven / Gradle / Ivy

/*******************************************************************************
 *  Copyright © 2012-2015 eBay Software Foundation
 *  This program is dual licensed under the MIT and Apache 2.0 licenses.
 *  Please see LICENSE for more information.
 *******************************************************************************/
package com.ebay.jetstream.event.channel.file;


import java.io.IOException;

import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.RollingFileAppender;
import org.apache.log4j.spi.LoggingEvent;
import org.springframework.context.ApplicationEvent;
import org.springframework.jmx.export.annotation.ManagedOperation;
import org.springframework.jmx.export.annotation.ManagedResource;

import com.ebay.jetstream.counter.LongEWMACounter;
import com.ebay.jetstream.event.EventException;
import com.ebay.jetstream.event.JetstreamEvent;
import com.ebay.jetstream.event.channel.AbstractOutboundChannel;
import com.ebay.jetstream.management.Management;
import com.ebay.jetstream.messaging.MessageServiceTimer;

@ManagedResource(objectName = "Event/Channel", description = "Write Jetstream data to disk")
public abstract class OutboundRollingFileChannel extends AbstractOutboundChannel {
	
	private boolean m_stop = false;
	private boolean m_pause = false;
	private boolean m_restart = false;
	private String streamType = "";
	private RollingFileAppender rollingFileAppender = null;
	private static final Logger LOGGER = Logger.getLogger("com.ebay.jetstream.event.channel.file");
	
	public OutboundRollingFileChannel(String streamType, String fileName, int backups, String fileSize) throws IOException {
		this.streamType = streamType;
		rollingFileAppender = new RollingFileAppender(new EventLayout(), fileName);
		rollingFileAppender.setMaxBackupIndex(backups);
		rollingFileAppender.setMaxFileSize(fileSize);
	}
	
	@Override
	public void afterPropertiesSet() throws Exception {	
		Management.addBean(getBeanName(), this);
	}

	@Override
  	public void processApplicationEvent(ApplicationEvent event) { }
	
	@Override
	public void flush() throws EventException {	}
	
	public void open() throws EventException {
		LOGGER.info(  "Opening Outbound File Channel");
  	    m_eventsReceivedPerSec = new LongEWMACounter(60, MessageServiceTimer.sInstance().getTimer());
  		m_eventsSentPerSec = new LongEWMACounter(60, MessageServiceTimer.sInstance().getTimer());
	}
	
	@ManagedOperation
	public void resetStats() {
		super.resetStats();
	}
	
	abstract String createEventLine(JetstreamEvent e);
	
	/*** this is the point where the data get into this class */
	public void sendEvent(JetstreamEvent event) throws EventException {
		if (m_stop || m_pause) {
			return;
		}
 		if (event == null) {
			return;
		}
		incrementEventRecievedCounter();
		
		String streamType = event.getEventType();
		
		if (!this.streamType.equals(streamType)) {
			incrementEventDroppedCounter();
			return;
		}
		
		JetstreamEvent userEvent = new JetstreamEvent();
		userEvent.putAll(event);
		
		/** empty event. drop it */
		if (userEvent.size() == 0) {
			LOGGER.info(   "the event is empty. Should not happen?");
			incrementEventDroppedCounter();
			return;
		}
			
		String eventLineString = createEventLine(userEvent);
		rollingFileAppender.doAppend(new LoggingEvent("", Logger.getLogger("whocares"), Level.INFO, eventLineString, null));
		incrementEventSentCounter();
	}

	public void shutDown() {
		close();
	}

	@Override
	public String toString() {
		return getBeanName();
	}
	
	@Override
	public int getPendingEvents() {
		return 0;
	}
	
	@ManagedOperation
	public void pause() {
		m_pause = true;
	}
	
	@ManagedOperation
	public void resume() {
		m_pause = false;
	}
	
}





© 2015 - 2025 Weber Informatics LLC | Privacy Policy