mirror of
https://github.com/Alfresco/alfresco-transform-core.git
synced 2025-08-14 17:58:27 +00:00
Improved logging about transformers on registry refresh
This commit is contained in:
@@ -33,11 +33,11 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
public class CustomTransformers
|
public class CustomTransformers
|
||||||
@@ -57,13 +57,20 @@ public class CustomTransformers
|
|||||||
customTransformers.forEach(customTransformer ->
|
customTransformers.forEach(customTransformer ->
|
||||||
customTransformersByName.put(customTransformer.getTransformerName(), customTransformer));
|
customTransformersByName.put(customTransformer.getTransformerName(), customTransformer));
|
||||||
|
|
||||||
logger.info("Transformers:");
|
List<String> nonNullTransformerNames = customTransformers.stream()
|
||||||
customTransformers.stream()
|
.map(CustomTransformer::getTransformerName)
|
||||||
.sorted(Comparator.comparing(CustomTransformer::getTransformerName))
|
.filter(Objects::nonNull)
|
||||||
.map(customTransformer -> customTransformer.getTransformerName())
|
.collect(Collectors.toList());
|
||||||
.filter(Objects::nonNull)
|
|
||||||
.map(name -> " "+name)
|
if (!nonNullTransformerNames.isEmpty())
|
||||||
.forEach(logger::info);
|
{
|
||||||
|
logger.info("Custom Transformers:");
|
||||||
|
nonNullTransformerNames
|
||||||
|
.stream()
|
||||||
|
.sorted()
|
||||||
|
.map(name -> " "+name)
|
||||||
|
.forEach(logger::debug);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,4 +84,9 @@ public class CustomTransformers
|
|||||||
{
|
{
|
||||||
customTransformersByName.put(name, customTransformer);
|
customTransformersByName.put(name, customTransformer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<CustomTransformer> toList()
|
||||||
|
{
|
||||||
|
return customTransformers;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -25,6 +25,7 @@
|
|||||||
*/
|
*/
|
||||||
package org.alfresco.transform.base.registry;
|
package org.alfresco.transform.base.registry;
|
||||||
|
|
||||||
|
import org.alfresco.transform.base.CustomTransformer;
|
||||||
import org.alfresco.transform.config.TransformConfig;
|
import org.alfresco.transform.config.TransformConfig;
|
||||||
import org.alfresco.transform.config.TransformOption;
|
import org.alfresco.transform.config.TransformOption;
|
||||||
import org.alfresco.transform.config.TransformOptionGroup;
|
import org.alfresco.transform.config.TransformOptionGroup;
|
||||||
@@ -34,6 +35,7 @@ import org.alfresco.transform.registry.AbstractTransformRegistry;
|
|||||||
import org.alfresco.transform.registry.CombinedTransformConfig;
|
import org.alfresco.transform.registry.CombinedTransformConfig;
|
||||||
import org.alfresco.transform.registry.Origin;
|
import org.alfresco.transform.registry.Origin;
|
||||||
import org.alfresco.transform.registry.TransformCache;
|
import org.alfresco.transform.registry.TransformCache;
|
||||||
|
import org.alfresco.transform.registry.TransformerType;
|
||||||
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;
|
||||||
@@ -48,7 +50,9 @@ import org.springframework.scheduling.annotation.Async;
|
|||||||
import org.springframework.scheduling.annotation.Scheduled;
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
@@ -58,6 +62,7 @@ import java.util.Set;
|
|||||||
import java.util.concurrent.locks.ReadWriteLock;
|
import java.util.concurrent.locks.ReadWriteLock;
|
||||||
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
import static java.util.Collections.emptyMap;
|
import static java.util.Collections.emptyMap;
|
||||||
@@ -65,6 +70,8 @@ import static java.util.Objects.isNull;
|
|||||||
import static java.util.stream.Collectors.toUnmodifiableMap;
|
import static java.util.stream.Collectors.toUnmodifiableMap;
|
||||||
import static java.util.stream.Collectors.toUnmodifiableSet;
|
import static java.util.stream.Collectors.toUnmodifiableSet;
|
||||||
import static org.alfresco.transform.config.CoreVersionDecorator.setCoreVersionOnSingleStepTransformers;
|
import static org.alfresco.transform.config.CoreVersionDecorator.setCoreVersionOnSingleStepTransformers;
|
||||||
|
import static org.alfresco.transform.registry.TransformerType.FAILOVER_TRANSFORMER;
|
||||||
|
import static org.alfresco.transform.registry.TransformerType.PIPELINE_TRANSFORMER;
|
||||||
import static org.springframework.util.CollectionUtils.isEmpty;
|
import static org.springframework.util.CollectionUtils.isEmpty;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@@ -79,6 +86,9 @@ public class TransformRegistry extends AbstractTransformRegistry
|
|||||||
@Value("${container.isTRouter}")
|
@Value("${container.isTRouter}")
|
||||||
private boolean isTRouter;
|
private boolean isTRouter;
|
||||||
|
|
||||||
|
// Not autowired - avoids a circular reference in the router - initialised on startup event
|
||||||
|
private List<CustomTransformer> customTransformers;
|
||||||
|
|
||||||
private static class Data extends TransformCache
|
private static class Data extends TransformCache
|
||||||
{
|
{
|
||||||
private TransformConfig transformConfig;
|
private TransformConfig transformConfig;
|
||||||
@@ -126,7 +136,7 @@ public class TransformRegistry extends AbstractTransformRegistry
|
|||||||
{
|
{
|
||||||
final ApplicationContext context = event.getApplicationContext();
|
final ApplicationContext context = event.getApplicationContext();
|
||||||
// the local "initEngineConfigs" method has to be called through the Spring proxy
|
// the local "initEngineConfigs" method has to be called through the Spring proxy
|
||||||
context.getBean(TransformRegistry.class).initRegistryOnAppStartup(null);
|
context.getBean(TransformRegistry.class).initRegistryOnAppStartup(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -139,12 +149,14 @@ public class TransformRegistry extends AbstractTransformRegistry
|
|||||||
backoff = @Backoff(delayExpression = "#{${transform.engine.config.retry.timeout} * 1000}"))
|
backoff = @Backoff(delayExpression = "#{${transform.engine.config.retry.timeout} * 1000}"))
|
||||||
void initRegistryOnAppStartup(final ContextRefreshedEvent event)
|
void initRegistryOnAppStartup(final ContextRefreshedEvent event)
|
||||||
{
|
{
|
||||||
|
customTransformers = event.getApplicationContext().getBean(CustomTransformers.class).toList();
|
||||||
retrieveConfig();
|
retrieveConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Recovery method in case all the retries fail. If not specified, the @Retryable method will cause the application
|
* Recovery method in case all the retries fail. If not specified, the @Retryable method will cause the application
|
||||||
* to stop.
|
* to stop, which we don't want as the t-engine issue may have been sorted out in an hour when the next scheduled
|
||||||
|
* try is made.
|
||||||
*/
|
*/
|
||||||
@Recover
|
@Recover
|
||||||
void recover(IllegalStateException e)
|
void recover(IllegalStateException e)
|
||||||
@@ -180,6 +192,60 @@ public class TransformRegistry extends AbstractTransformRegistry
|
|||||||
TransformConfig transformConfig = combinedTransformConfig.buildTransformConfig();
|
TransformConfig transformConfig = combinedTransformConfig.buildTransformConfig();
|
||||||
Map<String, Origin<Transformer>> transformerByNameMap = combinedTransformConfig.getTransformerByNameMap();
|
Map<String, Origin<Transformer>> transformerByNameMap = combinedTransformConfig.getTransformerByNameMap();
|
||||||
concurrentUpdate(combinedTransformConfig, uncombinedTransformConfig, transformConfig, transformerByNameMap);
|
concurrentUpdate(combinedTransformConfig, uncombinedTransformConfig, transformConfig, transformerByNameMap);
|
||||||
|
|
||||||
|
logTransformers(uncombinedTransformConfig, combinedTransformConfig, transformerByNameMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void logTransformers(TransformConfig uncombinedTransformConfig, CombinedTransformConfig combinedTransformConfig,
|
||||||
|
Map<String, Origin<Transformer>> transformerByNameMap)
|
||||||
|
{
|
||||||
|
if (logger.isInfoEnabled())
|
||||||
|
{
|
||||||
|
Set<String> customTransformerNames = new HashSet(customTransformers == null
|
||||||
|
? Collections.emptySet()
|
||||||
|
: customTransformers.stream().map(CustomTransformer::getTransformerName).collect(Collectors.toSet()));
|
||||||
|
List<String> nonNullTransformerNames = uncombinedTransformConfig.getTransformers().stream()
|
||||||
|
.map(Transformer::getTransformerName)
|
||||||
|
.filter(Objects::nonNull)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
if (!nonNullTransformerNames.isEmpty())
|
||||||
|
{
|
||||||
|
logger.info("Transformers (" + nonNullTransformerNames.size() + "):");
|
||||||
|
nonNullTransformerNames
|
||||||
|
.stream()
|
||||||
|
.sorted()
|
||||||
|
.map(name -> {
|
||||||
|
Origin<Transformer> transformerOrigin = transformerByNameMap.get(name);
|
||||||
|
String message = " " + name + (transformerOrigin == null
|
||||||
|
? " -- unavailable: missing transform steps"
|
||||||
|
: isTRouter
|
||||||
|
? ""
|
||||||
|
: TransformerType.valueOf(transformerOrigin.get()) == PIPELINE_TRANSFORMER
|
||||||
|
? " -- unavailable: pipeline only available via t-router"
|
||||||
|
: TransformerType.valueOf(transformerOrigin.get()) == FAILOVER_TRANSFORMER
|
||||||
|
? " -- unavailable: failover only available via t-router"
|
||||||
|
: !customTransformerNames.contains(name)
|
||||||
|
? " -- missing: CustomTransformer"
|
||||||
|
: "");
|
||||||
|
customTransformerNames.remove(name);
|
||||||
|
return message;
|
||||||
|
})
|
||||||
|
.forEach(logger::info);
|
||||||
|
|
||||||
|
List<String> unusedCustomTransformNames = customTransformerNames.stream()
|
||||||
|
.filter(Objects::nonNull)
|
||||||
|
.sorted()
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
if (!unusedCustomTransformNames.isEmpty())
|
||||||
|
{
|
||||||
|
logger.info("Unused CustomTransformers (" + unusedCustomTransformNames.size() + " - name is not in the transform config):");
|
||||||
|
unusedCustomTransformNames
|
||||||
|
.stream()
|
||||||
|
.map(name -> " " + name)
|
||||||
|
.forEach(logger::info);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public TransformConfig getTransformConfig()
|
public TransformConfig getTransformConfig()
|
||||||
|
@@ -33,12 +33,12 @@ import ch.qos.logback.classic.spi.ILoggingEvent;
|
|||||||
import ch.qos.logback.core.AppenderBase;
|
import ch.qos.logback.core.AppenderBase;
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
import org.alfresco.transform.base.sfs.SharedFileStoreClient;
|
|
||||||
import org.alfresco.transform.base.fakes.FakeTransformEngineWithTwoCustomTransformers;
|
import org.alfresco.transform.base.fakes.FakeTransformEngineWithTwoCustomTransformers;
|
||||||
import org.alfresco.transform.base.fakes.FakeTransformerPdf2Png;
|
import org.alfresco.transform.base.fakes.FakeTransformerPdf2Png;
|
||||||
import org.alfresco.transform.base.fakes.FakeTransformerTxT2Pdf;
|
import org.alfresco.transform.base.fakes.FakeTransformerTxT2Pdf;
|
||||||
import org.alfresco.transform.base.model.FileRefEntity;
|
import org.alfresco.transform.base.model.FileRefEntity;
|
||||||
import org.alfresco.transform.base.model.FileRefResponse;
|
import org.alfresco.transform.base.model.FileRefResponse;
|
||||||
|
import org.alfresco.transform.base.sfs.SharedFileStoreClient;
|
||||||
import org.alfresco.transform.base.transform.TransformHandler;
|
import org.alfresco.transform.base.transform.TransformHandler;
|
||||||
import org.alfresco.transform.client.model.TransformReply;
|
import org.alfresco.transform.client.model.TransformReply;
|
||||||
import org.alfresco.transform.client.model.TransformRequest;
|
import org.alfresco.transform.client.model.TransformRequest;
|
||||||
|
@@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015-2022 Alfresco Software, Ltd. All rights reserved.
|
||||||
|
*
|
||||||
|
* License rights for this program may be obtained from Alfresco Software, Ltd.
|
||||||
|
* pursuant to a written agreement and any use of this program without such an
|
||||||
|
* agreement is prohibited.
|
||||||
|
*/
|
||||||
|
package org.alfresco.transform.registry;
|
||||||
|
|
||||||
|
import org.alfresco.transform.config.Transformer;
|
||||||
|
|
||||||
|
public enum TransformerType
|
||||||
|
{
|
||||||
|
ENGINE_TRANSFORMER,
|
||||||
|
PIPELINE_TRANSFORMER,
|
||||||
|
FAILOVER_TRANSFORMER,
|
||||||
|
UNSUPPORTED_TRANSFORMER;
|
||||||
|
|
||||||
|
public static TransformerType valueOf(Transformer transformer)
|
||||||
|
{
|
||||||
|
if (transformer == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if ((transformer.getTransformerFailover() == null || transformer.getTransformerFailover().isEmpty()) &&
|
||||||
|
(transformer.getTransformerPipeline() == null || transformer.getTransformerPipeline().isEmpty()))
|
||||||
|
{
|
||||||
|
return ENGINE_TRANSFORMER;
|
||||||
|
}
|
||||||
|
if (transformer.getTransformerPipeline() != null && !transformer.getTransformerPipeline().isEmpty())
|
||||||
|
{
|
||||||
|
return PIPELINE_TRANSFORMER;
|
||||||
|
}
|
||||||
|
if (transformer.getTransformerFailover() != null && !transformer.getTransformerFailover().isEmpty())
|
||||||
|
{
|
||||||
|
return FAILOVER_TRANSFORMER;
|
||||||
|
}
|
||||||
|
|
||||||
|
return UNSUPPORTED_TRANSFORMER;
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user