1 /*
2  * JBoss, Home of Professional Open Source.
3  * Copyright 2014 Red Hat, Inc., and individual contributors
4  * as indicated by the @author tags.
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *     http://www.apache.org/licenses/LICENSE-2.0
11  *
12  *  Unless required by applicable law or agreed to in writing, software
13  *  distributed under the License is distributed on an "AS IS" BASIS,
14  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  *  See the License for the specific language governing permissions and
16  *  limitations under the License.
17  */

18
19 package io.undertow.util;
20
21 import java.util.concurrent.RejectedExecutionException;
22 import java.util.concurrent.TimeUnit;
23
24 import org.xnio.XnioExecutor;
25 import org.xnio.XnioIoThread;
26 import io.undertow.UndertowLogger;
27
28 /**
29  * @author Stuart Douglas
30  */

31 public class WorkerUtils {
32
33     private WorkerUtils() {
34     }
35
36     /**
37      * Schedules a task for future execution. If the execution is rejected because the worker is shutting
38      * down then it is logged at debug level and the exception is not re-thrown
39      *  @param thread   The IO thread
40      * @param task     The task to execute
41      * @param timeout  The timeout
42      * @param timeUnit The time unit
43      */

44     public static XnioExecutor.Key executeAfter(XnioIoThread thread, Runnable task, long timeout, TimeUnit timeUnit) {
45         try {
46             return thread.executeAfter(task, timeout, timeUnit);
47         } catch (RejectedExecutionException e) {
48             if(thread.getWorker().isShutdown()) {
49                 UndertowLogger.ROOT_LOGGER.debugf(e, "Failed to schedule task %s as worker is shutting down", task);
50                 //we just return a bogus key in this case
51                 return new XnioExecutor.Key() {
52                     @Override
53                     public boolean remove() {
54                         return false;
55                     }
56                 };
57             } else {
58                 throw e;
59             }
60         }
61     }
62 }
63