Skip to content
This repository was archived by the owner on Aug 13, 2020. It is now read-only.

Commit 4c97e3b

Browse files
authored
Merge pull request #745 from CJSCommonPlatform/renamed-stored-event-table
Rename stored event table and ensure all stored events are sent
2 parents d5438c5 + 8b7cb3c commit 4c97e3b

File tree

15 files changed

+313
-227
lines changed

15 files changed

+313
-227
lines changed

framework-system/framework-management/src/main/java/uk/gov/justice/services/management/shuttering/process/CommandApiShutteringBean.java

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22

33
import static javax.transaction.Transactional.TxType.REQUIRED;
44

5+
import uk.gov.justice.services.common.polling.MultiIteratingPoller;
6+
import uk.gov.justice.services.common.polling.MultiIteratingPollerFactory;
57
import uk.gov.justice.services.messaging.jms.EnvelopeSenderSelector;
6-
import uk.gov.justice.services.shuttering.domain.ShutteredCommand;
7-
import uk.gov.justice.services.shuttering.persistence.ShutteringRepository;
8+
import uk.gov.justice.services.shuttering.domain.StoredCommand;
9+
import uk.gov.justice.services.shuttering.persistence.StoredCommandRepository;
810

911
import java.util.stream.Stream;
1012

@@ -15,14 +17,23 @@
1517
@Stateless
1618
public class CommandApiShutteringBean {
1719

20+
private static final int POLLER_RETRY_COUNT = 2;
21+
private static final long POLLER_DELAY_INTERVAL_MILLIS = 100;
22+
23+
private static final int NUMBER_OF_POLLING_ITERATIONS = 2;
24+
private static final long WAIT_TIME_BETWEEN_ITERATIONS_MILLIS = 100;
25+
1826
@Inject
1927
private EnvelopeSenderSelector envelopeSenderSelector;
2028

2129
@Inject
22-
private ShutteringRepository shutteringRepository;
30+
private StoredCommandRepository storedCommandRepository;
2331

2432
@Inject
25-
private ShutteredCommandSender shutteredCommandSender;
33+
private StoredCommandSender storedCommandSender;
34+
35+
@Inject
36+
private MultiIteratingPollerFactory multiIteratingPollerFactory;
2637

2738
public void shutter() {
2839
envelopeSenderSelector.setShuttered(true);
@@ -31,10 +42,24 @@ public void shutter() {
3142
@Transactional(REQUIRED)
3243
public void unshutter() {
3344

34-
try (final Stream<ShutteredCommand> shutteredCommandStream = shutteringRepository.streamShutteredCommands()) {
35-
shutteredCommandStream.forEach(shutteredCommandSender::sendAndDelete);
36-
}
45+
getCommandsAndSend();
3746

3847
envelopeSenderSelector.setShuttered(false);
48+
49+
final MultiIteratingPoller multiIteratingPoller = multiIteratingPollerFactory.create(
50+
POLLER_RETRY_COUNT,
51+
POLLER_DELAY_INTERVAL_MILLIS,
52+
NUMBER_OF_POLLING_ITERATIONS,
53+
WAIT_TIME_BETWEEN_ITERATIONS_MILLIS);
54+
55+
multiIteratingPoller.pollUntilTrue(this::getCommandsAndSend);
56+
}
57+
58+
private boolean getCommandsAndSend() {
59+
try (final Stream<StoredCommand> storedCommandStream = storedCommandRepository.streamStoredCommands()) {
60+
storedCommandStream.forEach(storedCommandSender::sendAndDelete);
61+
}
62+
63+
return true;
3964
}
4065
}
Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,16 @@
55
import uk.gov.justice.services.messaging.JsonEnvelope;
66
import uk.gov.justice.services.messaging.JsonObjectEnvelopeConverter;
77
import uk.gov.justice.services.messaging.jms.JmsSender;
8-
import uk.gov.justice.services.shuttering.domain.ShutteredCommand;
9-
import uk.gov.justice.services.shuttering.persistence.ShutteringRepository;
8+
import uk.gov.justice.services.shuttering.domain.StoredCommand;
9+
import uk.gov.justice.services.shuttering.persistence.StoredCommandRepository;
1010

1111
import javax.inject.Inject;
1212
import javax.transaction.Transactional;
1313

14-
public class ShutteredCommandSender {
14+
public class StoredCommandSender {
1515

1616
@Inject
17-
private ShutteringRepository shutteringRepository;
17+
private StoredCommandRepository storedCommandRepository;
1818

1919
@Inject
2020
private JsonObjectEnvelopeConverter jsonObjectEnvelopeConverter;
@@ -23,14 +23,14 @@ public class ShutteredCommandSender {
2323
private JmsSender jmsSender;
2424

2525
@Transactional(REQUIRES_NEW)
26-
public void sendAndDelete(final ShutteredCommand shutteredCommand) {
26+
public void sendAndDelete(final StoredCommand storedCommand) {
2727

28-
final String commandJsonEnvelope = shutteredCommand.getCommandJsonEnvelope();
28+
final String commandJsonEnvelope = storedCommand.getCommandJsonEnvelope();
2929
final JsonEnvelope jsonEnvelope = jsonObjectEnvelopeConverter.asEnvelope(commandJsonEnvelope);
30-
final String destination = shutteredCommand.getDestination();
30+
final String destination = storedCommand.getDestination();
3131

3232
jmsSender.send(jsonEnvelope, destination);
3333

34-
shutteringRepository.delete(shutteredCommand.getEnvelopeId());
34+
storedCommandRepository.delete(storedCommand.getEnvelopeId());
3535
}
3636
}
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,24 @@
11
package uk.gov.justice.services.management.shuttering.process;
22

33
import static java.util.stream.Stream.of;
4-
import static org.junit.Assert.assertThat;
5-
import static org.junit.Assert.fail;
64
import static org.mockito.Mockito.inOrder;
75
import static org.mockito.Mockito.mock;
86
import static org.mockito.Mockito.verify;
9-
import static org.mockito.Mockito.verifyZeroInteractions;
107
import static org.mockito.Mockito.when;
118

9+
import uk.gov.justice.services.common.polling.MultiIteratingPollerFactory;
1210
import uk.gov.justice.services.messaging.jms.EnvelopeSenderSelector;
13-
import uk.gov.justice.services.shuttering.domain.ShutteredCommand;
14-
import uk.gov.justice.services.shuttering.persistence.ShutteringPersistenceException;
15-
import uk.gov.justice.services.shuttering.persistence.ShutteringRepository;
11+
import uk.gov.justice.services.shuttering.domain.StoredCommand;
12+
import uk.gov.justice.services.shuttering.persistence.StoredCommandRepository;
13+
import uk.gov.justice.services.test.utils.common.polling.DummyMultiIteratingPoller;
14+
15+
import java.util.stream.Stream;
1616

17-
import org.hamcrest.CoreMatchers;
1817
import org.junit.Test;
1918
import org.junit.runner.RunWith;
2019
import org.mockito.InOrder;
2120
import org.mockito.InjectMocks;
2221
import org.mockito.Mock;
23-
import org.mockito.Mockito;
2422
import org.mockito.runners.MockitoJUnitRunner;
2523

2624
@RunWith(MockitoJUnitRunner.class)
@@ -30,10 +28,13 @@ public class CommandApiShutteringBeanTest {
3028
private EnvelopeSenderSelector envelopeSenderSelector;
3129

3230
@Mock
33-
private ShutteringRepository shutteringRepository;
31+
private StoredCommandRepository storedCommandRepository;
32+
33+
@Mock
34+
private StoredCommandSender storedCommandSender;
3435

3536
@Mock
36-
private ShutteredCommandSender shutteredCommandSender;
37+
private MultiIteratingPollerFactory multiIteratingPollerFactory;
3738

3839
@InjectMocks
3940
private CommandApiShutteringBean commandApiShutteringBean;
@@ -46,43 +47,31 @@ public void shouldSetShutteredToTrue() throws Exception {
4647
verify(envelopeSenderSelector).setShuttered(true);
4748
}
4849

50+
@SuppressWarnings("unchecked")
4951
@Test
5052
public void shouldDrainTheShutteringCommandQueueAndSetShutteredToFalse() throws Exception {
5153

52-
final ShutteredCommand shutteredCommand_1 = mock(ShutteredCommand.class);
53-
final ShutteredCommand shutteredCommand_2 = mock(ShutteredCommand.class);
54+
final StoredCommand storedCommand_1 = mock(StoredCommand.class);
55+
final StoredCommand storedCommand_2 = mock(StoredCommand.class);
56+
final StoredCommand storedCommand_3 = mock(StoredCommand.class);
57+
final StoredCommand storedCommand_4 = mock(StoredCommand.class);
5458

55-
when(shutteringRepository.streamShutteredCommands()).thenReturn(of(shutteredCommand_1, shutteredCommand_2));
59+
final Stream<StoredCommand> shutteredCommands_1 = of(storedCommand_1, storedCommand_2);
60+
final Stream<StoredCommand> shutteredCommands_2 = of(storedCommand_3, storedCommand_4);
61+
62+
when(storedCommandRepository.streamStoredCommands()).thenReturn(shutteredCommands_1, shutteredCommands_2);
63+
when(multiIteratingPollerFactory.create(2, 100L, 2, 100L)).thenReturn(new DummyMultiIteratingPoller());
5664

5765
commandApiShutteringBean.unshutter();
5866

59-
final InOrder inOrder = inOrder(shutteredCommandSender, envelopeSenderSelector);
67+
final InOrder inOrder = inOrder(storedCommandSender, envelopeSenderSelector);
6068

61-
inOrder.verify(shutteredCommandSender).sendAndDelete(shutteredCommand_1);
62-
inOrder.verify(shutteredCommandSender).sendAndDelete(shutteredCommand_2);
69+
inOrder.verify(storedCommandSender).sendAndDelete(storedCommand_1);
70+
inOrder.verify(storedCommandSender).sendAndDelete(storedCommand_2);
6371
inOrder.verify(envelopeSenderSelector).setShuttered(false);
72+
inOrder.verify(storedCommandSender).sendAndDelete(storedCommand_3);
73+
inOrder.verify(storedCommandSender).sendAndDelete(storedCommand_4);
6474
}
6575

66-
@Test
67-
public void shouldNotUnshutterIfDrainingTheCommandQueueFails() throws Exception {
68-
69-
final ShutteringPersistenceException shutteringPersistenceException = new ShutteringPersistenceException("Ooops");
7076

71-
final ShutteredCommand shutteredCommand_1 = mock(ShutteredCommand.class);
72-
final ShutteredCommand shutteredCommand_2 = mock(ShutteredCommand.class);
73-
74-
when(shutteringRepository.streamShutteredCommands()).thenReturn(of(shutteredCommand_1, shutteredCommand_2));
75-
Mockito.doThrow(shutteringPersistenceException).when(shutteredCommandSender).sendAndDelete(shutteredCommand_2);
76-
77-
try {
78-
commandApiShutteringBean.unshutter();
79-
fail();
80-
} catch (final ShutteringPersistenceException expected) {
81-
assertThat(expected, CoreMatchers.is(shutteringPersistenceException));
82-
}
83-
84-
verify(shutteredCommandSender).sendAndDelete(shutteredCommand_1);
85-
86-
verifyZeroInteractions(envelopeSenderSelector);
87-
}
8877
}
Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
import uk.gov.justice.services.messaging.JsonEnvelope;
1010
import uk.gov.justice.services.messaging.JsonObjectEnvelopeConverter;
1111
import uk.gov.justice.services.messaging.jms.JmsSender;
12-
import uk.gov.justice.services.shuttering.domain.ShutteredCommand;
13-
import uk.gov.justice.services.shuttering.persistence.ShutteringRepository;
12+
import uk.gov.justice.services.shuttering.domain.StoredCommand;
13+
import uk.gov.justice.services.shuttering.persistence.StoredCommandRepository;
1414

1515
import java.time.ZonedDateTime;
1616
import java.util.UUID;
@@ -23,10 +23,10 @@
2323
import org.mockito.runners.MockitoJUnitRunner;
2424

2525
@RunWith(MockitoJUnitRunner.class)
26-
public class ShutteredCommandSenderTest {
26+
public class StoredCommandSenderTest {
2727

2828
@Mock
29-
private ShutteringRepository shutteringRepository;
29+
private StoredCommandRepository storedCommandRepository;
3030

3131
@Mock
3232
private JsonObjectEnvelopeConverter jsonObjectEnvelopeConverter;
@@ -35,7 +35,7 @@ public class ShutteredCommandSenderTest {
3535
private JmsSender jmsSender;
3636

3737
@InjectMocks
38-
private ShutteredCommandSender shutteredCommandSender;
38+
private StoredCommandSender storedCommandSender;
3939

4040
@Test
4141
public void shouldSendAndDeleteShutteredCommand() throws Exception {
@@ -48,19 +48,19 @@ public void shouldSendAndDeleteShutteredCommand() throws Exception {
4848

4949
final ZonedDateTime now = new UtcClock().now();
5050

51-
final ShutteredCommand shutteredCommand = new ShutteredCommand(
51+
final StoredCommand storedCommand = new StoredCommand(
5252
envelopeId,
5353
commandJsonEnvelope,
5454
destination,
5555
now);
5656

5757
when(jsonObjectEnvelopeConverter.asEnvelope(commandJsonEnvelope)).thenReturn(jsonEnvelope);
5858

59-
shutteredCommandSender.sendAndDelete(shutteredCommand);
59+
storedCommandSender.sendAndDelete(storedCommand);
6060

61-
final InOrder inOrder = inOrder(jmsSender, shutteringRepository);
61+
final InOrder inOrder = inOrder(jmsSender, storedCommandRepository);
6262

6363
inOrder.verify(jmsSender).send(jsonEnvelope, destination);
64-
inOrder.verify(shutteringRepository).delete(envelopeId);
64+
inOrder.verify(storedCommandRepository).delete(envelopeId);
6565
}
6666
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<databaseChangeLog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
4+
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
5+
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.3.xsd">
6+
7+
<changeSet id="framework-system-002" author="TechPod"
8+
logicalFilePath="002-rename-table-to-stored-command.xml">
9+
10+
<renameTable
11+
oldTableName="shuttered_command_store"
12+
newTableName="stored_command" />
13+
14+
<rollback>
15+
<renameTable
16+
oldTableName="stored_command"
17+
newTableName="shuttered_command_store"/>
18+
</rollback>
19+
20+
</changeSet>
21+
</databaseChangeLog>
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@
44
import java.util.Objects;
55
import java.util.UUID;
66

7-
public class ShutteredCommand {
7+
public class StoredCommand {
88

99
private final UUID envelopeId;
1010
private final String commandJsonEnvelope;
1111
private final String destination;
1212
private final ZonedDateTime dateReceived;
1313

14-
public ShutteredCommand(
14+
public StoredCommand(
1515
final UUID envelopeId,
1616
final String commandJsonEnvelope,
1717
final String destination,
@@ -41,8 +41,8 @@ public ZonedDateTime getDateReceived() {
4141
@Override
4242
public boolean equals(final Object o) {
4343
if (this == o) return true;
44-
if (!(o instanceof ShutteredCommand)) return false;
45-
final ShutteredCommand that = (ShutteredCommand) o;
44+
if (!(o instanceof StoredCommand)) return false;
45+
final StoredCommand that = (StoredCommand) o;
4646
return Objects.equals(envelopeId, that.envelopeId) &&
4747
Objects.equals(commandJsonEnvelope, that.commandJsonEnvelope) &&
4848
Objects.equals(destination, that.destination) &&

framework-system/shuttering-persistence/src/main/java/uk/gov/justice/services/shuttering/persistence/ShutteringPersistenceException.java

Lines changed: 0 additions & 12 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package uk.gov.justice.services.shuttering.persistence;
2+
3+
public class StoredCommandPersistenceException extends RuntimeException {
4+
5+
public StoredCommandPersistenceException(final String message) {
6+
super(message);
7+
}
8+
9+
public StoredCommandPersistenceException(final String message, final Throwable cause) {
10+
super(message, cause);
11+
}
12+
}

0 commit comments

Comments
 (0)