release version 1.10.0
This commit is contained in:
@ -3,7 +3,7 @@
|
||||
<parent>
|
||||
<groupId>ru.entaxy.esb.platform.runtime.core</groupId>
|
||||
<artifactId>cluster</artifactId>
|
||||
<version>1.9.0</version>
|
||||
<version>1.10.0</version>
|
||||
</parent>
|
||||
<groupId>ru.entaxy.esb.platform.runtime.core.cluster</groupId>
|
||||
<artifactId>cluster-persistence-service</artifactId>
|
||||
@ -81,6 +81,28 @@
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.karaf.cellar</groupId>
|
||||
<artifactId>org.apache.karaf.cellar.features</artifactId>
|
||||
<version>${cellar.version}</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>org.apache.karaf</groupId>
|
||||
<artifactId>org.apache.karaf.util</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.karaf.cellar</groupId>
|
||||
<artifactId>org.apache.karaf.cellar.config</artifactId>
|
||||
<version>${cellar.version}</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>org.apache.karaf</groupId>
|
||||
<artifactId>org.apache.karaf.util</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.karaf.cellar</groupId>
|
||||
<artifactId>org.apache.karaf.cellar.hazelcast</artifactId>
|
||||
|
@ -2,7 +2,7 @@
|
||||
* ~~~~~~licensing~~~~~~
|
||||
* cluster-persistence-service
|
||||
* ==========
|
||||
* Copyright (C) 2020 - 2023 EmDev LLC
|
||||
* Copyright (C) 2020 - 2024 EmDev LLC
|
||||
* ==========
|
||||
* You may not use this file except in accordance with the License Terms of the Copyright
|
||||
* Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
|
||||
@ -32,7 +32,7 @@ import java.nio.file.Paths;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.apache.karaf.cellar.bundle.BundleState;
|
||||
import com.hazelcast.core.HazelcastInstanceNotActiveException;
|
||||
import org.apache.karaf.cellar.core.ClusterManager;
|
||||
import org.apache.karaf.cellar.core.Configurations;
|
||||
import org.slf4j.Logger;
|
||||
@ -82,22 +82,26 @@ public class Helper<T> {
|
||||
|
||||
ClusterManager clusterManager = this.serviceProvider.getClusterManager();
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
Map<String, T> clusterData = clusterManager.getMap(this.mapBaseName + Configurations.SEPARATOR + groupName);
|
||||
String serialized = "";
|
||||
serialized = clusterData.entrySet().stream()
|
||||
.<String>map((entry) -> {
|
||||
return entry.getKey() + DELIMITER + serializer.toString(entry.getValue());
|
||||
})
|
||||
.collect(Collectors.joining(SEPARATOR));
|
||||
Path p = getTargetPath(groupName);
|
||||
try {
|
||||
// if (!p.toFile().exists())
|
||||
// p.toFile().createNewFile();
|
||||
Files.createDirectories(p.getParent());
|
||||
Files.write(p, serialized.getBytes());
|
||||
} catch (IOException e) {
|
||||
log.error("FAILED saving state to [" + p.toUri().toString() + "]", e);
|
||||
Map<String, T> clusterData = clusterManager.getMap(this.mapBaseName + Configurations.SEPARATOR + groupName);
|
||||
|
||||
String serialized = "";
|
||||
serialized = clusterData.entrySet().stream()
|
||||
.<String>map((entry) -> {
|
||||
return entry.getKey() + DELIMITER + serializer.toString(entry.getValue());
|
||||
})
|
||||
.collect(Collectors.joining(SEPARATOR));
|
||||
Path p = getTargetPath(groupName);
|
||||
try {
|
||||
// if (!p.toFile().exists())
|
||||
// p.toFile().createNewFile();
|
||||
Files.createDirectories(p.getParent());
|
||||
Files.write(p, serialized.getBytes());
|
||||
} catch (IOException e) {
|
||||
log.error("FAILED saving state to [" + p.toUri().toString() + "]", e);
|
||||
}
|
||||
} catch (HazelcastInstanceNotActiveException e) {
|
||||
log.error("Hazelcast instance is not active for group [" + groupName + "]", e);
|
||||
}
|
||||
|
||||
Thread.currentThread().setContextClassLoader(originalClassLoader);
|
||||
|
@ -2,7 +2,7 @@
|
||||
* ~~~~~~licensing~~~~~~
|
||||
* cluster-persistence-service
|
||||
* ==========
|
||||
* Copyright (C) 2020 - 2023 EmDev LLC
|
||||
* Copyright (C) 2020 - 2024 EmDev LLC
|
||||
* ==========
|
||||
* You may not use this file except in accordance with the License Terms of the Copyright
|
||||
* Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
|
||||
@ -25,6 +25,8 @@
|
||||
*/
|
||||
package ru.entaxy.esb.platform.core.cluster.persistence;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
|
||||
@ -106,7 +108,7 @@ public class PersistenceManager<T> {
|
||||
try {
|
||||
log.debug("~~> UPDATE_TASK :: RUN :: sleeping");
|
||||
Thread.currentThread().sleep(15000);
|
||||
log.debug("~~> UPDATE_TASK :: RUN :: processig");
|
||||
log.debug("~~> UPDATE_TASK :: RUN :: processing");
|
||||
// TODO add support for different groups
|
||||
this.helper.saveClusterState("default");
|
||||
log.debug("~~> UPDATE_TASK :: RUN :: processed");
|
||||
@ -125,6 +127,10 @@ public class PersistenceManager<T> {
|
||||
|
||||
private Executor executor = new Executor();
|
||||
|
||||
private List<PersistenceManager<?>> dependents = new ArrayList<>();
|
||||
|
||||
private Object dependentsLock = new Object();
|
||||
|
||||
public PersistenceManager(ServiceProvider serviceProvider, String mapBaseName, String classifier,
|
||||
Class<T> dataClass) {
|
||||
|
||||
@ -132,6 +138,12 @@ public class PersistenceManager<T> {
|
||||
|
||||
}
|
||||
|
||||
public void addDependent(PersistenceManager<?> manager) {
|
||||
synchronized (dependentsLock) {
|
||||
dependents.add(manager);
|
||||
}
|
||||
}
|
||||
|
||||
public void restore() {
|
||||
// this is called only once before the consumer started
|
||||
// so we can call helper directly
|
||||
@ -155,6 +167,10 @@ public class PersistenceManager<T> {
|
||||
marker.update();
|
||||
}
|
||||
runExecutor();
|
||||
synchronized (dependentsLock) {
|
||||
for (PersistenceManager<?> dep : dependents)
|
||||
dep.updated();
|
||||
}
|
||||
}
|
||||
|
||||
protected synchronized void clear() {
|
||||
|
@ -2,7 +2,7 @@
|
||||
* ~~~~~~licensing~~~~~~
|
||||
* cluster-persistence-service
|
||||
* ==========
|
||||
* Copyright (C) 2020 - 2023 EmDev LLC
|
||||
* Copyright (C) 2020 - 2024 EmDev LLC
|
||||
* ==========
|
||||
* You may not use this file except in accordance with the License Terms of the Copyright
|
||||
* Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
|
||||
|
@ -2,7 +2,7 @@
|
||||
* ~~~~~~licensing~~~~~~
|
||||
* cluster-persistence-service
|
||||
* ==========
|
||||
* Copyright (C) 2020 - 2023 EmDev LLC
|
||||
* Copyright (C) 2020 - 2024 EmDev LLC
|
||||
* ==========
|
||||
* You may not use this file except in accordance with the License Terms of the Copyright
|
||||
* Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
|
||||
|
@ -2,7 +2,7 @@
|
||||
* ~~~~~~licensing~~~~~~
|
||||
* hazelcast-test
|
||||
* ==========
|
||||
* Copyright (C) 2020 - 2023 EmDev LLC
|
||||
* Copyright (C) 2020 - 2024 EmDev LLC
|
||||
* ==========
|
||||
* You may not use this file except in accordance with the License Terms of the Copyright
|
||||
* Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
|
||||
@ -25,8 +25,8 @@
|
||||
*/
|
||||
package ru.entaxy.esb.platform.core.cluster.persistence.activator;
|
||||
|
||||
import java.util.Hashtable;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import org.apache.karaf.cellar.bundle.BundleState;
|
||||
@ -35,6 +35,7 @@ import org.apache.karaf.cellar.bundle.management.CellarBundleMBean;
|
||||
import org.apache.karaf.cellar.core.ClusterManager;
|
||||
import org.apache.karaf.cellar.core.GroupManager;
|
||||
import org.apache.karaf.cellar.core.event.EventHandler;
|
||||
import org.apache.karaf.cellar.features.FeatureState;
|
||||
import org.apache.karaf.features.FeaturesService;
|
||||
import org.apache.karaf.util.tracker.BaseActivator;
|
||||
import org.apache.karaf.util.tracker.annotation.ProvideService;
|
||||
@ -53,46 +54,60 @@ import com.hazelcast.core.MembershipListener;
|
||||
import ru.entaxy.esb.platform.core.cluster.persistence.PersistenceManager;
|
||||
import ru.entaxy.esb.platform.core.cluster.persistence.ServiceProvider;
|
||||
import ru.entaxy.esb.platform.core.cluster.persistence.handler.LocalBundleEventHandler;
|
||||
import ru.entaxy.esb.platform.core.cluster.persistence.handler.LocalConfigurationEventHandler;
|
||||
import ru.entaxy.esb.platform.core.cluster.persistence.handler.LocalEventHandlerRegistryDispatcher;
|
||||
import ru.entaxy.esb.platform.core.cluster.persistence.handler.LocalFeaturesEventHandler;
|
||||
import ru.entaxy.esb.platform.core.cluster.persistence.handler.LocalHandlerRegistry;
|
||||
import ru.entaxy.esb.platform.core.cluster.persistence.handler.LocalRepositoryEventHandler;
|
||||
import ru.entaxy.esb.platform.core.cluster.persistence.handler.LocalTopicConsumer;
|
||||
|
||||
@Services(requires = {
|
||||
@RequireService(ClusterManager.class),
|
||||
@RequireService(GroupManager.class),
|
||||
@RequireService(CellarBundleMBean.class),
|
||||
@RequireService(ConfigurationAdmin.class),
|
||||
@RequireService(FeaturesService.class),
|
||||
@RequireService(HazelcastInstance.class)
|
||||
},
|
||||
provides = {
|
||||
@ProvideService(EventHandler.class)
|
||||
}
|
||||
)
|
||||
@RequireService(ClusterManager.class),
|
||||
@RequireService(GroupManager.class),
|
||||
@RequireService(CellarBundleMBean.class),
|
||||
@RequireService(ConfigurationAdmin.class),
|
||||
@RequireService(FeaturesService.class),
|
||||
@RequireService(HazelcastInstance.class)
|
||||
},
|
||||
provides = {
|
||||
@ProvideService(EventHandler.class)
|
||||
})
|
||||
public class Activator extends BaseActivator implements ServiceProvider, MembershipListener {
|
||||
|
||||
private static final String CLASSIFIER_BUNDLE = "bundle";
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger(BaseActivator.class);
|
||||
|
||||
private LocalBundleEventHandler bundleEventHandler;
|
||||
|
||||
private LocalTopicConsumer consumer;
|
||||
private static final String CLASSIFIER_BUNDLE = "bundle";
|
||||
|
||||
private LocalEventHandlerRegistryDispatcher dispatcher;
|
||||
|
||||
private LocalHandlerRegistry handlerRegistry;
|
||||
|
||||
private ClusterManager clusterManager;
|
||||
|
||||
private GroupManager groupManager;
|
||||
|
||||
private HazelcastInstance hazelcastInstance;
|
||||
|
||||
private Map<String, PersistenceManager> managers = new ConcurrentHashMap<>();
|
||||
|
||||
@Override
|
||||
protected void doStart() throws Exception {
|
||||
private static final String CLASSIFIER_CONFIG = "config";
|
||||
|
||||
private static final String CLASSIFIER_REPOSITORY = "repository";
|
||||
|
||||
private static final String CLASSIFIER_FEATURE = "feature";
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger(BaseActivator.class);
|
||||
|
||||
private LocalBundleEventHandler bundleEventHandler;
|
||||
|
||||
private LocalConfigurationEventHandler configEventHandler;
|
||||
|
||||
private LocalRepositoryEventHandler repositoryEventHandler;
|
||||
|
||||
private LocalFeaturesEventHandler featuresEventHandler;
|
||||
|
||||
private LocalTopicConsumer consumer;
|
||||
|
||||
private LocalEventHandlerRegistryDispatcher dispatcher;
|
||||
|
||||
private LocalHandlerRegistry handlerRegistry;
|
||||
|
||||
private ClusterManager clusterManager;
|
||||
|
||||
private GroupManager groupManager;
|
||||
|
||||
private HazelcastInstance hazelcastInstance;
|
||||
|
||||
private Map<String, PersistenceManager> managers = new ConcurrentHashMap<>();
|
||||
|
||||
@Override
|
||||
protected void doStart() throws Exception {
|
||||
clusterManager = getTrackedService(ClusterManager.class);
|
||||
if (clusterManager == null)
|
||||
return;
|
||||
@ -105,23 +120,21 @@ public class Activator extends BaseActivator implements ServiceProvider, Members
|
||||
FeaturesService featuresService = getTrackedService(FeaturesService.class);
|
||||
if (featuresService == null)
|
||||
return;
|
||||
|
||||
|
||||
hazelcastInstance = getTrackedService(HazelcastInstance.class);
|
||||
if (hazelcastInstance == null)
|
||||
return;
|
||||
return;
|
||||
|
||||
handlerRegistry = new LocalHandlerRegistry<>();
|
||||
|
||||
|
||||
/*
|
||||
* bundle management
|
||||
*/
|
||||
|
||||
PersistenceManager<BundleState> bundlePersistenceManager = new PersistenceManager<>(this
|
||||
, Constants.BUNDLE_MAP
|
||||
, CLASSIFIER_BUNDLE
|
||||
, BundleState.class);
|
||||
|
||||
PersistenceManager<BundleState> bundlePersistenceManager =
|
||||
new PersistenceManager<>(this, Constants.BUNDLE_MAP, CLASSIFIER_BUNDLE, BundleState.class);
|
||||
this.managers.put(CLASSIFIER_BUNDLE, bundlePersistenceManager);
|
||||
|
||||
|
||||
bundleEventHandler = new LocalBundleEventHandler();
|
||||
bundleEventHandler.setConfigurationAdmin(configurationAdmin);
|
||||
bundleEventHandler.setClusterManager(clusterManager);
|
||||
@ -131,26 +144,79 @@ public class Activator extends BaseActivator implements ServiceProvider, Members
|
||||
bundleEventHandler.setPersistenceManager(bundlePersistenceManager);
|
||||
bundleEventHandler.init();
|
||||
handlerRegistry.addHandler(bundleEventHandler);
|
||||
|
||||
|
||||
/*
|
||||
* config management
|
||||
*/
|
||||
|
||||
PersistenceManager<Properties> configPersistenceManager =
|
||||
new PersistenceManager<>(this, org.apache.karaf.cellar.config.Constants.CONFIGURATION_MAP,
|
||||
CLASSIFIER_CONFIG, Properties.class);
|
||||
this.managers.put(CLASSIFIER_CONFIG, configPersistenceManager);
|
||||
|
||||
configEventHandler = new LocalConfigurationEventHandler();
|
||||
configEventHandler.setConfigurationAdmin(configurationAdmin);
|
||||
configEventHandler.setClusterManager(clusterManager);
|
||||
configEventHandler.setGroupManager(groupManager);
|
||||
configEventHandler.setPersistenceManager(configPersistenceManager);
|
||||
configEventHandler.init();
|
||||
handlerRegistry.addHandler(configEventHandler);
|
||||
|
||||
/*
|
||||
* feature repository management
|
||||
*/
|
||||
|
||||
PersistenceManager<String> repositoryPersistenceManager = new PersistenceManager<>(
|
||||
this,
|
||||
org.apache.karaf.cellar.features.Constants.REPOSITORIES_MAP,
|
||||
CLASSIFIER_REPOSITORY,
|
||||
String.class);
|
||||
this.managers.put(CLASSIFIER_REPOSITORY, repositoryPersistenceManager);
|
||||
|
||||
repositoryEventHandler = new LocalRepositoryEventHandler();
|
||||
repositoryEventHandler.setConfigurationAdmin(configurationAdmin);
|
||||
repositoryEventHandler.setClusterManager(clusterManager);
|
||||
repositoryEventHandler.setGroupManager(groupManager);
|
||||
repositoryEventHandler.setFeaturesService(featuresService);
|
||||
repositoryEventHandler.setPersistenceManager(repositoryPersistenceManager);
|
||||
repositoryEventHandler.init(bundleContext);
|
||||
handlerRegistry.addHandler(repositoryEventHandler);
|
||||
|
||||
/*
|
||||
* feature management
|
||||
*/
|
||||
// TODO
|
||||
|
||||
PersistenceManager<FeatureState> featurePersistenceManager = new PersistenceManager<>(
|
||||
this,
|
||||
org.apache.karaf.cellar.features.Constants.FEATURES_MAP,
|
||||
CLASSIFIER_FEATURE,
|
||||
FeatureState.class);
|
||||
this.managers.put(CLASSIFIER_FEATURE, featurePersistenceManager);
|
||||
|
||||
featuresEventHandler = new LocalFeaturesEventHandler();
|
||||
featuresEventHandler.setConfigurationAdmin(configurationAdmin);
|
||||
featuresEventHandler.setClusterManager(clusterManager);
|
||||
featuresEventHandler.setGroupManager(groupManager);
|
||||
featuresEventHandler.setFeaturesService(featuresService);
|
||||
featuresEventHandler.setPersistenceManager(featurePersistenceManager);
|
||||
featuresEventHandler.init(bundleContext);
|
||||
handlerRegistry.addHandler(featuresEventHandler);
|
||||
|
||||
repositoryPersistenceManager.addDependent(featurePersistenceManager);
|
||||
|
||||
/*
|
||||
* kar management
|
||||
*/
|
||||
// TODO
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* common services
|
||||
*/
|
||||
|
||||
|
||||
dispatcher = new LocalEventHandlerRegistryDispatcher<>();
|
||||
dispatcher.setHandlerRegistry(handlerRegistry);
|
||||
dispatcher.init();
|
||||
|
||||
|
||||
consumer = new LocalTopicConsumer();
|
||||
consumer.setInstance(hazelcastInstance);
|
||||
consumer.setDispatcher(dispatcher);
|
||||
@ -158,76 +224,77 @@ public class Activator extends BaseActivator implements ServiceProvider, Members
|
||||
consumer.setConfigurationAdmin(configurationAdmin);
|
||||
consumer.init();
|
||||
|
||||
|
||||
|
||||
if (iAmAlone()) {
|
||||
restoreAll();
|
||||
restoreAll();
|
||||
}
|
||||
consumer.start();
|
||||
consumer.start();
|
||||
|
||||
}
|
||||
|
||||
protected void checkStartStopConsumer() {
|
||||
if (iAmAlone())
|
||||
consumer.start();
|
||||
else
|
||||
consumer.stop();
|
||||
}
|
||||
}
|
||||
|
||||
protected void restoreAll() {
|
||||
for (PersistenceManager pm: managers.values())
|
||||
pm.restore();
|
||||
}
|
||||
|
||||
protected void persistAll() {
|
||||
for (PersistenceManager pm: managers.values())
|
||||
pm.persist();
|
||||
}
|
||||
|
||||
protected boolean iAmAlone() {
|
||||
if (hazelcastInstance.getCluster().getMembers().size()>1)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doStop() {
|
||||
// TODO Auto-generated method stub
|
||||
super.doStop();
|
||||
}
|
||||
protected void checkStartStopConsumer() {
|
||||
if (iAmAlone())
|
||||
consumer.start();
|
||||
else
|
||||
consumer.stop();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClusterManager getClusterManager() {
|
||||
return clusterManager;
|
||||
}
|
||||
protected void restoreAll() {
|
||||
for (PersistenceManager pm : managers.values())
|
||||
pm.restore();
|
||||
}
|
||||
|
||||
@Override
|
||||
public GroupManager getGroupManager() {
|
||||
return groupManager;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void memberAdded(MembershipEvent membershipEvent) {
|
||||
Member member = membershipEvent.getMember();
|
||||
Member local = hazelcastInstance.getCluster().getLocalMember();
|
||||
checkStartStopConsumer();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void memberAttributeChanged(MemberAttributeEvent event) {
|
||||
// TODO Auto-generated method stub
|
||||
}
|
||||
|
||||
@Override
|
||||
public void memberRemoved(MembershipEvent membershipEvent) {
|
||||
Member member = membershipEvent.getMember();
|
||||
Member local = hazelcastInstance.getCluster().getLocalMember();
|
||||
if (member.equals(local))
|
||||
consumer.stop();
|
||||
else if (iAmAlone()) {
|
||||
// all other nodes gone
|
||||
persistAll();
|
||||
consumer.start();
|
||||
}
|
||||
|
||||
}
|
||||
protected void persistAll() {
|
||||
for (PersistenceManager pm : managers.values())
|
||||
pm.persist();
|
||||
}
|
||||
|
||||
protected boolean iAmAlone() {
|
||||
if (hazelcastInstance.getCluster().getMembers().size() > 1)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doStop() {
|
||||
if (consumer != null)
|
||||
consumer.stop();
|
||||
super.doStop();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClusterManager getClusterManager() {
|
||||
return clusterManager;
|
||||
}
|
||||
|
||||
@Override
|
||||
public GroupManager getGroupManager() {
|
||||
return groupManager;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void memberAdded(MembershipEvent membershipEvent) {
|
||||
Member member = membershipEvent.getMember();
|
||||
Member local = hazelcastInstance.getCluster().getLocalMember();
|
||||
checkStartStopConsumer();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void memberAttributeChanged(MemberAttributeEvent event) {
|
||||
// TODO Auto-generated method stub
|
||||
}
|
||||
|
||||
@Override
|
||||
public void memberRemoved(MembershipEvent membershipEvent) {
|
||||
Member member = membershipEvent.getMember();
|
||||
Member local = hazelcastInstance.getCluster().getLocalMember();
|
||||
if (member.equals(local))
|
||||
consumer.stop();
|
||||
else if (iAmAlone()) {
|
||||
// all other nodes gone
|
||||
persistAll();
|
||||
consumer.start();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -2,7 +2,7 @@
|
||||
* ~~~~~~licensing~~~~~~
|
||||
* cluster-persistence-service
|
||||
* ==========
|
||||
* Copyright (C) 2020 - 2023 EmDev LLC
|
||||
* Copyright (C) 2020 - 2024 EmDev LLC
|
||||
* ==========
|
||||
* You may not use this file except in accordance with the License Terms of the Copyright
|
||||
* Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
|
||||
@ -24,22 +24,21 @@
|
||||
* ~~~~~~/licensing~~~~~~
|
||||
*/
|
||||
/*
|
||||
* 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
|
||||
* 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
|
||||
* 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.
|
||||
* 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 ru.entaxy.esb.platform.core.cluster.persistence.handler;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.karaf.cellar.bundle.BundleEventHandler;
|
||||
import org.apache.karaf.cellar.bundle.BundleState;
|
||||
import org.apache.karaf.cellar.bundle.BundleSupport;
|
||||
import org.apache.karaf.cellar.bundle.ClusterBundleEvent;
|
||||
import org.apache.karaf.cellar.bundle.Constants;
|
||||
@ -50,19 +49,13 @@ import org.apache.karaf.cellar.core.control.SwitchStatus;
|
||||
import org.apache.karaf.cellar.core.event.EventHandler;
|
||||
import org.apache.karaf.cellar.core.event.EventType;
|
||||
import org.apache.karaf.features.Feature;
|
||||
import org.osgi.framework.Bundle;
|
||||
import org.osgi.framework.BundleException;
|
||||
import org.osgi.framework.wiring.FrameworkWiring;
|
||||
import org.osgi.service.cm.Configuration;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import ru.entaxy.esb.platform.core.cluster.persistence.PersistenceManager;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* The BundleEventHandler is responsible to process received cluster event for bundles.
|
||||
*/
|
||||
@ -75,7 +68,7 @@ public class LocalBundleEventHandler extends BundleSupport implements EventHandl
|
||||
private final Switch eventSwitch = new BasicSwitch(SWITCH_ID);
|
||||
|
||||
private PersistenceManager persistenceManager;
|
||||
|
||||
|
||||
/**
|
||||
* Handle received bundle cluster events.
|
||||
*
|
||||
@ -91,20 +84,22 @@ public class LocalBundleEventHandler extends BundleSupport implements EventHandl
|
||||
}
|
||||
|
||||
if (groupManager == null) {
|
||||
//in rare cases for example right after installation this happens!
|
||||
log.error("CELLAR BUNDLE: retrieved event {} while groupManager is not available yet!", event);
|
||||
return;
|
||||
// in rare cases for example right after installation this happens!
|
||||
log.error("CELLAR BUNDLE: retrieved event {} while groupManager is not available yet!", event);
|
||||
return;
|
||||
}
|
||||
|
||||
// check if the group is local
|
||||
if (!groupManager.isLocalGroup(event.getSourceGroup().getName())) {
|
||||
log.debug("CELLAR BUNDLE: node is not part of the event cluster group {}", event.getSourceGroup().getName());
|
||||
log.debug("CELLAR BUNDLE: node is not part of the event cluster group {}",
|
||||
event.getSourceGroup().getName());
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
// check if it's not a "local" event
|
||||
if (event.getLocal() != null && event.getLocal().getId().equalsIgnoreCase(clusterManager.getNode().getId())) {
|
||||
if (event.getLocal() != null
|
||||
&& event.getLocal().getId().equalsIgnoreCase(clusterManager.getNode().getId())) {
|
||||
log.trace("CELLAR BUNDLE: cluster event is local (coming from local synchronizer or listener)");
|
||||
return;
|
||||
}
|
||||
@ -114,21 +109,25 @@ public class LocalBundleEventHandler extends BundleSupport implements EventHandl
|
||||
List<Feature> matchingFeatures = retrieveFeature(event.getLocation());
|
||||
for (Feature feature : matchingFeatures) {
|
||||
if (!isAllowed(event.getSourceGroup(), "feature", feature.getName(), EventType.INBOUND)) {
|
||||
log.trace("CELLAR BUNDLE: bundle {} is contained in feature {} marked BLOCKED INBOUND for cluster group {}", event.getLocation(), feature.getName(), event.getSourceGroup().getName());
|
||||
log.trace(
|
||||
"CELLAR BUNDLE: bundle {} is contained in feature {} marked BLOCKED INBOUND for cluster group {}",
|
||||
event.getLocation(), feature.getName(), event.getSourceGroup().getName());
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// TODO mark cluster state as needed to be saved
|
||||
log.info("-->> WE NEED TO SAVE CLUSTER STATE");
|
||||
log.debug("-->> WE NEED TO SAVE CLUSTER STATE");
|
||||
this.persistenceManager.updated();
|
||||
|
||||
|
||||
} else
|
||||
log.trace("CELLAR BUNDLE: bundle {} is marked BLOCKED INBOUND for cluster group {}", event.getSymbolicName(), event.getSourceGroup().getName());
|
||||
log.trace("CELLAR BUNDLE: bundle {} is marked BLOCKED INBOUND for cluster group {}",
|
||||
event.getSymbolicName(), event.getSourceGroup().getName());
|
||||
} catch (BundleException e) {
|
||||
log.error("CELLAR BUNDLE: failed to install bundle {}/{}.", new Object[]{event.getSymbolicName(), event.getVersion()}, e);
|
||||
log.error("CELLAR BUNDLE: failed to install bundle {}/{}.",
|
||||
new Object[] {event.getSymbolicName(), event.getVersion()}, e);
|
||||
} catch (Exception e) {
|
||||
log.error("CELLAR BUNDLE: failed to handle bundle event", e);
|
||||
log.error("CELLAR BUNDLE: failed to handle bundle event", e);
|
||||
}
|
||||
}
|
||||
|
||||
@ -151,9 +150,9 @@ public class LocalBundleEventHandler extends BundleSupport implements EventHandl
|
||||
try {
|
||||
Configuration configuration = configurationAdmin.getConfiguration(Configurations.NODE, null);
|
||||
if (configuration != null) {
|
||||
Boolean status = new Boolean((String) configuration.getProperties().get(Configurations.HANDLER
|
||||
+ "."
|
||||
+ BundleEventHandler.class.getName()));
|
||||
Boolean status = new Boolean((String) configuration.getProperties().get(Configurations.HANDLER
|
||||
+ "."
|
||||
+ BundleEventHandler.class.getName()));
|
||||
if (status) {
|
||||
eventSwitch.turnOn();
|
||||
} else {
|
||||
@ -165,12 +164,12 @@ public class LocalBundleEventHandler extends BundleSupport implements EventHandl
|
||||
}
|
||||
return eventSwitch;
|
||||
}
|
||||
|
||||
public void setPersistenceManager(PersistenceManager persistenceManager) {
|
||||
this.persistenceManager = persistenceManager;
|
||||
}
|
||||
|
||||
/**
|
||||
public void setPersistenceManager(PersistenceManager persistenceManager) {
|
||||
this.persistenceManager = persistenceManager;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the cluster event type.
|
||||
*
|
||||
* @return the cluster bundle event type.
|
||||
|
@ -2,7 +2,7 @@
|
||||
* ~~~~~~licensing~~~~~~
|
||||
* cluster-persistence-service
|
||||
* ==========
|
||||
* Copyright (C) 2020 - 2023 EmDev LLC
|
||||
* Copyright (C) 2020 - 2024 EmDev LLC
|
||||
* ==========
|
||||
* You may not use this file except in accordance with the License Terms of the Copyright
|
||||
* Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
|
||||
@ -24,17 +24,15 @@
|
||||
* ~~~~~~/licensing~~~~~~
|
||||
*/
|
||||
/*
|
||||
* 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
|
||||
* 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
|
||||
* 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.
|
||||
* 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 ru.entaxy.esb.platform.core.cluster.persistence.handler;
|
||||
|
||||
@ -103,7 +101,7 @@ public class LocalEventDispatchTask<E extends Event> implements Runnable {
|
||||
}
|
||||
}
|
||||
if (!dispatched) {
|
||||
LOGGER.warn("Failed to retrieve handler for cluster event {}", event.getClass());
|
||||
LOGGER.trace("Failed to retrieve handler for cluster event {}", event.getClass());
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
LOGGER.error("Error while dispatching task", ex);
|
||||
|
@ -2,7 +2,7 @@
|
||||
* ~~~~~~licensing~~~~~~
|
||||
* cluster-persistence-service
|
||||
* ==========
|
||||
* Copyright (C) 2020 - 2023 EmDev LLC
|
||||
* Copyright (C) 2020 - 2024 EmDev LLC
|
||||
* ==========
|
||||
* You may not use this file except in accordance with the License Terms of the Copyright
|
||||
* Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
|
||||
|
@ -2,7 +2,7 @@
|
||||
* ~~~~~~licensing~~~~~~
|
||||
* cluster-persistence-service
|
||||
* ==========
|
||||
* Copyright (C) 2020 - 2023 EmDev LLC
|
||||
* Copyright (C) 2020 - 2024 EmDev LLC
|
||||
* ==========
|
||||
* You may not use this file except in accordance with the License Terms of the Copyright
|
||||
* Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
|
||||
|
@ -2,7 +2,7 @@
|
||||
* ~~~~~~licensing~~~~~~
|
||||
* cluster-persistence-service
|
||||
* ==========
|
||||
* Copyright (C) 2020 - 2023 EmDev LLC
|
||||
* Copyright (C) 2020 - 2024 EmDev LLC
|
||||
* ==========
|
||||
* You may not use this file except in accordance with the License Terms of the Copyright
|
||||
* Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
|
||||
|
Reference in New Issue
Block a user