diff --git a/example-context/example-service/example-it/pom.xml b/example-context/example-service/example-it/pom.xml
index d9869354..58a8a0ab 100644
--- a/example-context/example-service/example-it/pom.xml
+++ b/example-context/example-service/example-it/pom.xml
@@ -200,6 +200,11 @@
${project.version}
test
+
+ uk.gov.justice.event-store
+ test-utils-event
+ ${event-store.version}
+
diff --git a/example-context/example-service/example-it/src/test/java/uk/gov/justice/services/example/cakeshop/it/RebuildIT.java b/example-context/example-service/example-it/src/test/java/uk/gov/justice/services/example/cakeshop/it/RebuildIT.java
new file mode 100644
index 00000000..a9ac776d
--- /dev/null
+++ b/example-context/example-service/example-it/src/test/java/uk/gov/justice/services/example/cakeshop/it/RebuildIT.java
@@ -0,0 +1,164 @@
+package uk.gov.justice.services.example.cakeshop.it;
+
+import static java.util.Optional.empty;
+import static java.util.Optional.of;
+import static java.util.UUID.randomUUID;
+import static java.util.stream.Collectors.toList;
+import static org.hamcrest.CoreMatchers.hasItem;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.fail;
+
+import uk.gov.justice.services.eventsourcing.repository.jdbc.event.Event;
+import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEvent;
+import uk.gov.justice.services.example.cakeshop.it.helpers.CommandSender;
+import uk.gov.justice.services.example.cakeshop.it.helpers.DatabaseManager;
+import uk.gov.justice.services.example.cakeshop.it.helpers.EventFactory;
+import uk.gov.justice.services.example.cakeshop.it.helpers.MBeanHelper;
+import uk.gov.justice.services.example.cakeshop.it.helpers.RestEasyClientFactory;
+import uk.gov.justice.services.jmx.Rebuild;
+import uk.gov.justice.services.jmx.RebuildMBean;
+import uk.gov.justice.services.test.utils.core.messaging.Poller;
+import uk.gov.justice.services.test.utils.events.TestEventInserter;
+import uk.gov.justice.services.test.utils.persistence.DatabaseCleaner;
+import uk.gov.justice.services.test.utils.persistence.SequenceSetter;
+
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import java.util.UUID;
+
+import javax.management.MBeanServerConnection;
+import javax.management.ObjectName;
+import javax.management.remote.JMXConnector;
+import javax.sql.DataSource;
+import javax.ws.rs.client.Client;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class RebuildIT {
+
+ private final DataSource eventStoreDataSource = new DatabaseManager().initEventStoreDb();
+ private final EventFactory eventFactory = new EventFactory();
+ private final DatabaseCleaner databaseCleaner = new DatabaseCleaner();
+ private final TestEventInserter testEventInserter = new TestEventInserter(eventStoreDataSource);
+
+ private CommandSender commandSender;
+ private final SequenceSetter sequenceSetter = new SequenceSetter();
+ private final MBeanHelper mBeanHelper = new MBeanHelper();
+
+ private final Poller poller = new Poller();
+
+
+ @Before
+ public void before() throws Exception {
+ final Client client = new RestEasyClientFactory().createResteasyClient();
+ commandSender = new CommandSender(client, eventFactory);
+
+ databaseCleaner.cleanEventStoreTables("framework");
+ databaseCleaner.cleanViewStoreTables("framework", "cake", "cake_order", "recipe", "ingredient");
+ }
+
+ @Test
+ public void shouldRenumberTheEventLogTableAndRebuldPublishedEvents() throws Exception {
+
+ final long startNumber = 1000L;
+ sequenceSetter.setSequenceTo(startNumber, "event_sequence_seq", eventStoreDataSource);
+
+ commandSender.addRecipe(randomUUID().toString(), "cake 1");
+ commandSender.addRecipe(randomUUID().toString(), "cake 2");
+ commandSender.addRecipe(randomUUID().toString(), "cake 3");
+
+ final List publishedEvents = getPublishedEvents();
+
+ assertThat(publishedEvents.size(), is(3));
+ assertThat(publishedEvents.get(0).getEventNumber(), is(of(startNumber)));
+
+ assertThat(eventNumbersLinkedCorrectly(publishedEvents), is(true));
+
+ final List eventIds = publishedEvents.stream()
+ .map(Event::getId)
+ .collect(toList());
+
+ invokeRebuild();
+
+ final List rebuiltEvents = getPublishedEvents();
+ assertThat(rebuiltEvents.size(), is(3));
+
+ final List rebuiltEventIds = rebuiltEvents.stream()
+ .map(Event::getId)
+ .collect(toList());
+
+ assertThat(rebuiltEvents.get(0).getEventNumber(), is(of(1L)));
+
+ assertThat(rebuiltEventIds, hasItem(eventIds.get(0)));
+ assertThat(rebuiltEventIds, hasItem(eventIds.get(1)));
+ assertThat(rebuiltEventIds, hasItem(eventIds.get(2)));
+
+ assertThat(eventNumbersLinkedCorrectly(rebuiltEvents), is(true));
+ }
+
+ private void invokeRebuild() throws Exception {
+ try (final JMXConnector jmxConnector = mBeanHelper.getJMXConnector()) {
+
+ final MBeanServerConnection connection = jmxConnector.getMBeanServerConnection();
+ final ObjectName objectName = new ObjectName("rebuild", "type", Rebuild.class.getSimpleName());
+ final RebuildMBean rebuildMBean = mBeanHelper.getMbeanProxy(connection, objectName, RebuildMBean.class);
+
+ rebuildMBean.doRebuildRequested();
+ }
+ }
+
+ private List getPublishedEvents() {
+
+ final Optional> publishedEvents = poller.pollUntilFound(() -> {
+
+ final List events = doGetPublishedEvents();
+
+ if (events.size() == 3) {
+ return of(events);
+ }
+
+ return empty();
+ });
+
+ if (publishedEvents.isPresent()) {
+ return publishedEvents.get();
+ }
+
+ fail();
+
+ return new ArrayList<>();
+ }
+
+ private List doGetPublishedEvents() {
+ try {
+ return testEventInserter.findAllPublishedEventsOrderedByEventNumber();
+ } catch (SQLException e) {
+ throw new RuntimeException("Failed to get published events", e);
+ }
+ }
+
+ private boolean eventNumbersLinkedCorrectly(final List publishedEvents) {
+
+ long previousEventNumber = 0L;
+
+ for(final PublishedEvent publishedEvent: publishedEvents) {
+
+ if(publishedEvent.getPreviousEventNumber() != previousEventNumber) {
+ return false;
+ }
+
+ previousEventNumber = publishedEvent.getEventNumber().orElse(-1L);
+
+ if (previousEventNumber == -1L) {
+
+ return false;
+ }
+ }
+
+ return true;
+ }
+}
diff --git a/pom.xml b/pom.xml
index b1c94af3..0a448273 100644
--- a/pom.xml
+++ b/pom.xml
@@ -33,7 +33,7 @@
2.0.2
6.0.0-M26
1.2.0
- 2.0.0-M27
+ 2.0.0-M30
2.0.0-M20
1.17.7
4.0.0-M21