/* * Copyright 2010-2011 Ning, Inc. * Copyright 2015 Groupon, Inc * Copyright 2015 The Billing Project, LLC * * The Billing Project licenses this file to you under the Apache License, version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ package org.killbill.notificationq; import java.util.ArrayList; import java.util.ConcurrentModificationException; import java.util.Iterator; import java.util.List; import javax.inject.Inject; import org.killbill.CreatorName; import org.killbill.clock.Clock; import org.killbill.notificationq.api.NotificationEvent; import org.killbill.notificationq.api.NotificationQueue; import org.killbill.notificationq.api.NotificationQueueConfig; import org.killbill.notificationq.dao.NotificationEventModelDao; import org.killbill.queue.api.PersistentQueueEntryLifecycleState; import org.killbill.queue.dispatching.CallableCallbackBase; import org.skife.jdbi.v2.DBI; import com.codahale.metrics.MetricRegistry; public class MockNotificationQueueService extends NotificationQueueServiceBase { @Inject public MockNotificationQueueService(final Clock clock, final NotificationQueueConfig config, final DBI dbi, final MetricRegistry metricRegistry) { super(clock, config, dbi, metricRegistry); } @Override protected NotificationQueue createNotificationQueueInternal(final String svcName, final String queueName, final NotificationQueueHandler handler) { return new MockNotificationQueue(clock, svcName, queueName, handler, this); } @Override public int doProcessEvents() { int retry = 2; do { try { int result = 0; for (final String queueName : queues.keySet()) { final NotificationQueue cur = queues.get(queueName); if (cur != null) { result += doProcessEventsForQueue((MockNotificationQueue) cur); } } return result; } catch (final ConcurrentModificationException e) { retry--; } } while (retry > 0); return 0; } private int doProcessEventsForQueue(final MockNotificationQueue queue) { int result = 0; final List<NotificationEventModelDao> processedNotifications = new ArrayList<NotificationEventModelDao>(); final List<NotificationEventModelDao> oldNotifications = new ArrayList<NotificationEventModelDao>(); final List<NotificationEventModelDao> readyNotifications = queue.getReadyNotifications(); for (final NotificationEventModelDao cur : readyNotifications) { final NotificationEvent key = CallableCallbackBase.deserializeEvent(cur, objectMapper); queue.getHandler().handleReadyNotification(key, cur.getEffectiveDate(), cur.getFutureUserToken(), cur.getSearchKey1(), cur.getSearchKey2()); final NotificationEventModelDao processedNotification = new NotificationEventModelDao(cur.getRecordId(), CreatorName.get(), CreatorName.get(), clock.getUTCNow(), getClock().getUTCNow().plus(CLAIM_TIME_MS), PersistentQueueEntryLifecycleState.PROCESSED, cur.getClassName(), cur.getEventJson(), 0L, cur.getUserToken(), cur.getSearchKey1(), cur.getSearchKey2(), cur.getFutureUserToken(), cur.getEffectiveDate(), "MockQueue"); oldNotifications.add(cur); processedNotifications.add(processedNotification); result++; } queue.markProcessedNotifications(oldNotifications, processedNotifications); return result; } }