package com.linkedin.databus.core.test; /* * * Copyright 2013 LinkedIn Corp. All rights reserved * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * */ import java.nio.channels.WritableByteChannel; import org.apache.log4j.Logger; import com.linkedin.databus.core.Checkpoint; import com.linkedin.databus.core.DbusEventBuffer; import com.linkedin.databus.core.Encoding; import com.linkedin.databus.core.OffsetNotFoundException; import com.linkedin.databus.core.ScnNotFoundException; import com.linkedin.databus.core.StreamEventsArgs; import com.linkedin.databus.core.monitoring.mbean.DbusEventsStatisticsCollector; import com.linkedin.databus2.core.filter.AllowAllDbusFilter; /** * Runnable that reads data from a DbusEventBuffer and writes to a channel if any events are found. * * This class is intended only for testing! * * @author snagaraj */ public class DbusEventBufferWriter implements Runnable { public static final Logger LOG = Logger.getLogger(DbusEventBufferWriter.class.getName()); public DbusEventBufferWriter(DbusEventBuffer buffer, WritableByteChannel channel, int batchsize, DbusEventsStatisticsCollector stats) { _channel = channel; _buffer = buffer; _batchsize = batchsize; _stop=false; _count=0; _expectedEvents = -1; _stats = stats; } @Override //run in a thread please; public void run() { _stop = false; _expectedEvents = -1; _count = 0; try { Checkpoint cp = new Checkpoint(); //is there anything from the checkpoint I can infer that it's end of stream? control message? cp.setFlexible(); do { int streamedEvents=0; StreamEventsArgs args = new StreamEventsArgs(_batchsize).setStatsCollector(_stats); while ((streamedEvents = _buffer.streamEvents(cp, _channel, args).getNumEventsStreamed()) > 0) { _count += streamedEvents; } //the writer hangs around - cannot count events; cp provides current window and window offset; //and streamedEvents has the count of all events - not just data events } while (!_stop && !endOfEvents()); } catch (ScnNotFoundException e) { LOG.error("SCN not found! " + e); } catch (OffsetNotFoundException e) { LOG.error("Offset not found! " + e); } finally { _stop = false; } } public void stop() { _stop = true; } public long eventsWritten() { return _count; } public long expectedEvents() { return _expectedEvents; } public void setExpectedEvents(long e) { _expectedEvents = e; } private boolean endOfEvents() { return (_expectedEvents > 0) && (eventsWritten() >= expectedEvents()); } private final WritableByteChannel _channel; private final DbusEventBuffer _buffer; private final int _batchsize; private boolean _stop; private long _count; private long _expectedEvents; private final DbusEventsStatisticsCollector _stats; }