All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.effektif.workflow.impl.AsynchronousExecutorService Maven / Gradle / Ivy

/*
 * Copyright 2014 Effektif GmbH.
 *
 * 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 com.effektif.workflow.impl;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Executor;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

import org.slf4j.Logger;

import com.effektif.workflow.impl.configuration.Brewable;
import com.effektif.workflow.impl.configuration.Brewery;


/**
 * @author Tom Baeyens
 */
public class AsynchronousExecutorService implements ExecutorService, Brewable {
  
  private static final Logger log = WorkflowEngineImpl.log;
  
  // TODO apply these tips: http://java.dzone.com/articles/executorservice-10-tips-and

  public Executor executor;
  public BlockingQueue queue;
  public long shutdownTimeout = 30;                    // TODO make configurable
  public TimeUnit shutdownTimeUnit = TimeUnit.SECONDS; // TODO make configurable

  public AsynchronousExecutorService() {
  }

  @Override
  public void brew(Brewery brewery) {
    ScheduledThreadPoolExecutor scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(4, new ThreadPoolExecutor.CallerRunsPolicy());
    this.queue = scheduledThreadPoolExecutor.getQueue();
    this.executor = scheduledThreadPoolExecutor;
  }

  @Override
  public void execute(Runnable command) {
    if (log.isDebugEnabled()) log.debug("Command executes asynchronous: "+command);
    executor.execute(command);
  }

  public int getQueueDepth() {
    return queue.size();
  }

  @Override
  public void startup() {
  }

  @Override
  public void shutdown() {
    if (executor instanceof ScheduledExecutorService) {
      if (!((ScheduledExecutorService)executor).isShutdown()) {
        try {
          ScheduledExecutorService scheduledExecutorService = (ScheduledExecutorService) executor;
          if (log.isDebugEnabled())
            log.debug("shutting down executor "+executor);
          scheduledExecutorService.shutdown();
          scheduledExecutorService.awaitTermination(shutdownTimeout, shutdownTimeUnit);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
      }
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy