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

com.github.dm.jrt.invocation.Invocation Maven / Gradle / Ivy

There is a newer version: 5.9.0
Show newest version
/*
 * 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.github.dm.jrt.invocation;

import com.github.dm.jrt.channel.ResultChannel;
import com.github.dm.jrt.channel.RoutineException;

import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

/**
 * Interface defining a routine invocation.
 * 

* The typical lifecycle of an invocation object is the one depicted below: *

 *     
 *
 *                   <init>
 *
 *                   |     |
 *                   |     |-------------------------------
 *                   V     |                               |
 *            ----------------                             |
 *        --->|onInitialize()|-----------                  |
 *       |    ----------------           |                 |
 *       |           |      ------       |                 |
 *       |           |     |      |      |                 |
 *       |           V     V      |      |                 |
 *       |    ----------------    |      |                 |
 *       |    |  onInput()   |----       |                 |
 *       |    ----------------           V                 |
 *       |           |     |         ----------------      |
 *       |           |     |-------->|  onAbort()   |      |
 *       |           V     |         ----------------      |
 *       |    ----------------           |     |           |
 *       |    |  onResult()  |           |     |           |
 *       |    ----------------           |     |           |
 *       |           |      -------------      |           |
 *       |           |     |              (if exception is thrown)
 *       |           V     V                   |           |
 *       |    -----------------                |           |
 *        ----| onTerminate() |                |           |
 *            -----------------                |           |
 *                   |      -------------------------------
 *                   |     |
 *                   V     V
 *            -----------------
 *            |  onDestroy()  |
 *            -----------------
 *     
 * 
* Note that the {@code onInput()} method will be called for each input passed to the routine, so, * in case no input is expected, the {@code onResult()} method will be called soon after the * initialization. *

* Note also that {@code onAbort()} might be called at any time between {@code onInitialize()} and * {@code onTerminate()} in case the execution is aborted. *
* The only case in which the {@code onTerminate()} method does not get call at all, is when an * exception escapes the {@code onAbort()} method invocation. *

* The {@code onTerminate()} method is meant to allow the clean up and reset operations needed to * prepare the invocation object to be reused. When the method is not called or does not complete * successfully, the invocation object is discarded.
* While the {@code onDestroy()} method is meant to indicate that the invocation object is no longer * needed, so any associated resource can be safely released. Note that this method may never get * called if the routine is automatically garbage collected. *

* Keep in mind, when implementing an invocation class, that the result channel passed to the * {@code onInput()} and {@code onResult()} methods will be closed as soon as the latter exits.
* Any further attempt to post results will generate an exception.
* It is anyway possible to keep on generating results by passing to the result channel an output or * an I/O channel. *

* Be aware that there is no guarantee about how and when an invocation will produce a result. It * might return one or more output for each input, or no output at all. *

* Any exception escaping the invocation methods, unless it extends the base * {@link com.github.dm.jrt.channel.RoutineException RoutineException}, will be wrapped as the cause * of an {@link com.github.dm.jrt.invocation.InvocationException InvocationException} instance. *

* Created by davide-maestroni on 09/07/2014. * * @param the input data type. * @param the output data type. */ public interface Invocation { /** * Called when the routine execution is aborted.
* This method may be called at any time after the invocation initialization. * * @param reason the reason of the abortion. */ void onAbort(@Nullable RoutineException reason); /** * Called when the routine invocation is no longer needed. */ void onDestroy(); /** * Called when the routine invocation is initialized.
* This is always the first method in the invocation lifecycle. */ void onInitialize(); /** * Called when an input is passed to the routine.
* This method is called once for each input object. * * @param input the input. * @param result the result channel. */ void onInput(IN input, @NotNull ResultChannel result); /** * Called when all the inputs has been passed to the routine.
* This method is called once in the invocation lifecycle to indicate that the final invocation * results should be passed to the result channel. * * @param result the result channel. */ void onResult(@NotNull ResultChannel result); /** * Called when the invocation execution has completed. */ void onTerminate(); }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy