@Test public void shouldAbortEmptyTransaction() { buildMockProducer(true); producer.initTransactions(); producer.beginTransaction(); producer.abortTransaction(); assertFalse(producer.transactionInFlight()); assertTrue(producer.transactionAborted()); assertFalse(producer.transactionCommitted()); }
@Test public void shouldCommitEmptyTransaction() { buildMockProducer(true); producer.initTransactions(); producer.beginTransaction(); producer.commitTransaction(); assertFalse(producer.transactionInFlight()); assertTrue(producer.transactionCommitted()); assertFalse(producer.transactionAborted()); }
@Test public void testNoAbortAfterCommitFailure() { MockProducer<String, String> producer = spy(new MockProducer<>()); producer.initTransactions(); @SuppressWarnings("unchecked") ProducerFactory<String, String> pf = mock(ProducerFactory.class); given(pf.transactionCapable()).willReturn(true); given(pf.createProducer()).willReturn(producer); KafkaTemplate<String, String> template = new KafkaTemplate<>(pf); template.setDefaultTopic(STRING_KEY_TOPIC); assertThatThrownBy(() -> template.executeInTransaction(t -> { producer.fenceProducer(); return null; })).isInstanceOf(ProducerFencedException.class); assertThat(producer.transactionCommitted()).isFalse(); assertThat(producer.transactionAborted()).isFalse(); assertThat(producer.closed()).isTrue(); verify(producer, never()).abortTransaction(); }
@Test public void testTransactionSynchronization() { MockProducer<String, String> producer = new MockProducer<>(); producer.initTransactions(); @SuppressWarnings("unchecked") ProducerFactory<String, String> pf = mock(ProducerFactory.class); given(pf.transactionCapable()).willReturn(true); given(pf.createProducer()).willReturn(producer); KafkaTemplate<String, String> template = new KafkaTemplate<>(pf); template.setDefaultTopic(STRING_KEY_TOPIC); ResourcelessTransactionManager tm = new ResourcelessTransactionManager(); new TransactionTemplate(tm).execute(s -> { template.sendDefault("foo", "bar"); return null; }); assertThat(producer.history()).containsExactly(new ProducerRecord<>(STRING_KEY_TOPIC, "foo", "bar")); assertThat(producer.transactionCommitted()).isTrue(); assertThat(producer.closed()).isTrue(); }
@Test public void testFencedOnBegin() { MockProducer<String, String> producer = spy(new MockProducer<>()); producer.initTransactions(); producer.fenceProducer(); @SuppressWarnings("unchecked") ProducerFactory<String, String> pf = mock(ProducerFactory.class); given(pf.transactionCapable()).willReturn(true); given(pf.createProducer()).willReturn(producer); KafkaTemplate<String, String> template = new KafkaTemplate<>(pf); template.setDefaultTopic(STRING_KEY_TOPIC); assertThatThrownBy(() -> template.executeInTransaction(t -> { return null; })).isInstanceOf(ProducerFencedException.class); assertThat(producer.transactionCommitted()).isFalse(); assertThat(producer.transactionAborted()).isFalse(); assertThat(producer.closed()).isTrue(); verify(producer, never()).commitTransaction(); }
@Test public void testAbort() { MockProducer<String, String> producer = spy(new MockProducer<>()); producer.initTransactions(); @SuppressWarnings("unchecked") ProducerFactory<String, String> pf = mock(ProducerFactory.class); given(pf.transactionCapable()).willReturn(true); given(pf.createProducer()).willReturn(producer); KafkaTemplate<String, String> template = new KafkaTemplate<>(pf); template.setDefaultTopic(STRING_KEY_TOPIC); assertThatThrownBy(() -> template.executeInTransaction(t -> { throw new RuntimeException("foo"); })).isExactlyInstanceOf(RuntimeException.class).withFailMessage("foo"); assertThat(producer.transactionCommitted()).isFalse(); assertThat(producer.transactionAborted()).isTrue(); assertThat(producer.closed()).isTrue(); verify(producer, never()).commitTransaction(); }
@Test public void testTransactionSynchronizationExceptionOnCommit() { MockProducer<String, String> producer = new MockProducer<>(); producer.initTransactions(); @SuppressWarnings("unchecked") ProducerFactory<String, String> pf = mock(ProducerFactory.class); given(pf.transactionCapable()).willReturn(true); given(pf.createProducer()).willReturn(producer); KafkaTemplate<String, String> template = new KafkaTemplate<>(pf); template.setDefaultTopic(STRING_KEY_TOPIC); ResourcelessTransactionManager tm = new ResourcelessTransactionManager(); new TransactionTemplate(tm).execute(s -> { template.sendDefault("foo", "bar"); // Mark the mock producer as fenced so it throws when committing the transaction producer.fenceProducer(); return null; }); assertThat(producer.transactionCommitted()).isFalse(); assertThat(producer.closed()).isTrue(); }