org.elasticsearch.common.component.AbstractLifecycleComponent Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of elasticsearch Show documentation
Show all versions of elasticsearch Show documentation
Elasticsearch subproject :server
/*
* Licensed to Elasticsearch under one or more contributor
* license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright
* ownership. Elasticsearch 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.elasticsearch.common.component;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.elasticsearch.common.settings.Settings;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
public abstract class AbstractLifecycleComponent implements LifecycleComponent {
private static final Logger logger = LogManager.getLogger(AbstractLifecycleComponent.class);
protected final Lifecycle lifecycle = new Lifecycle();
private final List listeners = new CopyOnWriteArrayList<>();
protected AbstractLifecycleComponent() {}
/**
* @deprecated the settings parameters are not used, therefore the use of this constructor is deprecated.
* Going to be removed in subsequent versions. The parameterless constructor should be used instead.
*/
@Deprecated
protected AbstractLifecycleComponent(Settings settings) {
// TODO drop settings from ctor
}
@Override
public Lifecycle.State lifecycleState() {
return this.lifecycle.state();
}
@Override
public void addLifecycleListener(LifecycleListener listener) {
listeners.add(listener);
}
@Override
public void removeLifecycleListener(LifecycleListener listener) {
listeners.remove(listener);
}
@SuppressWarnings({"unchecked"})
@Override
public void start() {
if (!lifecycle.canMoveToStarted()) {
return;
}
for (LifecycleListener listener : listeners) {
listener.beforeStart();
}
doStart();
lifecycle.moveToStarted();
for (LifecycleListener listener : listeners) {
listener.afterStart();
}
}
protected abstract void doStart();
@SuppressWarnings({"unchecked"})
@Override
public void stop() {
if (!lifecycle.canMoveToStopped()) {
return;
}
for (LifecycleListener listener : listeners) {
listener.beforeStop();
}
lifecycle.moveToStopped();
doStop();
for (LifecycleListener listener : listeners) {
listener.afterStop();
}
}
protected abstract void doStop();
@Override
public void close() {
if (lifecycle.started()) {
stop();
}
if (!lifecycle.canMoveToClosed()) {
return;
}
for (LifecycleListener listener : listeners) {
listener.beforeClose();
}
lifecycle.moveToClosed();
try {
doClose();
} catch (IOException e) {
// TODO: we need to separate out closing (ie shutting down) services, vs releasing runtime transient
// structures. Shutting down services should use IOUtils.close
logger.warn("failed to close " + getClass().getName(), e);
}
for (LifecycleListener listener : listeners) {
listener.afterClose();
}
}
protected abstract void doClose() throws IOException;
}