blob: 13a62f222da9e7e501751fce129d12d607d77329 [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF 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.apache.cloudstack.framework.jobs;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
/**
* Outcome is returned by clients of jobs framework as a way to wait for the
* outcome of a job. It fully complies with how Future interface is designed.
* In addition, it allows the callee to file a task to be scheduled when the
* job completes.
*
* Note that the callee should schedule a job when using the Task interface.
* It shouldn't try to complete the job in the schedule code as that will take
* up threads in the jobs framework.
*
* For the client of the jobs framework, you can either use the OutcomeImpl
* class to implement this interface or you can add to this interface to
* allow for your specific exceptions to be thrown.
*
* @param <T> Object returned to the callee when the job completes
*/
public interface Outcome<T> extends Future<T> {
AsyncJob getJob();
/**
* In addition to the normal Future methods, Outcome allows the ability
* to register a schedule task to be performed when the job is completed.
*
* @param listener
*/
void execute(Task<T> task);
void execute(Task<T> task, long wait, TimeUnit unit);
/**
* Listener is used by Outcome to schedule a task to run when a job
* completes.
*
* @param <T> T result returned
*/
public interface Task<T> extends Runnable {
void schedule(AsyncJobExecutionContext context, T result);
void scheduleOnError(AsyncJobExecutionContext context, Throwable e);
}
}