refactored to scheduled execution; not event driven

This commit is contained in:
2024-04-16 14:50:19 -04:00
parent eda288f6ca
commit 188059e0f3
6 changed files with 51 additions and 208 deletions

View File

@@ -1,33 +0,0 @@
/*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.inteligr8.alfresco.activiti.share;
import org.activiti.engine.delegate.event.ActivitiEntityEvent;
import org.activiti.engine.delegate.event.ActivitiEvent;
import org.activiti.engine.delegate.event.ActivitiEventListener;
import org.activiti.engine.delegate.event.ActivitiEventType;
import org.activiti.engine.impl.persistence.entity.Entity;
public interface ActivitiEntityEventListener extends ActivitiEventListener {
@Override
default void onEvent(ActivitiEvent event) {
ActivitiEntityEvent eevent = (ActivitiEntityEvent) event;
this.onEntityEvent(event.getType(), (Entity) eevent.getEntity());
}
void onEntityEvent(ActivitiEventType eventType, Entity entity);
}

View File

@@ -1,61 +0,0 @@
/*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.inteligr8.alfresco.activiti.share;
import java.util.List;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.delegate.event.ActivitiEvent;
import org.activiti.engine.repository.Model;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class EngineStartEventListener extends NoFailActivitiEventListener {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Value("${inteligr8.modelShareExtension.modelChunkSize:50}")
private int modelChunkSize;
@Autowired
private ProcessEngine services;
@Autowired
private ModelShareWorker shareWorker;
@Override
public void onEvent(ActivitiEvent event) {
this.logger.info("Starting to query all models to share all of them");
int page = 1;
int perPage = this.modelChunkSize;
List<Model> models = this.services.getRepositoryService().createModelQuery().listPage((page-1)*perPage, perPage);
while (!models.isEmpty()) {
for (Model model : models) {
this.logger.debug("Discovered model: {}: {}: {}", model.getCategory(), model.getId(), model.getName());
this.shareWorker.share(model);
}
page++;
models = this.services.getRepositoryService().createModelQuery().listPage((page-1)*perPage, perPage);
}
}
}

View File

@@ -1,55 +0,0 @@
/*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.inteligr8.alfresco.activiti.share;
import org.activiti.engine.delegate.event.ActivitiEventType;
import org.activiti.engine.impl.persistence.entity.Entity;
import org.activiti.engine.impl.persistence.entity.ModelEntity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class ModelEntityEventListener extends NoFailActivitiEventListener implements ActivitiEntityEventListener {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private ModelShareWorker shareWorker;
@Override
public void onEntityEvent(ActivitiEventType eventType, Entity entity) {
this.validate(eventType);
if (entity instanceof ModelEntity) {
ModelEntity mentity = (ModelEntity) entity;
this.logger.debug("Caught model event: {}: {}: {}: {}", mentity.getCategory(), entity.getId(), mentity.getKey(), mentity.getName());
this.shareWorker.share(mentity);
} else {
this.logger.trace("Ignoring entity type: {}", entity.getClass());
}
}
private void validate(ActivitiEventType eventType) {
switch (eventType) {
case ENTITY_CREATED:
break;
default:
throw new IllegalArgumentException();
}
}
}

View File

@@ -14,12 +14,11 @@
*/ */
package com.inteligr8.alfresco.activiti.share; package com.inteligr8.alfresco.activiti.share;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.delegate.event.ActivitiEventType;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@Component @Component
@@ -28,43 +27,31 @@ public class ModelShareExtension implements Bootstrappable {
private final Logger logger = LoggerFactory.getLogger(this.getClass()); private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired @Autowired
private ProcessEngine services; private ModelShareWorker worker;
@Autowired @Value("${inteligr8.modelShareExtension.enabled:true}")
private ModelEntityEventListener entityListener; private boolean enabled;
@Autowired private boolean bootstrapped;
private EngineStartEventListener startupListener;
/**
* On startup, scan all models and share them according to the configuration defined elsewhere.
*/
@Value("${inteligr8.modelShareExtension.shareAllModelsOnStartup:false}")
private boolean shareAllModelsOnStartup;
@Override @Override
public void onBootstrap() { public void onBootstrap() {
this.logger.trace("onBootstrap()"); this.logger.trace("onBootstrap()");
this.registerListeners(); if (this.enabled) {
this.bootstrapped = true;
this.logger.info("Model Share Extension initialized"); this.logger.info("Model Share Extension initialized");
}
private void registerListeners() {
this.logger.info("registerListeners()");
this.services.getRuntimeService().addEventListener(
this.entityListener,
ActivitiEventType.ENTITY_CREATED);
if (this.shareAllModelsOnStartup) {
// we can't use ENGINE_CREATED as it has already been created
this.services.getRuntimeService().addEventListener(
this.startupListener,
ActivitiEventType.ENGINE_CREATED);
this.startupListener.onEvent(null);
} }
} }
// execute every 10 minutes
@Scheduled(fixedRate = 600000)
private void scheduled() {
if (!this.enabled || !this.bootstrapped)
return;
this.logger.trace("scheduled()");
this.worker.share();
}
} }

View File

@@ -24,6 +24,7 @@ import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Set; import java.util.Set;
import org.activiti.engine.ProcessEngine;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -47,6 +48,9 @@ public class ModelShareWorker implements Bootstrappable {
private final Logger logger = LoggerFactory.getLogger(this.getClass()); private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Value("${inteligr8.modelShareExtension.modelChunkSize:50}")
private int modelChunkSize;
@Value("${inteligr8.modelShareExtension.shareChunkSize:25}") @Value("${inteligr8.modelShareExtension.shareChunkSize:25}")
private int shareChunkSize; private int shareChunkSize;
@@ -74,6 +78,9 @@ public class ModelShareWorker implements Bootstrappable {
@Value("${inteligr8.modelShareExtension.groups.canWriteForms:#{null}}") @Value("${inteligr8.modelShareExtension.groups.canWriteForms:#{null}}")
private String writeFormDefsGroupNames; private String writeFormDefsGroupNames;
@Autowired
private ProcessEngine services;
@Autowired @Autowired
private ModelShareService shareService; private ModelShareService shareService;
@@ -199,6 +206,30 @@ public class ModelShareWorker implements Bootstrappable {
map.put(key, value); map.put(key, value);
} }
public void share() {
this.logger.trace("Discovering models ...");
long modelCount = 0L;
int page = 1;
int perPage = this.modelChunkSize;
List<org.activiti.engine.repository.Model> models = this.services.getRepositoryService().createModelQuery().listPage((page-1)*perPage, perPage);
while (!models.isEmpty()) {
this.logger.trace("Fetched page #{} of {} models", page, models.size());
for (org.activiti.engine.repository.Model model : models) {
this.logger.debug("Discovered model: {}: {}: {}", model.getCategory(), model.getId(), model.getName());
this.share(model);
}
modelCount += models.size();
page++;
models = this.services.getRepositoryService().createModelQuery().listPage((page-1)*perPage, perPage);
}
this.logger.trace("Discovered {} models", modelCount);
}
public void share(org.activiti.engine.repository.Model orgModel) { public void share(org.activiti.engine.repository.Model orgModel) {
Model model = (Model) this.modelService.getModel(Long.valueOf(orgModel.getId())); Model model = (Model) this.modelService.getModel(Long.valueOf(orgModel.getId()));
Map<HashableGroup, SharePermission> shares = this.fetchCurrentModelShares(model); Map<HashableGroup, SharePermission> shares = this.fetchCurrentModelShares(model);
@@ -268,8 +299,8 @@ public class ModelShareWorker implements Bootstrappable {
} }
private void share(Model model, HashableGroup group, SharePermission permission) { private void share(Model model, HashableGroup group, SharePermission permission) {
this.logger.debug("Sharing model with group: {}: {}: {}", model.getId(), model.getName(), group); this.logger.info("Sharing model with group: {}: {}: {}", model.getId(), model.getName(), group);
this.shareService.shareModelWithGroup(model, group.getGroup(), permission); this.shareService.shareModelWithGroup(model, group.getGroup(), permission).getShareDate();
} }
public void unshareAll(Model model) { public void unshareAll(Model model) {

View File

@@ -1,26 +0,0 @@
/*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.inteligr8.alfresco.activiti.share;
import org.activiti.engine.delegate.event.ActivitiEventListener;
public abstract class NoFailActivitiEventListener implements ActivitiEventListener {
@Override
public boolean isFailOnException() {
return false;
}
}