@Override public BulkEmitter createInstance(int batchSize, int deliveryInterval, ClientObjectFactory clientObjectFactory, FailoverPolicy failoverPolicy) { BulkEmitter bulkEmitter = new BulkEmitter(batchSize, deliveryInterval, clientObjectFactory.createBatchOperations()); bulkEmitter.addListener(clientObjectFactory.createBatchListener(failoverPolicy)); return bulkEmitter; }
@Override public void run() { notifyListener(); } };
public BulkEmitter(int atSize, int intervalInMillis, BatchOperations<BATCH_TYPE> batchOperations) { this.maxSize = atSize; this.interval = intervalInMillis; this.batchOperations = batchOperations; this.builder = new AtomicReference<>(batchOperations.createBatchBuilder()); this.scheduler.scheduleAtFixedRate(createNotificationTask(), 0, interval); }
@Test public void notiifyListenerSynchronizedBlock() { // given int batchSize = 2; BulkEmitter emitter = createTestBulkEmitter(batchSize, LARGE_TEST_INTERVAL, new TestBatchOperations()); Function<TestBatch, Boolean> dummyObserver = testBatch -> { throw new RuntimeException("JAVAC.SYNC should be filtered out"); }; emitter.addListener(dummyObserver); emitter.add(new Object()); expectedException.expect(RuntimeException.class); // when emitter.notifyListener(); }
@Test public void addToBatchBuilderSynchronizedBlock() { // given int batchSize = 2; TestBatchOperations throwingBatchOperations = spy(new TestBatchOperations()); BatchBuilder<TestBatch> throwingBatchBuilder = mock(BatchBuilder.class); doThrow(new RuntimeException("JAVAC.SYNC should be filtered out")).when(throwingBatchBuilder).add(Matchers.any(String.class)); when(throwingBatchOperations.createBatchBuilder()).thenReturn(throwingBatchBuilder); BulkEmitter emitter = createTestBulkEmitter(batchSize, LARGE_TEST_INTERVAL, throwingBatchOperations); Function<TestBatch, Boolean> dummyObserver = dummyObserver(); emitter.addListener(dummyObserver); expectedException.expect(RuntimeException.class); // when emitter.add(new Object()); }
public static BulkEmitter createTestBulkEmitter(int batchSize, int interval, BatchOperations batchOperations) { return spy(new BulkEmitter(batchSize, interval, batchOperations)); }
@Test public void emitsBatchWithGivenSize() { // given int batchSize = 3; BulkEmitter emitter = createTestBulkEmitter(batchSize, LARGE_TEST_INTERVAL, new TestBatchOperations()); Function<TestBatch, Boolean> dummyObserver = dummyObserver(); emitter.addListener(dummyObserver); // when for (int ii = 0; ii < batchSize; ii++) { emitter.add(new TestBatchItem(TEST_DATA)); } // then ArgumentCaptor<TestBatch> captor = ArgumentCaptor.forClass(TestBatch.class); Mockito.verify(dummyObserver, Mockito.times(1)).apply(captor.capture()); Assert.assertEquals(batchSize, captor.getValue().items.size()); }
@Override public BatchEmitter createInstance(int batchSize, int deliveryInterval, ClientObjectFactory clientObjectFactory, FailoverPolicy failoverPolicy) { if (spiedEmitter == null) { BulkEmitter emitter = new BulkEmitter(batchSize, deliveryInterval, clientObjectFactory.createBatchOperations()); emitter.addListener(clientObjectFactory.createBatchListener(failoverPolicy)); spiedEmitter = Mockito.spy(emitter); } return spiedEmitter; } }
@Test public void emitsOnEveryCompletedBatch() { // given BulkEmitter emitter = createTestBulkEmitter(TEST_BATCH_SIZE, LARGE_TEST_INTERVAL, new TestBatchOperations()); Function<TestBatch, Boolean> dummyObserver = dummyObserver(); emitter.addListener(dummyObserver); int expectedNumberOfBatches = 4; // when for (int ii = 0; ii < TEST_BATCH_SIZE * expectedNumberOfBatches ; ii++) { emitter.add(new TestBatchItem(TEST_DATA)); } // then ArgumentCaptor<TestBatch> captor = ArgumentCaptor.forClass(TestBatch.class); Mockito.verify(dummyObserver, Mockito.times(expectedNumberOfBatches)).apply(captor.capture()); for (TestBatch batch : captor.getAllValues()) { Assert.assertEquals(TEST_BATCH_SIZE, batch.items.size()); } }
@Override public void run() { notifyListener(); } };
public BulkEmitter(int atSize, int intervalInMillis, BatchOperations<BATCH_TYPE> batchOperations) { this.maxSize = atSize; this.interval = intervalInMillis; this.batchOperations = batchOperations; this.builder = new AtomicReference<>(batchOperations.createBatchBuilder()); this.scheduler.scheduleAtFixedRate(createNotificationTask(), 0, interval); }
@Override public void add(Object batchItem) { builder.get().add(batchItem); if (size.incrementAndGet() >= maxSize) { notifyListener(); } }
@Override public void add(Object batchItem) { builder.get().add(batchItem); if (size.incrementAndGet() >= maxSize) { notifyListener(); } }