killbill-aplcache

entitlement: See #493 Refactor events to only send BlockingTransitionInternalEvent

2/17/2016 6:43:19 PM

Changes

api/src/main/java/org/killbill/billing/events/EffectiveEntitlementInternalEvent.java 20(+0 -20)

entitlement/src/main/java/org/killbill/billing/entitlement/api/DefaultEffectiveEntitlementEvent.java 166(+0 -166)

Details

diff --git a/api/src/main/java/org/killbill/billing/entitlement/EventsStream.java b/api/src/main/java/org/killbill/billing/entitlement/EventsStream.java
index b2e6d4b..188e714 100644
--- a/api/src/main/java/org/killbill/billing/entitlement/EventsStream.java
+++ b/api/src/main/java/org/killbill/billing/entitlement/EventsStream.java
@@ -42,6 +42,8 @@ public interface EventsStream {
 
     EntitlementState getEntitlementState();
 
+    LocalDate getEntitlementEffectiveStartDate();
+
     LocalDate getEntitlementEffectiveEndDate();
 
     SubscriptionBase getSubscriptionBase();
diff --git a/api/src/main/java/org/killbill/billing/events/BlockingTransitionInternalEvent.java b/api/src/main/java/org/killbill/billing/events/BlockingTransitionInternalEvent.java
index b31dbdd..010901d 100644
--- a/api/src/main/java/org/killbill/billing/events/BlockingTransitionInternalEvent.java
+++ b/api/src/main/java/org/killbill/billing/events/BlockingTransitionInternalEvent.java
@@ -18,6 +18,7 @@ package org.killbill.billing.events;
 
 import java.util.UUID;
 
+import org.joda.time.DateTime;
 import org.killbill.billing.entitlement.api.BlockingStateType;
 
 // Event for effective blocking state changes (not entitlement specific)
@@ -27,6 +28,12 @@ public interface BlockingTransitionInternalEvent extends BusInternalEvent {
 
     public BlockingStateType getBlockingType();
 
+    public String getStateName();
+
+    public String getService();
+
+    public DateTime getEffectiveDate();
+
     public Boolean isTransitionedToBlockedBilling();
 
     public Boolean isTransitionedToUnblockedBilling();
diff --git a/beatrix/src/main/java/org/killbill/billing/beatrix/extbus/BeatrixListener.java b/beatrix/src/main/java/org/killbill/billing/beatrix/extbus/BeatrixListener.java
index 7870b49..479eef0 100644
--- a/beatrix/src/main/java/org/killbill/billing/beatrix/extbus/BeatrixListener.java
+++ b/beatrix/src/main/java/org/killbill/billing/beatrix/extbus/BeatrixListener.java
@@ -26,8 +26,10 @@ import javax.inject.Named;
 
 import org.killbill.billing.ObjectType;
 import org.killbill.billing.callcontext.InternalCallContext;
+import org.killbill.billing.entitlement.EntitlementService;
 import org.killbill.billing.entitlement.EntitlementTransitionType;
 import org.killbill.billing.entitlement.api.BlockingStateType;
+import org.killbill.billing.entitlement.api.DefaultEntitlementApi;
 import org.killbill.billing.events.AccountChangeInternalEvent;
 import org.killbill.billing.events.AccountCreationInternalEvent;
 import org.killbill.billing.events.BlockingTransitionInternalEvent;
@@ -161,7 +163,20 @@ public class BeatrixListener {
                     objectType = ObjectType.SUBSCRIPTION;
                 }
                 objectId = realEventBS.getBlockableId();
-                // Probably we should serialize the isTransitionedTo* from BlockingTransitionInternalEvent into the metdata section
+
+                if (EntitlementService.ENTITLEMENT_SERVICE_NAME.equals(realEventBS.getService())) {
+                    if (DefaultEntitlementApi.ENT_STATE_START.equals(realEventBS.getStateName())) {
+                        eventBusType = ExtBusEventType.ENTITLEMENT_CREATION;
+                    } else if (DefaultEntitlementApi.ENT_STATE_BLOCKED.equals(realEventBS.getStateName())) {
+                        eventBusType = ExtBusEventType.BUNDLE_PAUSE;
+                    } else if (DefaultEntitlementApi.ENT_STATE_CLEAR.equals(realEventBS.getStateName())) {
+                        eventBusType = ExtBusEventType.BUNDLE_RESUME;
+                    } else if (DefaultEntitlementApi.ENT_STATE_CANCELLED.equals(realEventBS.getStateName())) {
+                        eventBusType = ExtBusEventType.ENTITLEMENT_CANCEL;
+                    }
+                } else {
+                    eventBusType = ExtBusEventType.BLOCKING_STATE;
+                }
                 break;
 
             case ENTITLEMENT_TRANSITION:
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegration.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegration.java
index ab9e470..d8fca92 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegration.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegration.java
@@ -581,7 +581,7 @@ public class TestIntegration extends TestIntegrationBase {
 
         // PAUSE THE ENTITLEMENT
         DefaultEntitlement entitlement = (DefaultEntitlement) entitlementApi.getEntitlementForId(baseEntitlement.getId(), callContext);
-        busHandler.pushExpectedEvents(NextEvent.PAUSE, NextEvent.BLOCK, NextEvent.NULL_INVOICE, NextEvent.INVOICE);
+        busHandler.pushExpectedEvents(NextEvent.BLOCK, NextEvent.INVOICE);
         entitlementApi.pause(entitlement.getBundleId(), clock.getUTCNow().toLocalDate(), ImmutableList.<PluginProperty>of(), callContext);
         assertListenerStatus();
 
@@ -598,7 +598,7 @@ public class TestIntegration extends TestIntegrationBase {
         // MOVE CLOCK FORWARD ADN CHECK THERE IS NO NEW INVOICE
         clock.addDeltaFromReality(AT_LEAST_ONE_MONTH_MS);
 
-        busHandler.pushExpectedEvents(NextEvent.RESUME, NextEvent.BLOCK, NextEvent.NULL_INVOICE, NextEvent.NULL_INVOICE, NextEvent.INVOICE);
+        busHandler.pushExpectedEvents(NextEvent.BLOCK, NextEvent.NULL_INVOICE, NextEvent.INVOICE);
         entitlementApi.resume(entitlement.getBundleId(), clock.getUTCNow().toLocalDate(), ImmutableList.<PluginProperty>of(), callContext);
         assertListenerStatus();
 
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationWithDifferentBillingPeriods.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationWithDifferentBillingPeriods.java
index 270f9a1..84e773e 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationWithDifferentBillingPeriods.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationWithDifferentBillingPeriods.java
@@ -199,7 +199,7 @@ public class TestIntegrationWithDifferentBillingPeriods extends TestIntegrationB
         // 2012-5-12
         clock.addDays(10);
 
-        busHandler.pushExpectedEvents(NextEvent.PAUSE, NextEvent.BLOCK, NextEvent.NULL_INVOICE, NextEvent.INVOICE);
+        busHandler.pushExpectedEvents(NextEvent.BLOCK, NextEvent.INVOICE);
         entitlementApi.pause(bpEntitlement.getBundleId(), clock.getUTCNow().toLocalDate(), ImmutableList.<PluginProperty>of(), callContext);
         assertListenerStatus();
 
@@ -218,7 +218,7 @@ public class TestIntegrationWithDifferentBillingPeriods extends TestIntegrationB
         // 2012-6-4
         clock.addDays(23);
 
-        busHandler.pushExpectedEvents(NextEvent.RESUME, NextEvent.BLOCK, NextEvent.NULL_INVOICE, NextEvent.INVOICE, NextEvent.PAYMENT, NextEvent.INVOICE_PAYMENT);
+        busHandler.pushExpectedEvents(NextEvent.BLOCK, NextEvent.INVOICE, NextEvent.PAYMENT, NextEvent.INVOICE_PAYMENT);
         entitlementApi.resume(bpEntitlement.getBundleId(), clock.getUTCNow().toLocalDate(), ImmutableList.<PluginProperty>of(), callContext);
         assertListenerStatus();
 
@@ -279,13 +279,13 @@ public class TestIntegrationWithDifferentBillingPeriods extends TestIntegrationB
         // 2012-5-12
         clock.addDays(10);
 
-        busHandler.pushExpectedEvents(NextEvent.PAUSE, NextEvent.BLOCK);
+        busHandler.pushExpectedEvents(NextEvent.BLOCK);
         entitlementApi.pause(bpEntitlement.getBundleId(), clock.getUTCNow().toLocalDate(), ImmutableList.<PluginProperty>of(), callContext);
         assertListenerStatus();
 
         // 2012-6-4
         clock.addDays(23);
-        busHandler.pushExpectedEvents(NextEvent.RESUME, NextEvent.BLOCK);
+        busHandler.pushExpectedEvents(NextEvent.BLOCK);
         entitlementApi.resume(bpEntitlement.getBundleId(), clock.getUTCNow().toLocalDate(), ImmutableList.<PluginProperty>of(), callContext);
         assertListenerStatus();
 
diff --git a/entitlement/src/main/java/org/killbill/billing/entitlement/api/DefaultBlockingTransitionInternalEvent.java b/entitlement/src/main/java/org/killbill/billing/entitlement/api/DefaultBlockingTransitionInternalEvent.java
index f32a19c..67b0ae2 100644
--- a/entitlement/src/main/java/org/killbill/billing/entitlement/api/DefaultBlockingTransitionInternalEvent.java
+++ b/entitlement/src/main/java/org/killbill/billing/entitlement/api/DefaultBlockingTransitionInternalEvent.java
@@ -18,6 +18,7 @@ package org.killbill.billing.entitlement.api;
 
 import java.util.UUID;
 
+import org.joda.time.DateTime;
 import org.killbill.billing.events.BlockingTransitionInternalEvent;
 import org.killbill.billing.events.BusEventBase;
 
@@ -28,6 +29,9 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 public class DefaultBlockingTransitionInternalEvent extends BusEventBase implements BlockingTransitionInternalEvent {
 
     private final UUID blockableId;
+    private final String stateName;
+    private final String service;
+    private final DateTime effectiveDate;
     private final BlockingStateType blockingType;
     private final Boolean isTransitionedToBlockedBilling;
     private final Boolean isTransitionedToUnblockedBilling;
@@ -36,6 +40,9 @@ public class DefaultBlockingTransitionInternalEvent extends BusEventBase impleme
 
     @JsonCreator
     public DefaultBlockingTransitionInternalEvent(@JsonProperty("blockableId") final UUID blockableId,
+                                                  @JsonProperty("stateName") final String stateName,
+                                                  @JsonProperty("service") final String service,
+                                                  @JsonProperty("effectiveDate") final DateTime effectiveDate,
                                                   @JsonProperty("blockingType") final BlockingStateType blockingType,
                                                   @JsonProperty("isTransitionedToBlockedBilling") final Boolean transitionedToBlockedBilling,
                                                   @JsonProperty("isTransitionedToUnblockedBilling") final Boolean transitionedToUnblockedBilling,
@@ -47,6 +54,9 @@ public class DefaultBlockingTransitionInternalEvent extends BusEventBase impleme
         super(searchKey1, searchKey2, userToken);
         this.blockableId = blockableId;
         this.blockingType = blockingType;
+        this.service = service;
+        this.stateName = stateName;
+        this.effectiveDate = effectiveDate;
         isTransitionedToBlockedBilling = transitionedToBlockedBilling;
         isTransitionedToUnblockedBilling = transitionedToUnblockedBilling;
         isTransitionedToBlockedEntitlement = transitionedToBlockedEntitlement;
@@ -63,6 +73,21 @@ public class DefaultBlockingTransitionInternalEvent extends BusEventBase impleme
         return blockingType;
     }
 
+    @Override
+    public String getStateName() {
+        return stateName;
+    }
+
+    @Override
+    public String getService() {
+        return service;
+    }
+
+    @Override
+    public DateTime getEffectiveDate() {
+        return effectiveDate;
+    }
+
     @JsonProperty("isTransitionedToBlockedBilling")
     @Override
     public Boolean isTransitionedToBlockedBilling() {
@@ -110,6 +135,15 @@ public class DefaultBlockingTransitionInternalEvent extends BusEventBase impleme
         if (blockingType != that.blockingType) {
             return false;
         }
+        if (stateName != null ? !stateName.equals(that.stateName) : that.stateName != null) {
+            return false;
+        }
+        if (service != null ? !service.equals(that.service) : that.service != null) {
+            return false;
+        }
+        if (effectiveDate != null ? effectiveDate.compareTo(that.effectiveDate) != 0 : that.effectiveDate != null) {
+            return false;
+        }
         if (isTransitionedToBlockedBilling != null ? !isTransitionedToBlockedBilling.equals(that.isTransitionedToBlockedBilling) : that.isTransitionedToBlockedBilling != null) {
             return false;
         }
@@ -130,6 +164,9 @@ public class DefaultBlockingTransitionInternalEvent extends BusEventBase impleme
     public int hashCode() {
         int result = blockableId != null ? blockableId.hashCode() : 0;
         result = 31 * result + (blockingType != null ? blockingType.hashCode() : 0);
+        result = 31 * result + (stateName != null ? stateName.hashCode() : 0);
+        result = 31 * result + (service != null ? service.hashCode() : 0);
+        result = 31 * result + (effectiveDate != null ? effectiveDate.hashCode() : 0);
         result = 31 * result + (isTransitionedToBlockedBilling != null ? isTransitionedToBlockedBilling.hashCode() : 0);
         result = 31 * result + (isTransitionedToUnblockedBilling != null ? isTransitionedToUnblockedBilling.hashCode() : 0);
         result = 31 * result + (isTransitionedToBlockedEntitlement != null ? isTransitionedToBlockedEntitlement.hashCode() : 0);
@@ -142,6 +179,9 @@ public class DefaultBlockingTransitionInternalEvent extends BusEventBase impleme
         final StringBuilder sb = new StringBuilder("DefaultBlockingTransitionInternalEvent{");
         sb.append("blockableId=").append(blockableId);
         sb.append(", blockingType=").append(blockingType);
+        sb.append(", stateName=").append(stateName);
+        sb.append(", service=").append(service);
+        sb.append(", effectiveDate=").append(effectiveDate);
         sb.append(", isTransitionedToBlockedBilling=").append(isTransitionedToBlockedBilling);
         sb.append(", isTransitionedToUnblockedBilling=").append(isTransitionedToUnblockedBilling);
         sb.append(", isTransitionedToBlockedEntitlement=").append(isTransitionedToBlockedEntitlement);
diff --git a/entitlement/src/main/java/org/killbill/billing/entitlement/api/DefaultEntitlement.java b/entitlement/src/main/java/org/killbill/billing/entitlement/api/DefaultEntitlement.java
index 6e35ce2..1cc7eb0 100644
--- a/entitlement/src/main/java/org/killbill/billing/entitlement/api/DefaultEntitlement.java
+++ b/entitlement/src/main/java/org/killbill/billing/entitlement/api/DefaultEntitlement.java
@@ -246,7 +246,7 @@ public class DefaultEntitlement extends EntityBase implements Entitlement {
 
     @Override
     public LocalDate getEffectiveStartDate() {
-        return internalTenantContext.toLocalDate(getSubscriptionBase().getStartDate());
+        return eventsStream.getEntitlementEffectiveStartDate();
     }
 
     @Override
diff --git a/entitlement/src/main/java/org/killbill/billing/entitlement/api/DefaultEntitlementApi.java b/entitlement/src/main/java/org/killbill/billing/entitlement/api/DefaultEntitlementApi.java
index f167068..24355e2 100644
--- a/entitlement/src/main/java/org/killbill/billing/entitlement/api/DefaultEntitlementApi.java
+++ b/entitlement/src/main/java/org/killbill/billing/entitlement/api/DefaultEntitlementApi.java
@@ -19,6 +19,7 @@
 package org.killbill.billing.entitlement.api;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -63,6 +64,7 @@ import org.killbill.billing.util.callcontext.InternalCallContextFactory;
 import org.killbill.billing.util.callcontext.TenantContext;
 import org.killbill.bus.api.PersistentBus;
 import org.killbill.clock.Clock;
+import org.killbill.notificationq.api.NotificationEvent;
 import org.killbill.notificationq.api.NotificationQueueService;
 
 import com.google.common.base.Function;
@@ -73,6 +75,7 @@ import com.google.common.collect.Lists;
 
 public class DefaultEntitlementApi extends DefaultEntitlementApiBase implements EntitlementApi {
 
+    public static final String ENT_STATE_START = "ENT_STARTED";
     public static final String ENT_STATE_BLOCKED = "ENT_BLOCKED";
     public static final String ENT_STATE_CLEAR = "ENT_CLEAR";
     public static final String ENT_STATE_CANCELLED = "ENT_CANCELLED";
@@ -142,11 +145,11 @@ public class DefaultEntitlementApi extends DefaultEntitlementApiBase implements 
 
                     final SubscriptionBaseBundle bundle = subscriptionBaseInternalApi.createBundleForAccount(accountId, externalKey, contextWithValidAccountRecordId);
 
-                    final DateTime referenceTime = clock.getUTCNow();
                     final DateTime requestedDate = dateHelper.fromLocalDateAndReferenceTime(updatedPluginContext.getEffectiveDate(), contextWithValidAccountRecordId);
                     final EntitlementSpecifier specifier = getFirstEntitlementSpecifier(updatedPluginContext.getEntitlementSpecifiers());
                     final SubscriptionBase subscription = subscriptionBaseInternalApi.createSubscription(bundle.getId(), specifier.getPlanPhaseSpecifier(), specifier.getOverrides(), requestedDate, contextWithValidAccountRecordId);
 
+
                     return new DefaultEntitlement(accountId, subscription.getId(), eventsStreamBuilder, entitlementApi, pluginExecution,
                                                   blockingStateDao, subscriptionBaseInternalApi, checker, notificationQueueService,
                                                   entitlementUtils, dateHelper, clock, securityApi, internalCallContextFactory, callContext);
diff --git a/entitlement/src/main/java/org/killbill/billing/entitlement/api/DefaultSubscriptionApi.java b/entitlement/src/main/java/org/killbill/billing/entitlement/api/DefaultSubscriptionApi.java
index 7ea6421..111c516 100644
--- a/entitlement/src/main/java/org/killbill/billing/entitlement/api/DefaultSubscriptionApi.java
+++ b/entitlement/src/main/java/org/killbill/billing/entitlement/api/DefaultSubscriptionApi.java
@@ -312,8 +312,6 @@ public class DefaultSubscriptionApi implements SubscriptionApi {
         }
 
         final InternalCallContext internalCallContextWithValidAccountId;
-
-        final InternalCallContext internalCallContext;
         final ImmutableAccountData account;
         final UUID accountId;
         final UUID bundleId;
diff --git a/entitlement/src/main/java/org/killbill/billing/entitlement/api/svcs/DefaultEntitlementApiBase.java b/entitlement/src/main/java/org/killbill/billing/entitlement/api/svcs/DefaultEntitlementApiBase.java
index 9a4acfd..4ddafaf 100644
--- a/entitlement/src/main/java/org/killbill/billing/entitlement/api/svcs/DefaultEntitlementApiBase.java
+++ b/entitlement/src/main/java/org/killbill/billing/entitlement/api/svcs/DefaultEntitlementApiBase.java
@@ -38,11 +38,9 @@ import org.killbill.billing.entitlement.AccountEntitlements;
 import org.killbill.billing.entitlement.AccountEventsStreams;
 import org.killbill.billing.entitlement.DefaultEntitlementService;
 import org.killbill.billing.entitlement.EntitlementService;
-import org.killbill.billing.entitlement.EntitlementTransitionType;
 import org.killbill.billing.entitlement.EventsStream;
 import org.killbill.billing.entitlement.api.BlockingState;
 import org.killbill.billing.entitlement.api.BlockingStateType;
-import org.killbill.billing.entitlement.api.DefaultEffectiveEntitlementEvent;
 import org.killbill.billing.entitlement.api.DefaultEntitlement;
 import org.killbill.billing.entitlement.api.DefaultEntitlementApi;
 import org.killbill.billing.entitlement.api.DefaultEntitlementContext;
@@ -69,7 +67,6 @@ import org.killbill.billing.subscription.api.user.SubscriptionBaseApiException;
 import org.killbill.billing.subscription.api.user.SubscriptionBaseBundle;
 import org.killbill.billing.util.callcontext.InternalCallContextFactory;
 import org.killbill.bus.api.PersistentBus;
-import org.killbill.bus.api.PersistentBus.EventBusException;
 import org.killbill.clock.Clock;
 import org.killbill.notificationq.api.NotificationEvent;
 import org.killbill.notificationq.api.NotificationQueue;
@@ -177,20 +174,7 @@ public class DefaultEntitlementApiBase {
                         return null;
                     }
 
-                    final UUID blockingId = blockUnblockBundle(bundleId, DefaultEntitlementApi.ENT_STATE_BLOCKED, EntitlementService.ENTITLEMENT_SERVICE_NAME, localEffectiveDate, true, true, true, baseSubscription, internalCallContext);
-
-                    // Should we send one event per entitlement in the bundle?
-                    // Code below only sends one event for the bundle and use the base entitlementId
-                    final DefaultEffectiveEntitlementEvent event = new DefaultEffectiveEntitlementEvent(blockingId, baseSubscription.getId(), bundleId, bundle.getAccountId(), EntitlementTransitionType.BLOCK_BUNDLE,
-                                                                                                        effectiveDate, clock.getUTCNow(),
-                                                                                                        internalCallContext.getAccountRecordId(), internalCallContext.getTenantRecordId(),
-                                                                                                        internalCallContext.getUserToken());
-
-                    try {
-                        eventBus.post(event);
-                    } catch (EventBusException e) {
-                        log.warn("Failed to post bus event for pause operation on bundle " + bundleId);
-                    }
+                    blockUnblockBundle(bundleId, DefaultEntitlementApi.ENT_STATE_BLOCKED, EntitlementService.ENTITLEMENT_SERVICE_NAME, localEffectiveDate, true, true, true, baseSubscription, internalCallContext);
 
                 } catch (SubscriptionBaseApiException e) {
                     throw new EntitlementApiException(e);
@@ -229,20 +213,7 @@ public class DefaultEntitlementApiBase {
                         return null;
                     }
 
-                    final UUID blockingId = blockUnblockBundle(bundleId, DefaultEntitlementApi.ENT_STATE_CLEAR, EntitlementService.ENTITLEMENT_SERVICE_NAME, localEffectiveDate, false, false, false, baseSubscription, internalCallContext);
-
-                    // Should we send one event per entitlement in the bundle?
-                    // Code below only sends one event for the bundle and use the base entitlementId
-                    final DefaultEffectiveEntitlementEvent event = new DefaultEffectiveEntitlementEvent(blockingId, baseSubscription.getId(), bundleId, bundle.getAccountId(), EntitlementTransitionType.UNBLOCK_BUNDLE,
-                                                                                                        effectiveDate, clock.getUTCNow(),
-                                                                                                        internalCallContext.getAccountRecordId(), internalCallContext.getTenantRecordId(),
-                                                                                                        internalCallContext.getUserToken());
-
-                    try {
-                        eventBus.post(event);
-                    } catch (EventBusException e) {
-                        log.warn("Failed to post bus event for resume operation on bundle " + bundleId);
-                    }
+                    blockUnblockBundle(bundleId, DefaultEntitlementApi.ENT_STATE_CLEAR, EntitlementService.ENTITLEMENT_SERVICE_NAME, localEffectiveDate, false, false, false, baseSubscription, internalCallContext);
 
                 } catch (SubscriptionBaseApiException e) {
                     throw new EntitlementApiException(e);
@@ -262,15 +233,10 @@ public class DefaultEntitlementApiBase {
 
     private UUID blockUnblockBundle(final UUID bundleId, final String stateName, final String serviceName, @Nullable final LocalDate localEffectiveDate, boolean blockBilling, boolean blockEntitlement, boolean blockChange, @Nullable final SubscriptionBase inputBaseSubscription, final InternalCallContext internalCallContext)
             throws EntitlementApiException {
-        try {
-            final SubscriptionBase baseSubscription = inputBaseSubscription == null ? subscriptionInternalApi.getBaseSubscription(bundleId, internalCallContext) : inputBaseSubscription;
-            final DateTime effectiveDate = dateHelper.fromLocalDateAndReferenceTime(localEffectiveDate, internalCallContext);
-            final BlockingState state = new DefaultBlockingState(bundleId, BlockingStateType.SUBSCRIPTION_BUNDLE, stateName, serviceName, blockChange, blockEntitlement, blockBilling, effectiveDate);
-            entitlementUtils.setBlockingStatesAndPostBlockingTransitionEvent(ImmutableList.<BlockingState>of(state), bundleId, internalCallContext);
-            return state.getId();
-        } catch (final SubscriptionBaseApiException e) {
-            throw new EntitlementApiException(e);
-        }
+        final DateTime effectiveDate = dateHelper.fromLocalDateAndReferenceTime(localEffectiveDate, internalCallContext);
+        final BlockingState state = new DefaultBlockingState(bundleId, BlockingStateType.SUBSCRIPTION_BUNDLE, stateName, serviceName, blockChange, blockEntitlement, blockBilling, effectiveDate);
+        entitlementUtils.setBlockingStatesAndPostBlockingTransitionEvent(ImmutableList.<BlockingState>of(state), bundleId, internalCallContext);
+        return state.getId();
     }
 
     protected void recordPauseResumeNotificationEntry(final UUID entitlementId, final UUID bundleId, final DateTime effectiveDate, final boolean isPause, final InternalCallContext contextWithValidAccountRecordId) throws EntitlementApiException {
diff --git a/entitlement/src/main/java/org/killbill/billing/entitlement/dao/DefaultBlockingStateDao.java b/entitlement/src/main/java/org/killbill/billing/entitlement/dao/DefaultBlockingStateDao.java
index cb1551e..056bd3a 100644
--- a/entitlement/src/main/java/org/killbill/billing/entitlement/dao/DefaultBlockingStateDao.java
+++ b/entitlement/src/main/java/org/killbill/billing/entitlement/dao/DefaultBlockingStateDao.java
@@ -227,9 +227,11 @@ public class DefaultBlockingStateDao extends EntityDaoBase<BlockingStateModelDao
                         }
                     }
 
+                    boolean inserted = false;
                     // Create the state, if needed
                     if (!blockingStatesToRemove.contains(newBlockingStateModelDao.getId())) {
                         sqlDao.create(newBlockingStateModelDao, context);
+                        inserted = true;
                     }
 
                     final BlockingAggregator currentState = getBlockedStatus(sqlDao, entitySqlDaoWrapperFactory.getHandle(), state.getBlockedId(), state.getType(), bundleId, upToDate, context);
@@ -239,7 +241,9 @@ public class DefaultBlockingStateDao extends EntityDaoBase<BlockingStateModelDao
                                                                      state.getEffectiveDate(),
                                                                      state.getBlockedId(),
                                                                      state.getType(),
+                                                                     state.getStateName(),
                                                                      state.getService(),
+                                                                     inserted,
                                                                      previousState,
                                                                      currentState,
                                                                      context);
@@ -278,7 +282,9 @@ public class DefaultBlockingStateDao extends EntityDaoBase<BlockingStateModelDao
                                                               final DateTime effectiveDate,
                                                               final UUID blockableId,
                                                               final BlockingStateType type,
+                                                              final String stateName,
                                                               final String serviceName,
+                                                              final boolean blockingStateInserted,
                                                               final BlockingAggregator previousState,
                                                               final BlockingAggregator currentState,
                                                               final InternalCallContext context) {
@@ -290,18 +296,31 @@ public class DefaultBlockingStateDao extends EntityDaoBase<BlockingStateModelDao
 
         if (effectiveDate.compareTo(clock.getUTCNow()) > 0) {
             // Add notification entry to send the bus event at the effective date
-            final NotificationEvent notificationEvent = new BlockingTransitionNotificationKey(blockingStateId, blockableId, type,
-                                                                                              isTransitionToBlockedBilling, isTransitionToUnblockedBilling,
-                                                                                              isTransitionToBlockedEntitlement, isTransitionToUnblockedEntitlement);
+            final NotificationEvent notificationEvent = new BlockingTransitionNotificationKey(blockingStateId,
+                                                                                              blockableId,
+                                                                                              stateName,
+                                                                                              serviceName,
+                                                                                              effectiveDate,
+                                                                                              type,
+                                                                                              isTransitionToBlockedBilling,
+                                                                                              isTransitionToUnblockedBilling,
+                                                                                              isTransitionToBlockedEntitlement,
+                                                                                              isTransitionToUnblockedEntitlement);
             recordFutureNotificationFromTransaction(entitySqlDaoWrapperFactory, effectiveDate, notificationEvent, context);
         } else {
-            // TODO Do we want to send a DefaultEffectiveEntitlementEvent for entitlement specific blocking states?
-            // Don't post if nothing has changed for entitlement-service
-            if (!serviceName.equals(EntitlementService.ENTITLEMENT_SERVICE_NAME) || !previousState.equals(currentState)) {
-                final BusEvent event = new DefaultBlockingTransitionInternalEvent(blockableId, type,
-                                                                                  isTransitionToBlockedBilling, isTransitionToUnblockedBilling,
-                                                                                  isTransitionToBlockedEntitlement, isTransitionToUnblockedEntitlement,
-                                                                                  context.getAccountRecordId(), context.getTenantRecordId(), context.getUserToken());
+            if (blockingStateInserted) {
+                final BusEvent event = new DefaultBlockingTransitionInternalEvent(blockableId,
+                                                                                  stateName,
+                                                                                  serviceName,
+                                                                                  effectiveDate,
+                                                                                  type,
+                                                                                  isTransitionToBlockedBilling,
+                                                                                  isTransitionToUnblockedBilling,
+                                                                                  isTransitionToBlockedEntitlement,
+                                                                                  isTransitionToUnblockedEntitlement,
+                                                                                  context.getAccountRecordId(),
+                                                                                  context.getTenantRecordId(),
+                                                                                  context.getUserToken());
                 notifyBusFromTransaction(entitySqlDaoWrapperFactory, event);
             } else {
                 log.debug("Skipping event for service {} and blockableId {} (previousState={}, currentState={})", serviceName, blockableId, previousState, currentState);
diff --git a/entitlement/src/main/java/org/killbill/billing/entitlement/DefaultEntitlementService.java b/entitlement/src/main/java/org/killbill/billing/entitlement/DefaultEntitlementService.java
index c3dc3eb..68465ae 100644
--- a/entitlement/src/main/java/org/killbill/billing/entitlement/DefaultEntitlementService.java
+++ b/entitlement/src/main/java/org/killbill/billing/entitlement/DefaultEntitlementService.java
@@ -182,10 +182,18 @@ public class DefaultEntitlementService implements EntitlementService {
             return;
         }
 
-        final BusEvent event = new DefaultBlockingTransitionInternalEvent(key.getBlockableId(), key.getBlockingType(),
-                                                                          key.isTransitionedToBlockedBilling(), key.isTransitionedToUnblockedBilling(),
-                                                                          key.isTransitionedToBlockedEntitlement(), key.isTransitionToUnblockedEntitlement(),
-                                                                          internalCallContext.getAccountRecordId(), internalCallContext.getTenantRecordId(), internalCallContext.getUserToken());
+        final BusEvent event = new DefaultBlockingTransitionInternalEvent(key.getBlockableId(),
+                                                                          key.getStateName(),
+                                                                          key.getService(),
+                                                                          key.getEffectiveDate(),
+                                                                          key.getBlockingType(),
+                                                                          key.isTransitionedToBlockedBilling(),
+                                                                          key.isTransitionedToUnblockedBilling(),
+                                                                          key.isTransitionedToBlockedEntitlement(),
+                                                                          key.isTransitionToUnblockedEntitlement(),
+                                                                          internalCallContext.getAccountRecordId(),
+                                                                          internalCallContext.getTenantRecordId(),
+                                                                          internalCallContext.getUserToken());
 
         try {
             eventBus.post(event);
diff --git a/entitlement/src/main/java/org/killbill/billing/entitlement/engine/core/BlockingTransitionNotificationKey.java b/entitlement/src/main/java/org/killbill/billing/entitlement/engine/core/BlockingTransitionNotificationKey.java
index fc4b02d..93035ad 100644
--- a/entitlement/src/main/java/org/killbill/billing/entitlement/engine/core/BlockingTransitionNotificationKey.java
+++ b/entitlement/src/main/java/org/killbill/billing/entitlement/engine/core/BlockingTransitionNotificationKey.java
@@ -18,6 +18,7 @@ package org.killbill.billing.entitlement.engine.core;
 
 import java.util.UUID;
 
+import org.joda.time.DateTime;
 import org.killbill.billing.entitlement.api.BlockingStateType;
 import org.killbill.notificationq.api.NotificationEvent;
 
@@ -29,6 +30,9 @@ public class BlockingTransitionNotificationKey implements NotificationEvent {
     private final UUID blockingStateId;
     private final UUID blockableId;
     private final BlockingStateType blockingType;
+    private final String stateName;
+    private final String service;
+    private final DateTime effectiveDate;
     private final Boolean isTransitionToBlockedBilling;
     private final Boolean isTransitionToUnblockedBilling;
     private final Boolean isTransitionToBlockedEntitlement;
@@ -37,6 +41,9 @@ public class BlockingTransitionNotificationKey implements NotificationEvent {
     @JsonCreator
     public BlockingTransitionNotificationKey(@JsonProperty("blockingStateId") final UUID blockingStateId,
                                              @JsonProperty("blockableId") final UUID blockableId,
+                                             @JsonProperty("stateName") final String stateName,
+                                             @JsonProperty("service") final String service,
+                                             @JsonProperty("effectiveDate") final DateTime effectiveDate,
                                              @JsonProperty("type") final BlockingStateType blockingType,
                                              @JsonProperty("isTransitionToBlockedBilling") final Boolean isTransitionToBlockedBilling,
                                              @JsonProperty("isTransitionToUnblockedBilling") final Boolean isTransitionToUnblockedBilling,
@@ -45,6 +52,9 @@ public class BlockingTransitionNotificationKey implements NotificationEvent {
 
         this.blockingStateId = blockingStateId;
         this.blockableId = blockableId;
+        this.service = service;
+        this.stateName = stateName;
+        this.effectiveDate = effectiveDate;
         this.blockingType = blockingType;
         this.isTransitionToBlockedBilling = isTransitionToBlockedBilling;
         this.isTransitionToUnblockedBilling = isTransitionToUnblockedBilling;
@@ -64,6 +74,18 @@ public class BlockingTransitionNotificationKey implements NotificationEvent {
         return blockingType;
     }
 
+    public String getStateName() {
+        return stateName;
+    }
+
+    public String getService() {
+        return service;
+    }
+
+    public DateTime getEffectiveDate() {
+        return effectiveDate;
+    }
+
     @JsonProperty("isTransitionToBlockedBilling")
     public Boolean isTransitionedToBlockedBilling() {
         return isTransitionToBlockedBilling;
@@ -115,6 +137,15 @@ public class BlockingTransitionNotificationKey implements NotificationEvent {
         if (blockableId != null ? !blockableId.equals(that.blockableId) : that.blockableId != null) {
             return false;
         }
+        if (stateName != null ? !stateName.equals(that.stateName) : that.stateName != null) {
+            return false;
+        }
+        if (service != null ? !service.equals(that.service) : that.service != null) {
+            return false;
+        }
+        if (effectiveDate != null ? effectiveDate.compareTo(that.effectiveDate) != 0 : that.effectiveDate != null) {
+            return false;
+        }
         if (blockingType != that.blockingType) {
             return false;
         }
@@ -138,6 +169,9 @@ public class BlockingTransitionNotificationKey implements NotificationEvent {
     public int hashCode() {
         int result = blockingStateId != null ? blockingStateId.hashCode() : 0;
         result = 31 * result + (blockableId != null ? blockableId.hashCode() : 0);
+        result = 31 * result + (stateName != null ? stateName.hashCode() : 0);
+        result = 31 * result + (service != null ? service.hashCode() : 0);
+        result = 31 * result + (effectiveDate != null ? effectiveDate.hashCode() : 0);
         result = 31 * result + (blockingType != null ? blockingType.hashCode() : 0);
         result = 31 * result + (isTransitionToBlockedBilling != null ? isTransitionToBlockedBilling.hashCode() : 0);
         result = 31 * result + (isTransitionToUnblockedBilling != null ? isTransitionToUnblockedBilling.hashCode() : 0);
diff --git a/entitlement/src/main/java/org/killbill/billing/entitlement/engine/core/DefaultEventsStream.java b/entitlement/src/main/java/org/killbill/billing/entitlement/engine/core/DefaultEventsStream.java
index 4ef537a..d7e4799 100644
--- a/entitlement/src/main/java/org/killbill/billing/entitlement/engine/core/DefaultEventsStream.java
+++ b/entitlement/src/main/java/org/killbill/billing/entitlement/engine/core/DefaultEventsStream.java
@@ -73,7 +73,9 @@ public class DefaultEventsStream implements EventsStream {
 
     private BlockingAggregator blockingAggregator;
     private List<BlockingState> subscriptionEntitlementStates;
+    private LocalDate entitlementEffectiveStartDate;
     private LocalDate entitlementEffectiveEndDate;
+    private BlockingState entitlementStartEvent;
     private BlockingState entitlementCancelEvent;
     private EntitlementState entitlementState;
 
@@ -145,6 +147,11 @@ public class DefaultEventsStream implements EventsStream {
     }
 
     @Override
+    public LocalDate getEntitlementEffectiveStartDate() {
+        return entitlementEffectiveStartDate;
+    }
+
+    @Override
     public boolean isBlockChange() {
         return blockingAggregator.isBlockChange();
     }
@@ -355,6 +362,7 @@ public class DefaultEventsStream implements EventsStream {
     private void setup() {
         computeEntitlementBlockingStates();
         computeBlockingAggregator();
+        computeEntitlementStartEvent();
         computeEntitlementCancelEvent();
         computeStateForEntitlement();
     }
@@ -392,6 +400,20 @@ public class DefaultEventsStream implements EventsStream {
         return ImmutableList.<BlockingState>copyOf(currentBlockingStatePerService.values());
     }
 
+    private void computeEntitlementStartEvent() {
+        entitlementStartEvent = Iterables.<BlockingState>tryFind(subscriptionEntitlementStates,
+                                                                  new Predicate<BlockingState>() {
+                                                                      @Override
+                                                                      public boolean apply(final BlockingState input) {
+                                                                          return DefaultEntitlementApi.ENT_STATE_START.equals(input.getStateName());
+                                                                      }
+                                                                  }).orNull();
+
+        // Note that we still default to subscriptionBase.startDate (for compatibility issue where ENT_STATE_START does not exist)
+        entitlementEffectiveStartDate = entitlementStartEvent != null ?
+                                        internalTenantContext.toLocalDate(entitlementStartEvent.getEffectiveDate()) :
+                                        internalTenantContext.toLocalDate(getSubscriptionBase().getStartDate());
+    }
 
     private void computeEntitlementCancelEvent() {
         entitlementCancelEvent = Iterables.<BlockingState>tryFind(subscriptionEntitlementStates,
@@ -409,8 +431,7 @@ public class DefaultEventsStream implements EventsStream {
         if (entitlementEffectiveEndDate != null && entitlementEffectiveEndDate.compareTo(internalTenantContext.toLocalDate(utcNow)) <= 0) {
             entitlementState = EntitlementState.CANCELLED;
         } else {
-            final LocalDate startDate = new LocalDate(getSubscriptionBase().getStartDate(), account.getTimeZone());
-            if (startDate.compareTo(new LocalDate(utcNow, account.getTimeZone())) > 0) {
+            if (entitlementEffectiveStartDate.compareTo(new LocalDate(utcNow, account.getTimeZone())) > 0) {
                 entitlementState = EntitlementState.PENDING;
             } else {
                 // Gather states across all services and check if one of them is set to 'blockEntitlement'
diff --git a/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestDefaultEntitlementApi.java b/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestDefaultEntitlementApi.java
index 0447fe5..49e2142 100644
--- a/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestDefaultEntitlementApi.java
+++ b/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestDefaultEntitlementApi.java
@@ -302,7 +302,7 @@ public class TestDefaultEntitlementApi extends EntitlementTestSuiteWithEmbeddedD
         // Block all entitlement in the bundle
         clock.addDays(5);
 
-        testListener.pushExpectedEvents(NextEvent.PAUSE, NextEvent.BLOCK);
+        testListener.pushExpectedEvents(NextEvent.BLOCK);
         entitlementApi.pause(baseEntitlement.getBundleId(), new LocalDate(clock.getUTCNow()), ImmutableList.<PluginProperty>of(), callContext);
         assertListenerStatus();
 
@@ -329,13 +329,11 @@ public class TestDefaultEntitlementApi extends EntitlementTestSuiteWithEmbeddedD
 
         clock.addDays(3);
 
-        testListener.pushExpectedEvents(NextEvent.RESUME, NextEvent.BLOCK);
+        testListener.pushExpectedEvents(NextEvent.BLOCK);
         entitlementApi.resume(baseEntitlement.getBundleId(), new LocalDate(clock.getUTCNow()), ImmutableList.<PluginProperty>of(), callContext);
         assertListenerStatus();
 
-        // Verify call is idempotent : The current semantics is to post the RESUME because we went through the operation, but not the BLOCK because the DAO logic
-        // filtered the event as the subscription was already resumed.
-        testListener.pushExpectedEvents(NextEvent.RESUME);
+        // Verify call is idempotent
         entitlementApi.resume(baseEntitlement.getBundleId(), new LocalDate(clock.getUTCNow()), ImmutableList.<PluginProperty>of(), callContext);
         assertListenerStatus();
 
@@ -382,7 +380,7 @@ public class TestDefaultEntitlementApi extends EntitlementTestSuiteWithEmbeddedD
         // No event yet
         assertListenerStatus();
 
-        testListener.pushExpectedEvents(NextEvent.PAUSE, NextEvent.BLOCK);
+        testListener.pushExpectedEvents(NextEvent.BLOCK);
         clock.setDay(pauseDate);
         assertListenerStatus();
 
@@ -390,7 +388,7 @@ public class TestDefaultEntitlementApi extends EntitlementTestSuiteWithEmbeddedD
         final Entitlement baseEntitlementPaused = entitlementApi.getEntitlementForId(baseEntitlement.getId(), callContext);
         assertEquals(baseEntitlementPaused.getState(), EntitlementState.BLOCKED);
 
-        testListener.pushExpectedEvents(NextEvent.RESUME, NextEvent.BLOCK);
+        testListener.pushExpectedEvents( NextEvent.BLOCK);
         clock.setDay(resumeDate);
         assertListenerStatus();
 
@@ -471,7 +469,7 @@ public class TestDefaultEntitlementApi extends EntitlementTestSuiteWithEmbeddedD
         assertTrue(blockingState.isBlockEntitlement());
 
 
-        // Check unblocking on another service will not bring the sate back to ACTIVE
+        // Check unblocking on another service will not bring the state back to ACTIVE
         clock.addDays(1);
         testListener.pushExpectedEvents(NextEvent.BLOCK);
         entitlementApi.setBlockingState(baseEntitlement.getBundleId(), "UNBLOCK", "bar", null, false, false, false, ImmutableList.<PluginProperty>of(), callContext);
diff --git a/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestDefaultSubscriptionApi.java b/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestDefaultSubscriptionApi.java
index 5339855..a014624 100644
--- a/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestDefaultSubscriptionApi.java
+++ b/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestDefaultSubscriptionApi.java
@@ -223,14 +223,14 @@ public class TestDefaultSubscriptionApi extends EntitlementTestSuiteWithEmbedded
         final LocalDate pauseDate = new LocalDate(2013, 9, 17);
         entitlementApi.pause(baseEntitlement.getBundleId(), pauseDate, ImmutableList.<PluginProperty>of(), callContext);
 
-        testListener.pushExpectedEvents(NextEvent.PAUSE, NextEvent.BLOCK);
+        testListener.pushExpectedEvents(NextEvent.BLOCK);
         clock.setDay(pauseDate);
         assertListenerStatus();
 
         final LocalDate resumeDate = new LocalDate(2013, 12, 24);
         entitlementApi.resume(baseEntitlement.getBundleId(), resumeDate, ImmutableList.<PluginProperty>of(), callContext);
 
-        testListener.pushExpectedEvents(NextEvent.RESUME, NextEvent.BLOCK);
+        testListener.pushExpectedEvents(NextEvent.BLOCK);
         clock.setDay(resumeDate);
         assertListenerStatus();
 
diff --git a/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestEventJson.java b/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestEventJson.java
index 3422f32..dd7b6b8 100644
--- a/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestEventJson.java
+++ b/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestEventJson.java
@@ -31,7 +31,9 @@ public class TestEventJson extends EntitlementTestSuiteNoDB {
 
     @Test(groups = "fast", description = "Test Blocking event deserialization")
     public void testDefaultBlockingTransitionInternalEvent() throws Exception {
-        final BlockingTransitionInternalEvent e = new DefaultBlockingTransitionInternalEvent(UUID.randomUUID(), BlockingStateType.ACCOUNT, true, false, false, true, 1L, 2L, null);
+        final BlockingTransitionInternalEvent e = new DefaultBlockingTransitionInternalEvent(UUID.randomUUID(), "state", "svc",
+                                                                                             clock.getUTCNow(), BlockingStateType.ACCOUNT,
+                                                                                             true, false, false, true, 1L, 2L, null);
 
         final String json = mapper.writeValueAsString(e);
 
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/InvoiceListener.java b/invoice/src/main/java/org/killbill/billing/invoice/InvoiceListener.java
index ca63e2b..165f849 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/InvoiceListener.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/InvoiceListener.java
@@ -19,23 +19,21 @@ package org.killbill.billing.invoice;
 import java.util.UUID;
 
 import org.joda.time.DateTime;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.killbill.billing.account.api.AccountApiException;
 import org.killbill.billing.account.api.AccountInternalApi;
-import org.killbill.clock.Clock;
+import org.killbill.billing.callcontext.InternalCallContext;
 import org.killbill.billing.events.BlockingTransitionInternalEvent;
-import org.killbill.billing.subscription.api.SubscriptionBaseTransitionType;
+import org.killbill.billing.events.EffectiveSubscriptionInternalEvent;
+import org.killbill.billing.events.RepairSubscriptionInternalEvent;
 import org.killbill.billing.invoice.api.InvoiceApiException;
+import org.killbill.billing.subscription.api.SubscriptionBaseTransitionType;
 import org.killbill.billing.util.callcontext.CallOrigin;
-import org.killbill.billing.callcontext.InternalCallContext;
 import org.killbill.billing.util.callcontext.InternalCallContextFactory;
 import org.killbill.billing.util.callcontext.UserType;
-import org.killbill.billing.events.EffectiveEntitlementInternalEvent;
-import org.killbill.billing.events.EffectiveSubscriptionInternalEvent;
-import org.killbill.billing.events.RepairSubscriptionInternalEvent;
 import org.killbill.billing.util.config.InvoiceConfig;
+import org.killbill.clock.Clock;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.google.common.eventbus.AllowConcurrentEvents;
 import com.google.common.eventbus.Subscribe;
@@ -94,18 +92,6 @@ public class InvoiceListener {
 
     @AllowConcurrentEvents
     @Subscribe
-    public void handleEntitlementTransition(final EffectiveEntitlementInternalEvent event) {
-
-        try {
-            final InternalCallContext context = internalCallContextFactory.createInternalCallContext(event.getSearchKey2(), event.getSearchKey1(), "SubscriptionBaseTransition", CallOrigin.INTERNAL, UserType.SYSTEM, event.getUserToken());
-            dispatcher.processAccount(event.getAccountId(), event.getEffectiveTransitionTime(), null, context);
-        } catch (InvoiceApiException e) {
-            log.error(e.getMessage());
-        }
-    }
-
-    @AllowConcurrentEvents
-    @Subscribe
     public void handleBlockingStateTransition(final BlockingTransitionInternalEvent event) {
 
         // We are only interested in blockBilling or unblockBilling transitions.
diff --git a/util/src/test/java/org/killbill/billing/api/TestApiListener.java b/util/src/test/java/org/killbill/billing/api/TestApiListener.java
index d710a92..b4aa841 100644
--- a/util/src/test/java/org/killbill/billing/api/TestApiListener.java
+++ b/util/src/test/java/org/killbill/billing/api/TestApiListener.java
@@ -30,7 +30,6 @@ import javax.inject.Inject;
 import org.killbill.billing.events.BlockingTransitionInternalEvent;
 import org.killbill.billing.events.BroadcastInternalEvent;
 import org.killbill.billing.events.CustomFieldEvent;
-import org.killbill.billing.events.EffectiveEntitlementInternalEvent;
 import org.killbill.billing.events.EffectiveSubscriptionInternalEvent;
 import org.killbill.billing.events.InvoiceAdjustmentInternalEvent;
 import org.killbill.billing.events.InvoiceCreationInternalEvent;
@@ -129,7 +128,6 @@ public class TestApiListener {
         CUSTOM_FIELD,
     }
 
-
     @Subscribe
     public void handleBroadcastEvents(final BroadcastInternalEvent event) {
         log.info(String.format("Got BroadcastInternalEvent event %s", event.toString()));
@@ -137,7 +135,6 @@ public class TestApiListener {
         notifyIfStackEmpty();
     }
 
-
     @Subscribe
     public void handleRepairSubscriptionEvents(final RepairSubscriptionInternalEvent event) {
         log.info(String.format("Got RepairSubscriptionEvent event %s", event.toString()));
@@ -146,21 +143,6 @@ public class TestApiListener {
     }
 
     @Subscribe
-    public void handleEntitlementEvents(final EffectiveEntitlementInternalEvent eventEffective) {
-        log.info(String.format("Got entitlement event %s", eventEffective.toString()));
-        switch (eventEffective.getTransitionType()) {
-            case BLOCK_BUNDLE:
-                assertEqualsNicely(NextEvent.PAUSE);
-                notifyIfStackEmpty();
-                break;
-            case UNBLOCK_BUNDLE:
-                assertEqualsNicely(NextEvent.RESUME);
-                notifyIfStackEmpty();
-                break;
-        }
-    }
-
-    @Subscribe
     public void handleEntitlementEvents(final BlockingTransitionInternalEvent event) {
         log.info(String.format("Got entitlement event %s", event.toString()));
         assertEqualsNicely(NextEvent.BLOCK);