From 02c1a71ee63d70cc229619efbb8d70f8a747a65e Mon Sep 17 00:00:00 2001 From: Stefan Witschel Date: Tue, 29 Oct 2024 18:08:43 +0100 Subject: [PATCH] Adding virtual threads as default thread pool --- .../src/main/java/dynamic/mapping/App.java | 15 ++--- .../core/client/AConnectorClient.java | 8 +-- .../mapping/connector/kafka/KafkaClient.java | 2 +- .../mapping/connector/mqtt/MQTTClient.java | 2 +- .../connector/mqtt/MQTTServiceClient.java | 2 +- .../mapping/core/BootstrapService.java | 8 +-- .../java/dynamic/mapping/core/C8YAgent.java | 56 ------------------- .../mapping/core/ConfigurationRegistry.java | 8 +-- .../AsynchronousDispatcherInbound.java | 12 ++-- .../inbound/BasePayloadProcessorInbound.java | 6 +- .../AsynchronousDispatcherOutbound.java | 44 +++++++-------- .../BasePayloadProcessorOutbound.java | 9 ++- .../src/main/resources/application.properties | 1 + pom.xml | 2 +- 14 files changed, 54 insertions(+), 121 deletions(-) diff --git a/dynamic-mapping-service/src/main/java/dynamic/mapping/App.java b/dynamic-mapping-service/src/main/java/dynamic/mapping/App.java index 49b33309..e77264a2 100644 --- a/dynamic-mapping-service/src/main/java/dynamic/mapping/App.java +++ b/dynamic-mapping-service/src/main/java/dynamic/mapping/App.java @@ -27,6 +27,7 @@ import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.ThreadFactory; import dynamic.mapping.model.MappingTreeNode; import dynamic.mapping.model.MappingTreeNodeSerializer; @@ -98,17 +99,11 @@ public TaskExecutor taskExecutor() { executor.setQueueCapacity(25); return executor; } - //Assuming we can process 25 messages in parallel per CPU-Core - @Bean("processingCachePool") - public ExecutorService processingThreadPool() { - return Executors.newCachedThreadPool(); - //return Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*25); - } - //Assuming we can process 10 messages in parallel per CPU-Core - @Bean("cachedThreadPool") - public ExecutorService cachedThreadPool() { - return Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*10); + @Bean("virtThreadPool") + public ExecutorService virtThreadPool() { + final ThreadFactory factory = Thread.ofVirtual().name("virtThread-",0).factory(); + return Executors.newThreadPerTaskExecutor(factory); } @Bean diff --git a/dynamic-mapping-service/src/main/java/dynamic/mapping/connector/core/client/AConnectorClient.java b/dynamic-mapping-service/src/main/java/dynamic/mapping/connector/core/client/AConnectorClient.java index 11e9d6c5..cd31ee7f 100644 --- a/dynamic-mapping-service/src/main/java/dynamic/mapping/connector/core/client/AConnectorClient.java +++ b/dynamic-mapping-service/src/main/java/dynamic/mapping/connector/core/client/AConnectorClient.java @@ -121,7 +121,7 @@ public abstract class AConnectorClient { protected ConfigurationRegistry configurationRegistry; @Getter - protected ExecutorService cachedThreadPool; + protected ExecutorService virtThreadPool; private Future connectTask; private ScheduledExecutorService housekeepingExecutor = Executors @@ -170,7 +170,7 @@ public void submitInitialize() { // test if init task is still running, then we don't need to start another task log.debug("Tenant {} - Called initialize(): {}", tenant, initializeTask == null || initializeTask.isDone()); if ((initializeTask == null || initializeTask.isDone())) { - initializeTask = cachedThreadPool.submit(() -> initialize()); + initializeTask = virtThreadPool.submit(() -> initialize()); } } @@ -198,7 +198,7 @@ public void submitConnect() { log.debug("Tenant {} - Called connect(): connectTask.isDone() {}", tenant, connectTask == null || connectTask.isDone()); if (connectTask == null || connectTask.isDone()) { - connectTask = cachedThreadPool.submit(() -> connect()); + connectTask = virtThreadPool.submit(() -> connect()); } } @@ -209,7 +209,7 @@ public void submitDisconnect() { log.debug("Tenant {} - Called submitDisconnect(): connectTask.isDone() {}", tenant, connectTask == null || connectTask.isDone()); if (connectTask == null || connectTask.isDone()) { - connectTask = cachedThreadPool.submit(() -> disconnect()); + connectTask = virtThreadPool.submit(() -> disconnect()); } } diff --git a/dynamic-mapping-service/src/main/java/dynamic/mapping/connector/kafka/KafkaClient.java b/dynamic-mapping-service/src/main/java/dynamic/mapping/connector/kafka/KafkaClient.java index 609ee355..074e76de 100644 --- a/dynamic-mapping-service/src/main/java/dynamic/mapping/connector/kafka/KafkaClient.java +++ b/dynamic-mapping-service/src/main/java/dynamic/mapping/connector/kafka/KafkaClient.java @@ -143,7 +143,7 @@ public KafkaClient(ConfigurationRegistry configurationRegistry, this.connectorIdent = connectorConfiguration.ident; this.connectorStatus = ConnectorStatusEvent.unknown(connectorConfiguration.name, connectorConfiguration.ident); this.c8yAgent = configurationRegistry.getC8yAgent(); - this.cachedThreadPool = configurationRegistry.getCachedThreadPool(); + this.virtThreadPool = configurationRegistry.getVirtThreadPool(); this.objectMapper = configurationRegistry.getObjectMapper(); this.additionalSubscriptionIdTest = additionalSubscriptionIdTest; this.mappingServiceRepresentation = configurationRegistry.getMappingServiceRepresentations().get(tenant); diff --git a/dynamic-mapping-service/src/main/java/dynamic/mapping/connector/mqtt/MQTTClient.java b/dynamic-mapping-service/src/main/java/dynamic/mapping/connector/mqtt/MQTTClient.java index af7e8cc7..f8f792fa 100644 --- a/dynamic-mapping-service/src/main/java/dynamic/mapping/connector/mqtt/MQTTClient.java +++ b/dynamic-mapping-service/src/main/java/dynamic/mapping/connector/mqtt/MQTTClient.java @@ -126,7 +126,7 @@ public MQTTClient(ConfigurationRegistry configurationRegistry, this.connectorStatus = ConnectorStatusEvent.unknown(connectorConfiguration.name, connectorConfiguration.ident); // this.connectorType = connectorConfiguration.connectorType; this.c8yAgent = configurationRegistry.getC8yAgent(); - this.cachedThreadPool = configurationRegistry.getCachedThreadPool(); + this.virtThreadPool = configurationRegistry.getVirtThreadPool(); this.objectMapper = configurationRegistry.getObjectMapper(); this.additionalSubscriptionIdTest = additionalSubscriptionIdTest; this.mappingServiceRepresentation = configurationRegistry.getMappingServiceRepresentations().get(tenant); diff --git a/dynamic-mapping-service/src/main/java/dynamic/mapping/connector/mqtt/MQTTServiceClient.java b/dynamic-mapping-service/src/main/java/dynamic/mapping/connector/mqtt/MQTTServiceClient.java index 983f0841..87cc404a 100644 --- a/dynamic-mapping-service/src/main/java/dynamic/mapping/connector/mqtt/MQTTServiceClient.java +++ b/dynamic-mapping-service/src/main/java/dynamic/mapping/connector/mqtt/MQTTServiceClient.java @@ -100,7 +100,7 @@ public MQTTServiceClient(ConfigurationRegistry configurationRegistry, this.connectorName = connectorConfiguration.name; this.connectorStatus = ConnectorStatusEvent.unknown(connectorConfiguration.name, connectorConfiguration.ident); this.c8yAgent = configurationRegistry.getC8yAgent(); - this.cachedThreadPool = configurationRegistry.getCachedThreadPool(); + this.virtThreadPool = configurationRegistry.getVirtThreadPool(); this.objectMapper = configurationRegistry.getObjectMapper(); this.additionalSubscriptionIdTest = additionalSubscriptionIdTest; this.mappingServiceRepresentation = configurationRegistry.getMappingServiceRepresentations().get(tenant); diff --git a/dynamic-mapping-service/src/main/java/dynamic/mapping/core/BootstrapService.java b/dynamic-mapping-service/src/main/java/dynamic/mapping/core/BootstrapService.java index dceec8d0..9ef65a6f 100644 --- a/dynamic-mapping-service/src/main/java/dynamic/mapping/core/BootstrapService.java +++ b/dynamic-mapping-service/src/main/java/dynamic/mapping/core/BootstrapService.java @@ -65,12 +65,12 @@ public class BootstrapService { @Autowired ConnectorConfigurationComponent connectorConfigurationComponent; - @Qualifier("cachedThreadPool") - private ExecutorService cachedThreadPool; + @Qualifier("virtThreadPool") + private ExecutorService virtThreadPool; @Autowired - public void setCachedThreadPool(ExecutorService cachedThreadPool) { - this.cachedThreadPool = cachedThreadPool; + public void setVirtThreadPool(ExecutorService virtThreadPool) { + this.virtThreadPool = virtThreadPool; } @Value("${APP.additionalSubscriptionIdTest}") diff --git a/dynamic-mapping-service/src/main/java/dynamic/mapping/core/C8YAgent.java b/dynamic-mapping-service/src/main/java/dynamic/mapping/core/C8YAgent.java index 8c8a5ed7..2aad5fd9 100644 --- a/dynamic-mapping-service/src/main/java/dynamic/mapping/core/C8YAgent.java +++ b/dynamic-mapping-service/src/main/java/dynamic/mapping/core/C8YAgent.java @@ -331,62 +331,6 @@ public AConnectorClient.Certificate loadCertificateByName(String certificateName return null; } } - //TODO Change this to use ExecutorService + Virtual Threads when available - public CompletableFuture createMEAOAsync(ProcessingContext context) - throws ProcessingException { - return CompletableFuture.supplyAsync(() -> { - String tenant = context.getTenant(); - StringBuffer error = new StringBuffer(""); - C8YRequest currentRequest = context.getCurrentRequest(); - String payload = currentRequest.getRequest(); - API targetAPI = context.getMapping().getTargetAPI(); - AbstractExtensibleRepresentation result = subscriptionsService.callForTenant(tenant, () -> { - MicroserviceCredentials contextCredentials = removeAppKeyHeaderFromContext(contextService.getContext()); - return contextService.callWithinContext(contextCredentials, () -> { - AbstractExtensibleRepresentation rt = null; - try { - if (targetAPI.equals(API.EVENT)) { - EventRepresentation eventRepresentation = configurationRegistry.getObjectMapper().readValue( - payload, - EventRepresentation.class); - rt = eventApi.create(eventRepresentation); - log.info("Tenant {} - New event posted: {}", tenant, rt); - } else if (targetAPI.equals(API.ALARM)) { - AlarmRepresentation alarmRepresentation = configurationRegistry.getObjectMapper().readValue( - payload, - AlarmRepresentation.class); - rt = alarmApi.create(alarmRepresentation); - log.info("Tenant {} - New alarm posted: {}", tenant, rt); - } else if (targetAPI.equals(API.MEASUREMENT)) { - MeasurementRepresentation measurementRepresentation = jsonParser - .parse(MeasurementRepresentation.class, payload); - rt = measurementApi.create(measurementRepresentation); - log.info("Tenant {} - New measurement posted: {}", tenant, rt); - } else if (targetAPI.equals(API.OPERATION)) { - OperationRepresentation operationRepresentation = jsonParser - .parse(OperationRepresentation.class, payload); - rt = deviceControlApi.create(operationRepresentation); - log.info("Tenant {} - New operation posted: {}", tenant, rt); - } else { - log.error("Tenant {} - Not existing API!", tenant); - } - } catch (JsonProcessingException e) { - log.error("Tenant {} - Could not map payload: {} {}", tenant, targetAPI, payload); - error.append("Could not map payload: " + targetAPI + "/" + payload); - } catch (SDKException s) { - log.error("Tenant {} - Could not sent payload to c8y: {} {}: ", tenant, targetAPI, payload, s); - error.append("Could not sent payload to c8y: " + targetAPI + "/" + payload + "/" + s); - } - return rt; - }); - }); - if (!error.toString().equals("")) { - throw new CompletionException(new ProcessingException(error.toString())); - } - return result; - }); - } - public AbstractExtensibleRepresentation createMEAO(ProcessingContext context) throws ProcessingException { String tenant = context.getTenant(); diff --git a/dynamic-mapping-service/src/main/java/dynamic/mapping/core/ConfigurationRegistry.java b/dynamic-mapping-service/src/main/java/dynamic/mapping/core/ConfigurationRegistry.java index a47c0e91..5e7dc4d5 100644 --- a/dynamic-mapping-service/src/main/java/dynamic/mapping/core/ConfigurationRegistry.java +++ b/dynamic-mapping-service/src/main/java/dynamic/mapping/core/ConfigurationRegistry.java @@ -22,7 +22,6 @@ import dynamic.mapping.connector.kafka.KafkaClient; import dynamic.mapping.connector.mqtt.MQTTClient; import dynamic.mapping.connector.mqtt.MQTTServiceClient; -import dynamic.mapping.core.cache.InboundExternalIdCache; import dynamic.mapping.model.MappingServiceRepresentation; import dynamic.mapping.notification.C8YNotificationSubscriber; import dynamic.mapping.processor.extension.ExtensibleProcessorInbound; @@ -119,12 +118,7 @@ public void setServiceConfigurationComponent(@Lazy ServiceConfigurationComponent @Getter @Setter @Autowired - private ExecutorService cachedThreadPool; - - @Getter - @Setter - @Autowired - private ExecutorService processingCachePool; + private ExecutorService virtThreadPool; public Map> createPayloadProcessorsInbound(String tenant) { ExtensibleProcessorInbound extensibleProcessor = getExtensibleProcessors().get(tenant); diff --git a/dynamic-mapping-service/src/main/java/dynamic/mapping/processor/inbound/AsynchronousDispatcherInbound.java b/dynamic-mapping-service/src/main/java/dynamic/mapping/processor/inbound/AsynchronousDispatcherInbound.java index 3e62d215..bcf185b8 100644 --- a/dynamic-mapping-service/src/main/java/dynamic/mapping/processor/inbound/AsynchronousDispatcherInbound.java +++ b/dynamic-mapping-service/src/main/java/dynamic/mapping/processor/inbound/AsynchronousDispatcherInbound.java @@ -76,7 +76,7 @@ public class AsynchronousDispatcherInbound implements GenericMessageCallback { private AConnectorClient connectorClient; - private ExecutorService cachedThreadPool; + private ExecutorService virtThreadPool; private MappingComponent mappingComponent; @@ -87,7 +87,7 @@ public class AsynchronousDispatcherInbound implements GenericMessageCallback { public AsynchronousDispatcherInbound(ConfigurationRegistry configurationRegistry, AConnectorClient connectorClient) { this.connectorClient = connectorClient; - this.cachedThreadPool = configurationRegistry.getCachedThreadPool(); + this.virtThreadPool = configurationRegistry.getVirtThreadPool(); this.mappingComponent = configurationRegistry.getMappingComponent(); this.configurationRegistry = configurationRegistry; } @@ -103,7 +103,7 @@ public static class MappingInboundTask implements Callable resolvedMappings, @@ -123,7 +123,7 @@ public MappingInboundTask(ConfigurationRegistry configurationRegistry, List>> processMessage(ConnectorMessage messag return futureProcessingResult; } - futureProcessingResult = cachedThreadPool.submit( + futureProcessingResult = virtThreadPool.submit( new MappingInboundTask(configurationRegistry, resolvedMappings, message, connectorClient)); @@ -275,7 +275,7 @@ public void onClose(String closeMessage, Throwable closeException) { @Override public void onMessage(ConnectorMessage message) { - Thread.startVirtualThread(() -> processMessage(message)).setName("vProcIn"); + processMessage(message); } @Override diff --git a/dynamic-mapping-service/src/main/java/dynamic/mapping/processor/inbound/BasePayloadProcessorInbound.java b/dynamic-mapping-service/src/main/java/dynamic/mapping/processor/inbound/BasePayloadProcessorInbound.java index 9fdb03cb..ff6d4707 100644 --- a/dynamic-mapping-service/src/main/java/dynamic/mapping/processor/inbound/BasePayloadProcessorInbound.java +++ b/dynamic-mapping-service/src/main/java/dynamic/mapping/processor/inbound/BasePayloadProcessorInbound.java @@ -62,14 +62,14 @@ public abstract class BasePayloadProcessorInbound { public BasePayloadProcessorInbound(ConfigurationRegistry configurationRegistry) { this.objectMapper = configurationRegistry.getObjectMapper(); this.c8yAgent = configurationRegistry.getC8yAgent(); - this.processingCachePool = configurationRegistry.getProcessingCachePool(); + this.virtCachePool = configurationRegistry.getVirtThreadPool(); } protected C8YAgent c8yAgent; protected ObjectMapper objectMapper; - protected ExecutorService processingCachePool; + protected ExecutorService virtCachePool; public abstract ProcessingContext deserializePayload(ProcessingContext context, ConnectorMessage message) throws IOException; @@ -110,7 +110,7 @@ public ProcessingContext substituteInTargetAndSend(ProcessingContext conte for (int i = 0; i < deviceEntries.size(); i++) { // for (MappingSubstitution.SubstituteValue device : deviceEntries) { int finalI = i; - contextFutureList.add(processingCachePool.submit(() -> { + contextFutureList.add(virtCachePool.submit(() -> { MappingSubstitution.SubstituteValue device = deviceEntries.get(finalI); int predecessor = -1; DocumentContext payloadTarget = JsonPath.parse(mapping.target); diff --git a/dynamic-mapping-service/src/main/java/dynamic/mapping/processor/outbound/AsynchronousDispatcherOutbound.java b/dynamic-mapping-service/src/main/java/dynamic/mapping/processor/outbound/AsynchronousDispatcherOutbound.java index 840a86cd..87c3dc7c 100644 --- a/dynamic-mapping-service/src/main/java/dynamic/mapping/processor/outbound/AsynchronousDispatcherOutbound.java +++ b/dynamic-mapping-service/src/main/java/dynamic/mapping/processor/outbound/AsynchronousDispatcherOutbound.java @@ -89,7 +89,7 @@ public class AsynchronousDispatcherOutbound implements NotificationCallback { protected ObjectMapper objectMapper; - protected ExecutorService cachedThreadPool; + protected ExecutorService virtThreadPool; protected MappingComponent mappingComponent; @@ -105,7 +105,7 @@ public AsynchronousDispatcherOutbound(ConfigurationRegistry configurationRegistr this.objectMapper = configurationRegistry.getObjectMapper(); this.c8yAgent = configurationRegistry.getC8yAgent(); this.mappingComponent = configurationRegistry.getMappingComponent(); - this.cachedThreadPool = configurationRegistry.getCachedThreadPool(); + this.virtThreadPool = configurationRegistry.getVirtThreadPool(); this.connectorClient = connectorClient; // log.info("Tenant {} - HIER I {} {}", connectorClient.getTenant(), // configurationRegistry.getPayloadProcessorsOutbound()); @@ -130,8 +130,10 @@ public void onOpen(URI serverUri) { public void onNotification(Notification notification) { // We don't care about UPDATES nor DELETES and ignore notifications if connector // is not connected + String tenant = getTenantFromNotificationHeaders(notification.getNotificationHeaders()); + if (!connectorClient.isConnected()) + log.warn("Tenant {} - Notification message received but connector {} is not connected. Ignoring message..", tenant, connectorClient.getConnectorName()); if ("CREATE".equals(notification.getNotificationHeaders().get(1)) && connectorClient.isConnected()) { - String tenant = getTenantFromNotificationHeaders(notification.getNotificationHeaders()); // log.info("Tenant {} - Notification received: <{}>, <{}>, <{}>, <{}>", tenant, // notification.getMessage(), // notification.getNotificationHeaders(), @@ -142,9 +144,9 @@ public void onNotification(Notification notification) { c8yMessage.setApi(notification.getApi()); c8yMessage.setTenant(tenant); c8yMessage.setSendPayload(true); - Thread.startVirtualThread(() -> { - processMessage(c8yMessage); - }).setName("vProcOut"); + virtThreadPool.submit(() -> { + processMessage(c8yMessage); + }); } } @@ -175,6 +177,8 @@ public static class MappingOutboundTask implements Callable resolvedMappings, MappingComponent mappingStatusComponent, @@ -184,7 +188,12 @@ public MappingOutboundTask(ConfigurationRegistry configurationRegistry, List> call() throws Exception { - long startTime = System.nanoTime(); - Timer.Sample timer = Timer.start(Metrics.globalRegistry); String tenant = c8yMessage.getTenant(); boolean sendPayload = c8yMessage.isSendPayload(); @@ -274,18 +281,8 @@ public List> call() throws Exception { } } else { processor.extractFromSource(context); + outboundProcessingCounter.increment(); processor.substituteInTargetAndSend(context); - Counter.builder("dynmapper_outbound_message_total") - .tag("tenant", c8yMessage.getTenant()) - .description("Total number of outbound messages") - .tag("connector", processor.connectorClient.getConnectorIdent()) - .register(Metrics.globalRegistry).increment(); - timer.stop(Timer.builder("dynmapper_outbound_processing_time") - .tag("tenant", c8yMessage.getTenant()) - .tag("connector", processor.connectorClient.getConnectorIdent()) - .description("Processing time of outbound messages") - .register(Metrics.globalRegistry)); - List resultRequests = context.getRequests(); if (context.hasError() || resultRequests.stream().anyMatch(r -> r.hasError())) { mappingStatus.errors++; @@ -299,12 +296,13 @@ public List> call() throws Exception { } } else { mappingStatusUnspecified.errors++; - log.error("Tenant {} - No process for MessageType: {} registered, ignoring this message!", + log.error("Tenant {} - No processor for MessageType: {} registered, ignoring this message!", tenant, mappingType); } processingResult.add(context); } }); + timer.stop(outboundProcessingTimer); return processingResult; } @@ -342,7 +340,7 @@ public Future>> processMessage(C8YMessage c8yMessage) return futureProcessingResult; } - futureProcessingResult = cachedThreadPool.submit( + futureProcessingResult = virtThreadPool.submit( new MappingOutboundTask(configurationRegistry, resolvedMappings, mappingComponent, payloadProcessorsOutbound, c8yMessage, connectorClient)); @@ -366,9 +364,11 @@ public Future>> processMessage(C8YMessage c8yMessage) } catch (InterruptedException e) { // c8yAgent.updateOperationStatus(tenant, op, OperationStatus.FAILED, // e.getLocalizedMessage()); + log.error("Tenant {} - Error waiting for result of Processing context", tenant, e); } catch (ExecutionException e) { // c8yAgent.updateOperationStatus(tenant, op, OperationStatus.FAILED, // e.getLocalizedMessage()); + log.error("Tenant {} - Error waiting for result of Processing context", tenant, e); } } return futureProcessingResult; diff --git a/dynamic-mapping-service/src/main/java/dynamic/mapping/processor/outbound/BasePayloadProcessorOutbound.java b/dynamic-mapping-service/src/main/java/dynamic/mapping/processor/outbound/BasePayloadProcessorOutbound.java index 0d4c203f..1e82925b 100644 --- a/dynamic-mapping-service/src/main/java/dynamic/mapping/processor/outbound/BasePayloadProcessorOutbound.java +++ b/dynamic-mapping-service/src/main/java/dynamic/mapping/processor/outbound/BasePayloadProcessorOutbound.java @@ -46,10 +46,7 @@ import org.springframework.web.bind.annotation.RequestMethod; import java.io.IOException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; @Slf4j public abstract class BasePayloadProcessorOutbound { @@ -118,7 +115,8 @@ public ProcessingContext substituteInTargetAndSend(ProcessingContext conte /* * step 4 prepare target payload for sending to mqttBroker */ - if (!mapping.targetAPI.equals(API.INVENTORY)) { + if(Arrays.stream(API.values()).anyMatch(v -> mapping.targetAPI.equals(v))) { + //if (!mapping.targetAPI.equals(API.INVENTORY)) { List topicLevels = payloadTarget.read(Mapping.TOKEN_TOPIC_LEVEL); if (topicLevels != null && topicLevels.size() > 0) { // now merge the replaced topic levels @@ -169,6 +167,7 @@ public ProcessingContext substituteInTargetAndSend(ProcessingContext conte } predecessor = newPredecessor; } else { + //FIXME Why are INVENTORY API messages ignored?! Needs to be implemented log.warn("Tenant {} - Ignoring payload: {}, {}, {}", tenant, payloadTarget, mapping.targetAPI, postProcessingCache.size()); } diff --git a/dynamic-mapping-service/src/main/resources/application.properties b/dynamic-mapping-service/src/main/resources/application.properties index 516dd260..84f0f3d5 100644 --- a/dynamic-mapping-service/src/main/resources/application.properties +++ b/dynamic-mapping-service/src/main/resources/application.properties @@ -19,6 +19,7 @@ # @authors Christof Strack, Stefan Witschel # spring.profiles.active=prod +spring.threads.virtual.enabled=true application.name=dynamic-mapping-service application.version=@project.version@ server.port=8080 diff --git a/pom.xml b/pom.xml index 226568e4..ebecbdec 100644 --- a/pom.xml +++ b/pom.xml @@ -36,7 +36,7 @@ UTF-8 4.5.3-SNAPSHOT - 1020.107.0 + 1020.139.0 1.18.34 1.7.36 21