/* * 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.ignite.spi.deployment; import org.apache.ignite.spi.IgniteSpi; import org.apache.ignite.spi.IgniteSpiException; import org.jetbrains.annotations.Nullable; /** * Grid deployment SPI is in charge of deploying tasks and classes from different * sources. * <p> * Class loaders that are in charge of loading task classes (and other classes) * can be deployed directly by calling {@link #register(ClassLoader, Class)} method or * by SPI itself, for example by asynchronously scanning some folder for new tasks. * When method {@link #findResource(String)} is called by the system, SPI must return a * class loader associated with given class. Every time a class loader * gets (re)deployed or released, callbacks * {@link DeploymentListener#onUnregistered(ClassLoader)}} must be called by SPI. * <p> * If peer class loading is enabled (which is default behavior, see * {@link org.apache.ignite.configuration.IgniteConfiguration#isPeerClassLoadingEnabled()}), then it is usually * enough to deploy class loader only on one grid node. Once a task starts executing * on the grid, all other nodes will automatically load all task classes from * the node that initiated the execution. Hot redeployment is also supported * with peer class loading. Every time a task changes and gets redeployed on a * node, all other nodes will detect it and will redeploy this task as well. * <strong> * Note that peer class loading comes into effect only if a task was * not locally deployed, otherwise, preference will always be given to * local deployment. * </strong> * <p> * Ignite provides following {@code GridDeploymentSpi} implementations out of the box: * <ul> * <li>{@link org.apache.ignite.spi.deployment.local.LocalDeploymentSpi}</li> * <li>{@ignitelink org.apache.ignite.spi.deployment.uri.UriDeploymentSpi}</li> * </ul> * <b>NOTE:</b> SPI methods should never be used directly. SPIs provide * internal view on the subsystem and is used internally by Ignite. In rare use cases when * access to a specific implementation of this SPI is required - an instance of this SPI can be obtained * via {@link org.apache.ignite.Ignite#configuration()} method to check its configuration properties or call other non-SPI * methods. Note again that calling methods from this interface on the obtained instance can lead * to undefined behavior and explicitly not supported. */ public interface DeploymentSpi extends IgniteSpi { /** * Finds class loader for the given class. * * @param rsrcName Class name or class alias to find class loader for. * @return Deployed class loader, or {@code null} if not deployed. */ public DeploymentResource findResource(String rsrcName); /** * Registers a class loader with this SPI. This method exists * to be able to add external class loaders to deployment SPI. * Deployment SPI may also have its own class loaders. For example, * in case of GAR deployment, every GAR file is loaded and deployed * with a separate class loader maintained internally by the SPI. * <p> * The array of classes passed in should be checked for presence of * {@link org.apache.ignite.compute.ComputeTaskName} annotations. The classes that have this annotation * should be accessible by this name from {@link #findResource(String)} method. * * @param ldr Class loader to register. * @param rsrc Class that should be checked for aliases. * Currently the only alias in the system is {@link org.apache.ignite.compute.ComputeTaskName} for * task classes; in future, there may be others. * @return {@code True} if resource was registered. * @throws org.apache.ignite.spi.IgniteSpiException If registration failed. */ public boolean register(ClassLoader ldr, Class<?> rsrc) throws IgniteSpiException; /** * Unregisters all class loaders that have a class with given name or have * a class with give {@link org.apache.ignite.compute.ComputeTaskName} value. * * @param rsrcName Either class name or {@link org.apache.ignite.compute.ComputeTaskName} value for a class * whose class loader needs to be unregistered. * @return {@code True} if resource was unregistered. */ public boolean unregister(String rsrcName); /** * Sets or unsets deployment event listener. Grid implementation will use this listener * to properly add and remove various deployments. * * @param lsnr Listener for deployment events. {@code null} to unset the listener. */ public void setListener(@Nullable DeploymentListener lsnr); }