/* * 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.services; import java.io.Serializable; import org.apache.ignite.cluster.ClusterNode; import org.apache.ignite.internal.util.tostring.GridToStringExclude; import org.apache.ignite.internal.util.typedef.internal.S; import org.apache.ignite.lang.IgnitePredicate; /** * Managed service configuration. In addition to deploying managed services by * calling any of the provided {@code deploy(...)} methods, managed services * can also be automatically deployed on startup by specifying them in {@link org.apache.ignite.configuration.IgniteConfiguration} * like so: * <pre name="code" class="java"> * IgniteConfiguration gridCfg = new IgniteConfiguration(); * * GridServiceConfiguration svcCfg1 = new GridServiceConfiguration(); * * svcCfg1.setName("myClusterSingletonService"); * svcCfg1.setMaxPerNodeCount(1); * svcCfg1.setTotalCount(1); * svcCfg1.setService(new MyClusterSingletonService()); * * GridServiceConfiguration svcCfg2 = new GridServiceConfiguration(); * * svcCfg2.setName("myNodeSingletonService"); * svcCfg2.setMaxPerNodeCount(1); * svcCfg2.setService(new MyNodeSingletonService()); * * gridCfg.setServiceConfiguration(svcCfg1, svcCfg2); * ... * Ignition.start(gridCfg); * </pre> * The above configuration can also be specified in a Spring configuration file. */ public class ServiceConfiguration implements Serializable { /** */ private static final long serialVersionUID = 0L; /** Service name. */ protected String name; /** Service instance. */ @GridToStringExclude private Service svc; /** Total count. */ protected int totalCnt; /** Max per-node count. */ protected int maxPerNodeCnt; /** Cache name. */ protected String cacheName; /** Affinity key. */ protected Object affKey; /** Node filter. */ @GridToStringExclude protected IgnitePredicate<ClusterNode> nodeFilter; /** * Gets service name. * <p> * This parameter is mandatory when deploying a service. * * @return Service name. */ public String getName() { return name; } /** * Sets service name. * <p> * This parameter is mandatory when deploying a service. * * @param name Service name. * @return {@code this} for chaining. */ public ServiceConfiguration setName(String name) { this.name = name; return this; } /** * Gets service instance. * <p> * This parameter is mandatory when deploying a service. * * @return Service instance. */ public Service getService() { return svc; } /** * Sets service instance. * <p> * This parameter is mandatory when deploying a service. * * @param svc Service instance. * @return {@code this} for chaining. */ public ServiceConfiguration setService(Service svc) { this.svc = svc; return this; } /** * Gets total number of deployed service instances in the cluster, {@code 0} for unlimited. * <p> * At least one of {@code getTotalCount()} or {@link #getMaxPerNodeCount()} values must be positive. * * @return Total number of deployed service instances in the cluster, {@code 0} for unlimited. */ public int getTotalCount() { return totalCnt; } /** * Sets total number of deployed service instances in the cluster, {@code 0} for unlimited. * <p> * At least one of {@code getTotalCount()} or {@link #getMaxPerNodeCount()} values must be positive. * * @param totalCnt Total number of deployed service instances in the cluster, {@code 0} for unlimited. * @return {@code this} for chaining. */ public ServiceConfiguration setTotalCount(int totalCnt) { this.totalCnt = totalCnt; return this; } /** * Gets maximum number of deployed service instances on each node, {@code 0} for unlimited. * <p> * At least one of {@code getMaxPerNodeCount()} or {@link #getTotalCount()} values must be positive. * * @return Maximum number of deployed service instances on each node, {@code 0} for unlimited. */ public int getMaxPerNodeCount() { return maxPerNodeCnt; } /** * Sets maximum number of deployed service instances on each node, {@code 0} for unlimited. * <p> * At least one of {@code getMaxPerNodeCount()} or {@link #getTotalCount()} values must be positive. * * @param maxPerNodeCnt Maximum number of deployed service instances on each node, {@code 0} for unlimited. * @return {@code this} for chaining. */ public ServiceConfiguration setMaxPerNodeCount(int maxPerNodeCnt) { this.maxPerNodeCnt = maxPerNodeCnt; return this; } /** * Gets cache name used for key-to-node affinity calculation. * <p> * This parameter is optional and is set only when deploying service based on key-affinity. * * @return Cache name, possibly {@code null}. */ public String getCacheName() { return cacheName; } /** * Sets cache name used for key-to-node affinity calculation. * <p> * This parameter is optional and is set only when deploying service based on key-affinity. * * @param cacheName Cache name, possibly {@code null}. * @return {@code this} for chaining. */ public ServiceConfiguration setCacheName(String cacheName) { this.cacheName = cacheName; return this; } /** * Gets affinity key used for key-to-node affinity calculation. * <p> * This parameter is optional and is set only when deploying service based on key-affinity. * * @return Affinity key, possibly {@code null}. */ public Object getAffinityKey() { return affKey; } /** * Sets affinity key used for key-to-node affinity calculation. * <p> * This parameter is optional and is set only when deploying service based on key-affinity. * * @param affKey Affinity key, possibly {@code null}. * @return {@code this} for chaining. */ public ServiceConfiguration setAffinityKey(Object affKey) { this.affKey = affKey; return this; } /** * Gets node filter used to filter nodes on which the service will be deployed. * <p> * This parameter is optional. If not provided service may be deployed on any or all * nodes in the grid, based on configuration. * * @return Node filter used to filter nodes on which the service will be deployed, possibly {@code null}. */ public IgnitePredicate<ClusterNode> getNodeFilter() { return nodeFilter; } /** * Sets node filter used to filter nodes on which the service will be deployed. * <p> * This parameter is optional. If not provided service may be deployed on any or all * nodes in the grid, based on configuration. * * @param nodeFilter Node filter used to filter nodes on which the service will be deployed, possibly {@code null}. * @return {@code this} for chaining. */ public ServiceConfiguration setNodeFilter(IgnitePredicate<ClusterNode> nodeFilter) { this.nodeFilter = nodeFilter; return this; } /** {@inheritDoc} */ @SuppressWarnings({"RedundantIfStatement", "EqualsWhichDoesntCheckParameterClass"}) @Override public boolean equals(Object o) { if (!equalsIgnoreNodeFilter(o)) return false; ServiceConfiguration that = (ServiceConfiguration)o; if (nodeFilter != null && that.nodeFilter != null) { if (!nodeFilter.getClass().equals(that.nodeFilter.getClass())) return false; } else if (nodeFilter != null || that.nodeFilter != null) return false; return true; } /** * Checks if configurations are equal ignoring the node filter. Node filters control on which * nodes the services are deployed and often can be ignored for equality checks. * * @param o Other configuration. * @return {@code True} if configurations are equal, {@code false} otherwise. */ @SuppressWarnings("RedundantIfStatement") public boolean equalsIgnoreNodeFilter(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; ServiceConfiguration that = (ServiceConfiguration)o; if (maxPerNodeCnt != that.maxPerNodeCnt) return false; if (totalCnt != that.totalCnt) return false; if (affKey != null ? !affKey.equals(that.affKey) : that.affKey != null) return false; if (cacheName != null ? !cacheName.equals(that.cacheName) : that.cacheName != null) return false; if (name != null ? !name.equals(that.name) : that.name != null) return false; if (svc != null ? !svc.getClass().equals(that.svc.getClass()) : that.svc != null) return false; return true; } /** {@inheritDoc} */ @Override public int hashCode() { return name == null ? 0 : name.hashCode(); } /** {@inheritDoc} */ @Override public String toString() { String svcCls = svc == null ? "" : svc.getClass().getSimpleName(); String nodeFilterCls = nodeFilter == null ? "" : nodeFilter.getClass().getSimpleName(); return S.toString(ServiceConfiguration.class, this, "svcCls", svcCls, "nodeFilterCls", nodeFilterCls); } }