diff options
author | avigaffa <avi.gaffa@amdocs.com> | 2018-11-18 16:01:07 +0200 |
---|---|---|
committer | Oren Kleks <orenkle@amdocs.com> | 2018-11-26 19:45:30 +0000 |
commit | d8906a0cc7fcc302020e983fdfade2758663ba4d (patch) | |
tree | 6082ed5edc4634945785342285ad754ca8d135a9 /openecomp-be/api/openecomp-sdc-rest-webapp/item-rest/item-rest-services/src/main/java/org/openecomp/sdcrests/item/rest/services/catalog/notification/AsyncNotifier.java | |
parent | 4d34afb67ad28e83e07cdd365c985b6fb8745ebe (diff) |
error when trying to archive\restore
fix bug: getting server error when trying to archive\restore VLM\VSP
Change-Id: I7abefd2d8ac368d590329071a56f200c203cf966
Issue-ID: SDC-1667
Signed-off-by: avigaffa <avi.gaffa@amdocs.com>
Diffstat (limited to 'openecomp-be/api/openecomp-sdc-rest-webapp/item-rest/item-rest-services/src/main/java/org/openecomp/sdcrests/item/rest/services/catalog/notification/AsyncNotifier.java')
-rw-r--r-- | openecomp-be/api/openecomp-sdc-rest-webapp/item-rest/item-rest-services/src/main/java/org/openecomp/sdcrests/item/rest/services/catalog/notification/AsyncNotifier.java | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/openecomp-be/api/openecomp-sdc-rest-webapp/item-rest/item-rest-services/src/main/java/org/openecomp/sdcrests/item/rest/services/catalog/notification/AsyncNotifier.java b/openecomp-be/api/openecomp-sdc-rest-webapp/item-rest/item-rest-services/src/main/java/org/openecomp/sdcrests/item/rest/services/catalog/notification/AsyncNotifier.java new file mode 100644 index 0000000000..82880106d7 --- /dev/null +++ b/openecomp-be/api/openecomp-sdc-rest-webapp/item-rest/item-rest-services/src/main/java/org/openecomp/sdcrests/item/rest/services/catalog/notification/AsyncNotifier.java @@ -0,0 +1,101 @@ +/* + * Copyright © 2016-2018 European Support Limited + * + * Licensed 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.openecomp.sdcrests.item.rest.services.catalog.notification; + +import java.util.Collection; +import java.util.concurrent.Callable; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.function.BiFunction; +import org.openecomp.sdc.logging.api.Logger; +import org.openecomp.sdc.logging.api.LoggerFactory; +import org.openecomp.sdc.logging.api.LoggingContext; +import org.openecomp.sdcrests.item.types.ItemAction; + +/** + * Asynchronously runs a notification task. + * + * @author evitaliy + * @since 22 Nov 2018 + */ +public class AsyncNotifier implements Notifier { + + private static final ScheduledExecutorService EXECUTOR_SERVICE = Executors.newScheduledThreadPool(1); + + private static final int DEFAULT_NUM_OF_RETRIES = 2; + private static final long DEFAULT_INTERVAL = 5000; + + private final BiFunction<Collection<String>, ItemAction, Callable<NextAction>> taskProducer; + + AsyncNotifier(BiFunction<Collection<String>, ItemAction, Callable<NextAction>> taskProducer) { + this.taskProducer = taskProducer; + } + + @Override + public void execute(Collection<String> itemIds, ItemAction action) { + + Callable<AsyncNotifier.NextAction> worker = taskProducer.apply(itemIds, action); + + RetryingTask retryingTask = + new RetryingTask(worker, DEFAULT_NUM_OF_RETRIES, DEFAULT_INTERVAL, EXECUTOR_SERVICE); + + EXECUTOR_SERVICE.submit(LoggingContext.copyToCallable(retryingTask)); + } + + public enum NextAction { + RETRY, DONE + } + + static class RetryingTask implements Callable<Void> { + + private static final Logger LOGGER = LoggerFactory.getLogger(RetryingTask.class); + + private final Callable<AsyncNotifier.NextAction> worker; + private final long delay; + private final ScheduledExecutorService scheduler; + private volatile int retries; + + RetryingTask(Callable<AsyncNotifier.NextAction> worker, int numOfRetries, long delay, + ScheduledExecutorService scheduler) { + + this.worker = worker; + this.retries = numOfRetries; + this.delay = delay; + this.scheduler = scheduler; + } + + @Override + public synchronized Void call() throws Exception { + + NextAction next = worker.call(); + if (next == NextAction.DONE) { + LOGGER.debug("Task successful: {}. Not going to retry", worker); + return null; + } + + retries--; + if (retries == 0) { + LOGGER.warn("Exhausted number of retries for task {}, exiting", worker); + return null; + } + + scheduler.schedule(this, delay, TimeUnit.MILLISECONDS); + return null; + } + } +} |