Technology Blogs by SAP
Learn how to extend and personalize SAP applications. Follow the SAP technology blog for insights into SAP BTP, ABAP, SAP Analytics Cloud, SAP HANA, and more.
cancel
Showing results for 
Search instead for 
Did you mean: 
mandy_krimmel
Advisor
Advisor
This blog describes options for configuring asynchronous message processing using the new AMQP adapter, which is available for customers to connect to messaging systems using the AMQP (Advanced Message Queuing Protocol) protocol. It describes the configuration, prerequisites and limits. The AMQP adapter is available for SAP Cloud Integration customers with the 08-December-2019 release.

Connecting to Messaging Systems Using the AMQP Adapter


In many integration scenarios messages or events have to be exchanged between applications or systems via messaging systems. With the new AMQP adapter SAP Cloud Integration can be used as provider or consumer of such messages or events. Cloud Integration can connect to messaging systems using the AMQP (Advanced Message Queuing Protocol) protocol version 1.0 and consume messages or events using the AMQP sender adapter or store messages or events in the message broker using the AMQP receiver adapter. Follow the steps described below to write to or consume from queues and/or topics in the message broker.

Prerequisite: Messaging System Setup


To be able to connect to queues or topics in the message broker, you have to create queues and/or topics in the message broker. This needs to be done on the messaging system with the configuration tools provided by the messaging system.

In some messaging systems you need to configure a Lock Duration to make sure the message is not consumed multiple times. This timeout must be longer than the expected processing time of the message, otherwise this would lead to duplicate messages.

Note that the monitoring of queues, topics and messages in the queues or topics can only be executed by using tools provided by the messaging system provider. These monitors are not integrated into Cloud Integration. In SAP Cloud Platform Integration you can monitor the integration flows using the AMQP adapter and the messages send to or consumed from the messaging system. You can find more details about those options in this blog in section 'Monitoring'.

 

AMQP Receiver Adapter


The AMQP receiver adapter can be used to send messages from Cloud Integration to queues or topics in an external messaging system. A small sample scenario with a HTTP sender adapter and the AMQP receiver adapter is shown in the picture below. A message is received by the HTTP sender adapter, some headers are defined and conversions in a groovy script are done, the message is then sent to the messaging system via the AMQP adapter:



In the AMQP receiver channel the following configurations have to be made to connect to the messaging system. Note that these settings are very specific to the connected messaging system, some sample settings are listed below in the messaging system specific chapters.

  • Protocol:

    • Transport Protocol: Select the protocol the messaging system supports.

      • TCP

      • WebSocket








  • Connection:

    • Host: Specify the hostname of the messaging system.

    • Port: Specify the port of the messaging system.

    • Proxy Type: Select if you want to connect via Cloud Connector (On-Premise) or directly via the Internet, this configuration option is available with version 1.1 of the adapter (available with the January 2020 update). See blog How to connect to an on-premise AMQP server via Cloud Connector for more details.

    • Path: For WebSocket specify the access path of the messaging system.

    • Connect with TLS: Select if TLS has to be used for the connection.

    • Authentication: Select the authentication method the messaging system supports.

      • SASL (Simple Authentication and Security Layer)

      • OAuth2 Client Credentials

      • None



    • Credential Name: Select the alias of the deployed user credentials. You need to deploy the respective key name and key as user credentials in the security material section.






  • Processing:

    • Destination Type: Specify if messages are to be sent to queues or topics in the messaging system.

      • Topic

      • Queue



    • Destination Name: Specify the name of the queue or topic. This value can be dynamically defined using header: ${header.queueabc} or property: ${property.queueabc}.

    • Expiration Period: Specify the TTL (Time to Live) for the message. If nothing is specified, the setting for the queue or topic subscription in the messaging system applies. How the defined TTL is interpreted by the messaging system depends on the messaging system.

    • Delivery: Specify if the messaging system has to make sure that the message is not lost, even in case of unexpected terminations.

      • Persistent

      • Non-Persistent








 

AMQP Sender Adapter


The AMQP sender adapter can be used to consume messages in Cloud Integration from queues or topic subscriptions in an external messaging system. A small sample scenario with the AMQP sender adapter and a SOAP receiver adapter is shown in the below picture. A message is consumed by the AMQP sender adapter from the messaging system, some conversions in a groovy script are executed, and then the message is sent to the receiver via the SOAP adapter:



In the AMQP sender channel the following configurations need to be done, sample settings below in the messaging system specific chapters:

  • Protocol:

    • Transport Protocol: Select the protocol the messaging system supports.

      • TCP

      • WebSocket








  • Connection:

    • Host: Specify the hostname of the messaging system.

    • Port: Specify the port of the messaging system.

    • Proxy Type: Select if you want to connect via Cloud Connector (On-Premise) or directly via the Internet, this configuration option is available with version 1.1 of the adapter (available with the January 2020 update). See blog How to connect to an on-premise AMQP server via Cloud Connector for more details.

    • Path: For WebSocket specify the access path of the messaging system.

    • Connect with TLS: Select if TLS has to be used for the connection.

    • Authentication: Select the authentication method the messaging system supports.

      • SASL (Simple Authentication and Security Layer)

      • OAuth2 Client Credentials

      • None



    • Credential Name: Select the alias of the deployed user credentials. You need to deploy the respective key name and key as user credentials in the security material section.






  • Processing:

    • Queue Name: Specify the name of the queue or topic subscription to be consumed from. Note that topics are not supported in the sender adapter, only queues and topic subscriptions.

    • Number of Concurrent Processes: Specify the number of processes used for parallel message processing. Note, that the processes are started from each worker node.

    • Max. Number of Prefetched Messages: Specify the maximum number of messages to be prefetched by a worker. The default value is set to 5, which means that if there are more than 5 messages in the queue, the first worker fetches 5 messages at once and processes them one after the other; the second worker fetches the next 5 and so on. The allowed value range is 1 to 100. The performance may be increased with this prefetch feature because it reduces the time for additional communications. Consider the following:

      • If the processing time of the integration flow is longer than only some seconds, consider a lower value for prefetched messages to allow an optimal distribution between the worker nodes. For very long running integration flows (longer than one minute) you may even consider 1 as value for prefetched messages.

      • If the processing time of the integration flow is only some milliseconds you may increase the number of prefetched messages to 10 or even higher. But keep the lock timeout in mind (next point).

      • Important: You need to keep the lock timeout of the messaging system in mind because the timeout starts with the processing of the first message in the prefetch package. If the package of the prefetched messages takes longer to process than what you’ve specified for the lock timeout, this could lead to duplicate messages!

      • For older versions of the AMQP channel this configuration option is not available. In this case, the default value of 5 messages is used.





  • The Retry Details section will be available with the 10th-May 2020 update.

    • Max. Number of Retries: Specify the maximum number of retries that shall be executed in case there is an error during processing. Afterwards a different delivery status will be sent to the message broker (see next field).

    • Delivery Status After Max. Retries: Select the delivery status that shall be sent to the message broker after the specified retries were executed and the message processing still fails. The following two values are available: REJECTED and MODIFIED_FAILED_UNDELIVERABLE. The message broker can then handle such messages differently.






Retry Configuration


If an error occurs during the processing of the consumed message in Cloud Integration, the message is not removed from the messaging system, but is retried again immediately as long as the maximum number of configured retries is reached. In case the messaging system does not support a different handling of the message when a different delivery status is sent, the retry may even go on forever.

There are different options available to handle errors during processing and configure the retry for messages consumed via AMQP:

  • Use Retry configuration in AMQP sender adapter as described above (available with 10th May 2020 update)

  • Retry Configuration based on JMSRedelivered/JMSXDeliveryCount headers in Exception Sub-Process

  • Catch Error and configure alternate processing in Exception Sub-Process


If the used messaging system supports dead-lettering and delayed processing based on the delivery status as described for the AMQP sender adapter, then this is the recommended configuration option. If the messaging system does not support dead-lettering or you want to do a more specific handling, like sending a notification to an administrator after a certain number of retries you can use the configuration based on the two headers JMSRedelivered and JMSXDeliveryCount. The third option is the only option if the messaging system does neither support dead-lettering nor the headers.

Retry Configuration in AMQP Sender Adapter


If supported by the messaging system use the retry configuration in the AMQP sender adapter as shortly mentioned above.

The Retry Details section in the AMQP sender adapter will be available with the 10th-May 2020 update.

  • Max. Number of Retries: Specify the maximum number of retries that shall be executed in case there is an error during processing. Afterwards a different delivery status will be sent to the message broker (see next field).

  • Delivery Status After Max. Retries: Select the delivery status that shall be sent to the message broker after the specified retries were executed and the message processing still fails. The following two values are available: REJECTED and MODIFIED_FAILED_UNDELIVERABLE. The message broker can then handle such messages differently.


Most message brokers put messages with delivery status REJECTED into a dead letter queue, but for several message brokers a specific configuration in the message broker is required as well to achieve this. Some message brokers do not react on the delivery status at all. Check out the configuration options of the used message broker. Some specifics are mentioned below in the section about different tested message brokers.
Executing Retries or Not?

Answering this question is not as simple as you might expect. Considering the details of the retry mechanism, both options have advantages and disadvantages.

The AMQP sender adapter will run up to Max. Number of Retries before sending the configured Delivery Status After Max. Retries to the broker. Then it depends on the broker and its configuration how it reacts to this delivery status. Usually, the broker either dead-letters the message or it resends the message to the client.

  • If the AMQP sender adapter is configured not to execute any retries (Max. Number of Retries = 0), a to-be-redelivered message will be filtered out before the integration flow even starts to be executed. No MPL will be visible for the filtering mechanism, as not a single modeled step is even executed in the first place. This is all fine, if the broker dead-letters the message as a consequence. But this becomes a problem, if the broker simply resends the message anyway (although the AMQP sender adapter signaled to the broker that it cannot (or does not wish to) re-execute this message).

  • If the AMQP sender adapter is configured to execute n retries, it will attempt up to n retries and finally sends back the Delivery Status After Max. Retries in case all attempts were unsuccessful. If the broker chooses to send the same message again to the client, the client will (once again) try to process the message with up to n subsequent retries before sending back the Delivery Status After Max. Retries - again.


Let us consider the two worst-case scenarios:

Scenario 1:

The integration flow is unable to process the message successfully without user-interaction (or change). That means when re-executing the same message, processing will continue to fail. The AMQP sender adapter is configured not to run any retries. However, the broker resends the message over and over independent of the configured Delivery Status After Max. Retries. The retry attempts will not be visible (i.e. via MPL). But since the broker continues to send this message, the client has to filter it out and this consumes resources, mainly CPU. And even worse, it blocks the processing of subsequent messages from that queue in case of exclusive queues or message groups .

Exposing these infinite attempts in MPLs would make this transparent while putting the health of your tenant's database at risk. Fast, infinite retry attempts can flood the database with MPLs, potentially long before you even take notice of this. Hence, Cloud Integration decided to sacrifice transparency for the sake of the healthiness of the database and your tenant.

Scenario 2:

The integration flow is unable to process the message successfully without user-interaction (or change). That means when re-executing the same message, processing will continue to fail. The AMQP sender adapter is configured to run n retries (Max. Number of Retries > 0). The adapter will attempt up to n retries and finally sends back the Delivery Status After Max. Retries in case all attempts were unsuccessful. If the broker chooses to send the same message again to the client, the client will (once again) try to process the message with up to n subsequent retries before sending back the Delivery Status After Max. Retries - again. Since the broker resends the same message indefinitely, this results in infinite retry attempts. And since the integration flow allows retry attempts, it is not immediately filtered out. Instead, it is actually being executed and you will see an MPL for this (in RETRY state).

If this goes on and on without anybody taking notice and acting on this situation, the database can be flooded and the tenant becomes unstable.

Ways Out of the Misery

  1. Choose a broker that supports dead-lettering and make sure, it is configured to do so based on the Delivery Status After Max. Retries.

  2. When allowing retries, it is recommended to catch and handle exceptions in an exception subprocess. If you re-raise an exception (i.e. Error end event), the process will fail and the message will be retried. It is advisable to have an automated way of handling the exception successfully (i.e. End event) to avoid infinite retry attempts during a time frame the tenant is not actively observed.


Retry Configuration based on JMSRedelivered/JMSXDeliveryCount


There is no option to configure a delay in retry processing in the AMQP adapter because this is not supported by the AMQP protocol. One option to delay the retry in error cases is to configure this retry handling in the integration flow using dead letter queues in the messaging system (if this is supported by the messaging system). This can be configured using two headers set by most of the messaging systems:

  • JMSRedelivered: This header specifies, if the message was redelivered. Value 'false' means that this message was delivered for the first time, value 'true' tells you that this message was already tried to be delivered before.

  • JMSXDeliveryCount: This header specifies the number of processings for this message. Value 1 means that it is the first attempt to process this message, value 2 means that it is the second attempt, meaning it is the first retry.


Note that these headers are not set or not reliably set by some messaging systems. See below in the messaging system specific section for more details.
Configure Delayed Retry Processing

The first step to configure a delayed retry would be to add a Router step and another Receiver to the integration flow consuming the message:



In the Router the route to the second receiver has to be configured in such a way that messages which are consumed for the second time are sent to another queue in the messaging system. The Condition in the Router can be defined by using one of the above-mentioned parameters. In the described sample I use the 'JMSXDeliveryCount' header and define the Non-XML expression as ${header.JMSXDeliveryCount} > '1'. If the used message broker does not support this header you can use the 'JMSRedelivered' header and define the expression as ${header.JMSRedelivered} = 'true'.



In the AMQP receiver channel a different queue is configured. This queue has to be created in the messaging system. From this queue no integration flow consumes messages, it is only used as storage for the time to the next retry. In my sample I use the queue 'retryqueue'. 



In the parameters for this queue, it needs to be specified that messages are moved to a dead letter queue after a specific time interval (time to live). This configuration has to be made in the messaging system by using the tools provided by the messaging system.

Note: If the used message broker supports configuring any queue as dead letter queue, you can directly move the message back to the original processing queue and do not need to do this via explicit process.

From this dead letter queue we can then consume the message and put it back to the original processing queue. This is done in a separate integration process:



The AMQP sender adapter needs to be configured to consume messages from the dead letter queue of the retry queue or the queue defined as dead letter queue.

In case Microsoft Azure Service Bus is used as messaging system, the dead letter queue can be accessed by using the following syntax: '<queue>/$deadletterqueue': This may be different for other messaging systems.

Make sure you select the flag ‘Consume Expired Messages’. This is required because the messages in the dead letter queue are expired because the expiration time is used as the delay time.

 


The process writes the message back to the original processing queue via an AMQP receiver adapter so that it can be consumed from there again.

In addition to these configurations, you need to make sure the header JMSXDeliveryCount or JMSRedelivered is retrieved by the integration flow. For this we configure the header as Allowed Header in the Runtime Configuration of the integration flow:



Now we can deploy the integration flow and test the processing:

As soon as a message is available in the processing queue in the messaging system, the message is consumed by Cloud Integration. If there is an error during processing, the processing fails and an immediate retry is executed. This retry stores the message in the separate retry queue, where the message is parked for the amount of time configured in the messaging system. As the message is not consumed from this retry queue it is moved to the dead letter queue after the configured time to live.

As soon as it is available in the dead letter queue the second process consumes the message and stores it to the original processing queue. From there it is consumed and tried to be processed again. The same retry procedure would be triggered if again an error in processing occurs.

You see, with this we are able to define a kind of retry interval, the message would only be retried after a defined time interval. What is not possible with this configuration is to stop a message after a certain number of retries. How this can be done, we see in the next section.
Stop Retry Processing after x Retries

First, we need to introduce a counter that counts the numbers of executed retries. For this we cannot use the JMSXDeliveryCount header set by the messaging system because we move the messages between different queues and so the JMSXDeliveryCount is always reset. We define our own counter in the process that writes the message back to the processing queue. We do this in a small groovy script:



In the script we set a header RetryCount.

Note that headers with prefix JMS are not allowed, such headers are not forwarded by the messaging systems.
import com.sap.gateway.ip.core.customdev.util.Message;
import java.util.HashMap;

def Message processData(Message message) {
// Get Headers
map = message.getHeaders();
retry = map.get("RetryCount");
if (retry == null) {
retry = 1;
}
else {
retry = retry + 1;
}
message.setHeader("RetryCount", retry);
return message;

}

Furthermore, we extend the configuration in the main process that consumes messages from the processing queue by adding an additional Router step:



In this Router step we evaluate the RetryCount header, and if it is greater or equal 5 we do some alternative handling and stop the retries. In my sample I simply write the message to a data store, but any other configuration could be done as well.



As a last step we need to add the RetryCount header in the Allowed Headers in the Runtime Configuration of the integration flow:

 



Now we can deploy the updated integration flow and test the processing:

As soon as a message is available in the processing queue in the messaging system, the message is consumed by Cloud Integration. If there is an error during processing, the processing fails and an immediate retry is executed. This retry stores the message in the separate retry queue, where the message is parked for the amount of time configured in the messaging system. As the message is not consumed from this retry queue it is moved to the dead letter queue after the configured time to live.

As soon as it is available in the dead letter queue the second process consumes the message, sets the RetryCount header and stores it to the original processing queue. From there it is consumed and as the numbers of executed retries are checked. The message is only retried 4 times; during the 5th retry, the message is written to the data store and the processing stops.

Note, that when the message broker supports defining the original queue as dead letter queue directly and you skip this additional process, you can increase the RetryCount in the script directly in the main process instead before writing the message to the retry queue.

Configure Exception Handling for Messaging Systems not Supporting the Headers


As mentioned already, not all messaging systems support the two headers to configure explicit retry handling. In this case the only option to avoid endless retries that lead to a huge amount of message processing log, is to configure an exception handling in case of an error:


Configure an Exception Subprocess in your integration flow to catch the error. Define an alternate processing for the message in the exception sub-process. In the above case the message is stored to a data store, and afterwards an email is sent to the administrator to analyze the error and process the message differently. In case the message is stored to a data store, like in the above sample, a different integration flow could consume and process these messages. You can for sure also define a different error handling, like storing the message to a different queue (kind of dead letter queue) on the messaging system.

It is important that you end the Exception Subprocess with a Message End event and not with an Error End event to make sure the message is marked as Completed and is removed from the original queue on the message broker to prevent endless retries.

Monitoring


There are different options to monitor the integration flows, the connection to the messaging system and the processed messages.

AMQP Connection Test 


The Connectivity Test is available in Operations View in Web UI, in section Manage Security Material. Selecting the Connectivity Test tile from Overview Page opens the test tool offering tests for different protocols. To test the communication to the messaging system, the AMQP option is to be selected.



 

Integration Content Monitor


After the integration flow is deployed it can be found in the Manage Integration Content monitor. There you can check the status of the integration flow.



Poll Status 

In the Status Details area you may find the status and the details about the current consumption:



If there is an error when consuming messages via the AMQP sender adapter the error would be shown here for the respective integration flow. In the Polling Information the status of the consumption is shown as Failed:


Message Processing Monitor


Processed messages can be monitored in the Message Processing monitor:



In case of an error when sending the message to the messaging system using the AMQP receiver the errors would appear in this monitor:



Usually, during message processing a dedicated message processing log (mpl) is written for each message (JMS Message ID) consumed from the AMQP server.

Note, that in case the same integration flow consumes from multiple queues subscribed to the same topic those messages may be contained in the same mpl because the original JMS message id is  used for the creation of the mpl. Because of this, the recommendation when consuming from different queues is to use different integration flows, each for a dedicated queue.

Messaging System Monitor


Queues, topics and messages in the messaging system can be monitored using the monitoring tools of the messaging system.

Mapping of AMQP Headers, Properties and Annotations to Headers in Cloud Integration


During transforming a AMQP message to a message in Cloud Integration, or vise versa, the following AMQP headers, properties and annotations are mapped to headers in Cloud Integration:

AMQP Type        AMQP Name                   Header Name in Cloud Integration

header                  durable                              JMSDeliveryMode

header                  priority                               JMSPriority

header                  delivery-count                  JMSXDeliveryCount

annotation            x-opt-delivery-time       JMSDeliveryTime

property                message-id                      JMSMessageID

property                user-id                               JMSXUserID

property                to                                         JMSDestination

property               subject                               JMSType

property               reply-to                              JMSReplyTo

property                correlation-id                  JMSCorrellationID

property                absolute-expiry-time    JMSExpiration

property                creation-time                  JMSTimestamp

property                group-id                            JMSXGroupID

property                group-sequence             JMSXGroupSeq

AMQP application properties are transferred to Camel headers in Cloud Integration runtime with the same name and the other way round. Important is that the application properties are not allowed to start with JMS, else it would not be forwarded into a Camel header.

 

Exclusive Processing


In general there are two ways to provide exclusive (in-order) processing using an AMQP broker:

  • Exclusive queues provide a capability that will let only one consumer consume from a given queue at a time. If that particular consumer is stopped or crashes one of the other consumers takes over consuming the messages. This means this also works if the Cloud Integration tenant has multiple worker nodes.

  • Message groups are an optional feature of the AMQP 1.0 protocol. Groups are realized by using the AMQP property group-id. If an AMQP producer sets the group-id property at a message and the broker supports message grouping for that queue, all messages from the same message group will be processed one after the other. In our case, if the producer is a Cloud Integration system, you can set the AMQP group-id property by setting the camel header JMSXGroupID (see in the table above).


Note that not all messaging systems support exclusive queues and/or message groups and these feature may have to be activated explicitly for a queue in the messaging system configuration. See below in the messaging system specific section for more details.

 

Connections required for Processing


For the AMQP adapter you require a permanent minimum of one connections per worker node for consuming messages from a queue because each worker node needs a connection to the message broker. For storing a message to the messaging system the numbers of worker nodes is the maximum of required connections.

In total this means the numbers of connections per queue is:

number of worker nodes + parallel requests storing messages to the message broker (maximum: number of worker nodes)

This means you would need a maximum of 4 connections for one queue for a cluster with two worker nodes.

 

Supported External Messaging Systems


There are multiple providers of messaging system implementations available. Most of them support AMQP 1.0 and can be connected using the AMQP adapters. The most used messaging systems were tested by SAP Cloud Integration. Note the required settings, configuration options and limitations below.

SAP Enterprise Messaging/Event Mesh


The following configuration options are applicable for the SAP Enterprise Messaging:

  • Connectivity Options: WebSocket over TLS (Port 443 with Path: "/protocols/amqp10ws")

  • Authentication Option: OAuth2 Client Credentials

  • Dead Letter Queue Handling based on Delivery Status: Yes, Delivery status REJECTED puts the message to a DLQ after the configured redeliveries. Delivery status MODIFIED_FAILED_UNDELIVERABLE must not be used as it is not supported and can lead to errors during processing. Note, that the dead letter queue and the maximum redeliveries have to be configured in the message broker as well.

  • JMSRedelivered/JMSXDeliveryCount supported: JMSRedeliverd: Yes; JMSXDeliveryCount: No

  • Exclusive Queues supported: Yes

  • Message Groups supported: No

  • Queues supported: Yes, queues  need to be accessed using the following syntax in AMQP adapter channel: "queue:<queue name>"

  • Topics supported: Yes, topics need to be accessed using the following syntax in AMQP adapter channel: "topic:<topic name>"

  • Topic subscriptions supported: Yes, use queues to subscribe to topics and use the queue in AMQP sender.


Size Limitations from SAP Enterprise Messaging

When using Enterprise Messaging consider the following important restrictions:

  • Maximum Number of Connections supported per Service Instance: 50

  • Maximum Numbers of Connections combined for all Service Instances and subscription (per subaccount): 1000


Taking the above connection requirements in consideration, when using Enterprise Messaging  with the AMQP adapter this means that you should use one service instance per queue.

For more details check out the documentation.

SAP Integration Suite, Advanced Event Mesh


The following configuration options are applicable for the Advanced event mesh message broker:

  • Connectivity Options:

    • TCP (Port as defined in the event mesh broker)

    • TLS over TCP (Port as defined in the event mesh broker)



  • Authentication Option: SASL

  • Dead Letter Queue Handling based on Delivery Status: Supported, but the dead letter queue and the maximum redeliveries have to be configured in the message broker as well. Delivery status REJECTED puts the message to the dead letter queue. Delivery status MODIFIED_FAILED_UNDELIVERABLE must not be used as it is not supported and can lead to errors during processing.

  • JMSRedelivered/JMSXDeliveryCount supported: JMSRedeliverd: Yes; JMSXDeliveryCount: No

  • Exclusive Queues supported: Yes

  • Message Groups supported: No

  • Queues supported: Yes

  • Topics supported: Yes

  • Topic subscriptions supported: Yes, use queues to subscribe to topics and use the queue in AMQP sender.


Microsoft Azure Service Bus


The following configuration options are applicable for the Microsoft Azure Service Bus:

  • Connectivity Options: TLS over TCP (Port 5671)

  • Authentication Option: SASL

  • Dead Letter Queue Handling based on Delivery Status: Supported, delivery status REJECTED puts the message to a dead letter queue, delivery status MODIFIED_FAILED_UNDELIVERABLE gives the message a deferred status in the messaging system (Message Deferral). Deferred messages stay in the queue, but are not consumed anymore.

  • JMSRedelivered/JMSXDeliveryCount supported: Yes

  • Exclusive Queues supported: No

  • Message Groups supported: No

  • Queues supported: Yes

  • Topics supported: Yes

  • Topic subscriptions supported: Yes, topic subscriptions can be accessed as separate, queue-like entities using the AMQP sender adapter: "[topic name]/subscriptions/[subscription name]". Multiple subscriptions for a single topic can exist. It is not possible to send to topic subscriptions using the AMQP receiver adapter.


Solace PubSub+


The following configuration options are applicable for the Solace message broker:

  • Connectivity Options:

    • TCP (Port as defined in the Solace broker)

    • TLS over TCP (Port as defined in the Solace broker)



  • Authentication Option: SASL

  • Dead Letter Queue Handling based on Delivery Status: Supported, but the dead letter queue and the maximum redeliveries have to be configured in the message broker as well. Delivery status REJECTED puts the message to the dead letter queue. Delivery status MODIFIED_FAILED_UNDELIVERABLE must not be used as it is not supported and can lead to errors during processing.

  • JMSRedelivered/JMSXDeliveryCount supported: JMSRedeliverd: Yes; JMSXDeliveryCount: No

  • Exclusive Queues supported: Yes

  • Message Groups supported: No

  • Queues supported: Yes

  • Topics supported: Yes

  • Topic subscriptions supported: Yes, use queues to subscribe to topics and use the queue in AMQP sender.


Apache Qpid Broker-J


The following configuration options are applicable for the Apache Qpid Broker-J:

  • Connectivity Options:

    • TCP (Port as defined in the Qpid broker)

    • TLS over TCP (Port as defined in the Qpid broker)

    • WebSocket (Port as defined in the Qpid broker)

    • WebSocket over TLS (Port as defined in the Qpid broker)



  • Authentication Option: SASL

  • Dead Letter Queue Handling based on Delivery Status: Yes, but the dead letter queue and the maximum redeliveries have to be configured in the message broker as well. Delivery status REJECTED puts the message to the dead letter queue after the number of redelivery attempts configured in the messaging system. Delivery status MODIFIED_FAILED_UNDELIVERABLE takes the message out of the processing as long as the connection to the messaging system is established. After restart of the integration flow or the worker node the message would be tried again. After the number of redelivery attempts configured in the messaging system the message is moved to the dead letter queue.

  • JMSRedelivered/JMSXDeliveryCount supported: Yes

  • Exclusive Queues supported: Yes

  • Message Groups supported: Yes

  • Queues supported: Yes

  • Topics supported: Yes

  • Topic subscriptions supported: Yes, use queues to subscribe to topics and use the queue in AMQP sender.


Apache ActiveMQ 5 and Apache ActiveMQ Artemis


The following configuration options are applicable for the Apache ActiveMQ:

  • Connectivity Options:

    • TCP (Port as defined in the ActiveMQ broker)

    • TLS over TCP (Port as defined in the ActiveMQ broker)



  • Authentication Option: SASL

  • Dead Letter Queue Handling based on Delivery Status: Yes, the dead letter queue, the maximum redeliveries and a redelivery delay can be configured in the message broker as well. Delivery status REJECTED and MODIFIED_FAILED_UNDELIVERABLE put the message to the dead letter queue.

  • JMSRedelivered/JMSXDeliveryCount supported: Yes

  • Exclusive Queues supported: No

  • Message Groups supported: Yes

  • Queues supported: Yes

  • Topics supported: Yes

  • Topic subscriptions supported: Yes, use queues to subscribe to topics and use the queue in AMQP sender.


Note that Amazon MQ Service is based on Apache Active MQ and so, the same configuration options apply. For details see blog How to connect to an Amazon MQ Service using the AMQP Adapter.

IBM MQ


In older versions the IBM MQ broker has only limited support for the AMQP protocol, it does not support addressing queues via AMQP protocol, see IBM MQ documentation. Because of this limitation, with IBM MQ versions < 9.2, the AMQP receiver adapter can only be used to write to topics on the IBM MQ broker, but the AMQP sender adapter cannot consume from IBM MQ because only queues are supported for consumption in Cloud Integration. With IBM MQ version 9.2 this limitation does not exist anymore, see Point-to-point support on AMQP channels.

The following configuration options are applicable for IBM MQ:

  • Connectivity Options:

    • TCP (Port as defined in the IBM MQ broker)

    • TLS over TCP (Port as defined in the IBM MQ broker)



  • Authentication Option: SASL

  • Dead Letter Queue Handling based on Delivery Status: Not supported with AMQP protocol.

  • JMSRedelivered/JMSXDeliveryCount supported: Yes (with version >= 9.2).

  • Exclusive Queues supported: Yes (with version >= 9.2). Max Number of Prefetched Messages in AMQP sender channel needs to be set to 0.

    • Note that the Poll status in the deployed artifacts monitor will show an error if multiple workers are running in your tenant. This is because only one consumer is allowed for the exclusive queue, the second worker will get an error when trying to connect.



  • Message Groups supported: No.

  • Queues supported: Yes (with version >= 9.2)

  • Topics supported: Yes

  • Topic subscriptions supported: Yes.


RabbitMQ


In testing we found that RabbitMQ has problems with AMQP 1.0. Test was done with plugin version 3.8.2, which was the newest version available at this time. This may change with newer plugin versions.
200 Comments
former_member791832
Participant
0 Kudos
I have 10 RU in place , what should I do to increase the number of connections?

 

Thanks,

Ramya

 

 
mandy_krimmel
Advisor
Advisor
0 Kudos
Please check out this blog: SAP Event Mesh – Resource Units | SAP Blogs

Best regards

Mandy
former_member509776
Discoverer
0 Kudos
mandy.krimmel

We are trying to connect RabbitMQ on-premies via cloud connector and socks5 proxy. We managed to connect on-premise Postgresql without a problem but when we try to following code (DbSocketFactory is socks5 proxy class) we get following exception: java.net.UnknownHostException: test.sni.com: Name does not resolve

Do you have any idea about this?
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("test.pp.com");
factory.setPort(5672);
factory.setUsername("guest");
factory.setPassword("abc");

factory.setSocketFactory(new DBSocketFactory());

try (com.rabbitmq.client.Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
String message = "Hello World!";
channel.basicPublish("", "test", null, message.getBytes());
}

Best Regards
mandy_krimmel
Advisor
Advisor
0 Kudos
Hi,

as you see in the blog RabbitMQ is not supported with the AMQP adapter. A dedicated RabbitMQ adapter is planned for this.

Best regards

Mandy
former_member791832
Participant
0 Kudos
Thanks Mandy! This works now.

 

Regards,

Ramya
mandy_krimmel
Advisor
Advisor
0 Kudos
thanks for letting me know!
former_member791832
Participant
0 Kudos
Hi Mandy,

 

I happen to observe that it works sometimes and sometimes it throws the connection rejected error. Can you please suggest what else I could do.

 

Also, in order to create a lag of retry of 10 seconds, instead of using another Retry queue with a dead message queue, is there any other way? I was just retrying to reduce the number of queues since I want to repeat the same procedure of retrying for 5 times at a regular interval for say 1 or 2 hours.

Any leads around this would be highly appreciated.

 

Thanks,

Ramya
mandy_krimmel
Advisor
Advisor
If you still get the too much connections error sometimes this means that under some conditions (load, retry etc) the connections are still not sufficient.

All the different options of retry and delayed retry are summarized in the blog, there is not much I can add.

Best regards

Mandy
former_member791832
Participant
0 Kudos
Hi Mandy,

Thank you so much.

 

I assigned the main queue itself as the dead message queue to address this. However, I have another integration artifact where I need to configure the same error handling mechanism.

 

But I happen to observe that for this integration artifact (which is similar to the one that is working except for the difference in payload and mapping), the headers JMSXDelivery count is always 1 and the JMSRedeliered is always false, irrespective of whether my target is reachable or not.

Any idea what could be the reason and how to make a work around for this

 

 

Thanks,

Ramya
mandy_krimmel
Advisor
Advisor
0 Kudos
no idea, this would have to be checked directly in the configuration and logs. Maybe there is something in the configuration which is different.

I would suggest to open a ticket on LOD-HCI-PI-CON-SOAP to get this checked by the experts.

Best regards

Mandy
StefanM-AU
Employee
Employee

Hi,


Had the same issue / error message when using AMQP adapter to send message to Event Mesh queue.

Solution was to write the Destination Name in the format: 'queue:<queuename>', where queuename needs to include the namespace, URL encoded (i.e. replace / with %2F).

Regards


Stefan

Cristian
Participant

mandy.krimmel

Awesome blog.

I am configuring an AMPQ (SAP Event Mesh) to HTTP IFLOW in CPI but I am not able to get my head around how the adapter works where an error occurs.

The scenario is quite simple with just one retry.

The queue in SAP Event Mesh is configured as follows with a Dead Message Queue and just one retry.

If I execute the flow forcing the error in the HTTP adapter I see the below entries in the CPI monitor:

 

  • Why am I seeing two entries in the monitor? One for the original and one for the retry? With the internal JMS queues there is just one entry.
  • Why the messages stay in Retry status although the 2 tries failed and the message has been put back in the dead letter queue in SAP Event Mesh?
  • What is the relationship between the retries set up in SAP CPI adapter and the retries set up in the Event Mesh queue.

Seems quite difficult to have a nice way to handle the errors.

Many thanks in advance.

Regards,

C.

 

ljsap1
Explorer
0 Kudos

Hello Mandy,

Thanks for the excellent blog.

Is it possible to stop consuming queues with the AMQP sender adapter, without undeploying the iFlow? In the case of an error situation I would like to deactivate queue consumption - hence the question.

Thank you,

Lima

mandy_krimmel
Advisor
Advisor
0 Kudos
No, this is not possible. You need to undeploy the flow to deactivate the consumer.
mandy_krimmel
Advisor
Advisor
0 Kudos
Hello,

usually the two message processing logs should be correlated in one via the JMS Message ID. I would suggest you open a ticket on LOD-HCI-PI-OP-SRV.

Best regards

Mandy
lmenon
Explorer
Hello Mandy,

Thanks for the great blog and the workaround on how to implement a delayed retry processing (using a separate queue in the messaging system).

We are able to set the TTL of the message in the messaging system by providing a value for 'Expiration time' in the AMQP receiver adapter - however I noticed that the system gives an error when you try to set this value as a variable(e.g header). This would be very useful because it would give the ability to configure an exponential back-off by increasing the expiration time/TTL of the message in the dead letter queue so that only goes back to the main queue after our configured number of seconds has passed. We can calculate this using the retry count.

Is it already in the roadmap and if not are you able to add it? I would assume it would be fairly easy to implement as this feature of getting the value from variables is already present globally in CPI - and it would give a critical functionality to this adapter atleast via a workaround.

Thank you,

Lajitha

 

 
mandy_krimmel
Advisor
Advisor
0 Kudos
Hello Lajitha,

thank you for your proposal. Could you please raise this as feature request in the influence campaign: Influence Opportunity Homepage - Customer Influence (sap.com)

With this also other customers can vote for this feature.

Thank you,

Mandy
lmenon
Explorer
0 Kudos
Hello Mandy,

Done already. Thank you,

Improvement Request Details - Customer Influence (sap.com)

Kind regards,

Lajitha
josefp1
Member
0 Kudos
Hello Mandy,

 

great blog! Thank you very much for the valuable information.

We are currently having trouble using the AMQP Sender Adapter on SAP CPI to pick up messages from a queue on Azure Service Bus.

Are Service Bus sessions supported in the AMQP sender Adapter? If not, is this on the roadmap for the future?

The error text that we receive in the Sender Channel: It is not possible for an entity that requires sessions to create a non-sessionful message receiver.

In the Receiver channel we are able to send messages to the queue with a session ID by using the Header "JMSXGroupID".

 

Thank you,

Josef
mandy_krimmel
Advisor
Advisor
Hello Josef,

thank you for your feedback. Currently we do not support sessions in the AMQP sender adapter, only queues. I would suggest you add this request into the SAP influence campaign to collect votes from other customers as we plan extensions based on customer pull.

Best regards

Mandy
filipe_rieger
Explorer
Hello Mandy,

I am doing some tests with solace (Solace -> CPI -> Target System) and it looks like that besides using the header variable "JMSRedelivered" to identify if a incoming message is a redelivered one or not we could also use the property variable "CamelExternalRedelivered" which is also automatically set.

Any recommendations when to use the one or the other to safely identify redeliveries?
mandy_krimmel
Advisor
Advisor
0 Kudos
Hello,

we tested with JMSRedelivered, I cannot comment on CamelExternalRedelivered. As this is a Camel specific header which may change during Came updates I would suggest to not use this one.

Best regards

Mandy
AbhishekSharma1
Explorer
0 Kudos

Hello Mandy,

Thanks for sharing information in the blog and comments.

 

We are sending some files to Service bus queue using AMQP adapter. The GUID part of the Message Id in the queue are all duplicate. This is causing error in updating staging tables in Azure. We are using CPI Neo version. Can you please suggest on how to fix the problem. We would like to keep the highlighted part as the message Id and remove "ID:" and the digits at the end.

Many Thanks,

Abhishek

SB Queue

mandy_krimmel
Advisor
Advisor
0 Kudos
Hi,

Usually the producer, the broker, sets the unique message ID:

AMQP spec: ...The message producer is usually responsible for setting the message-id in such a way that it is assured to be globally unique. ...

Does your screenshot mean that Cloud Integration sends the same message multiple times? Maybe the Idempotent process call helps to send the same message only once: Define Idempotent Process Call | SAP Help Portal

Best regards

Mandy
AbhishekSharma1
Explorer
0 Kudos
Hi Mandy,

 

Thanks for your prompt reply!

Cloud integration is sending unique messages but messages are being sent at the same time. I am trying to set the messageId under Broker Properties.



 

However, the property is going in service bus as a Custom Property and not Broker Property.

 

Thanks

Abhishek
mandy_krimmel
Advisor
Advisor
0 Kudos
Hello,

maybe try to set header JMSMessageID in cloud integration and check if the message broker takes this attribute into consideration when storing the message to the queue.

Best regards

Mandy

 
AbhishekSharma1
Explorer
0 Kudos
Hello Mandy,

 

Service Bus team have updated their config. They're now generating a new message Id in a new property for each message received in the queue from CPI. Thus, the new property ensures that each message is unique.

 

Thanks

Abhishek

 
StefNoyens
Participant
Hi mandy.krimmel,

We're coming across something strange in our CPI to Event Mesh through AMQP scenario on Cloud Foundry.

CPI gives the following error:
org.springframework.jms.ResourceAllocationException: maximum number of receivers exceeded (220062) [condition = amqp:resource-limit-exceeded]; nested exception is javax.jms.ResourceAllocationException: maximum number of receivers exceeded (220062) [condition = amqp:resource-limit-exceeded], cause: org.apache.qpid.jms.provider.exceptions.ProviderConnectionResourceAllocationException: maximum number of receivers exceeded (220062) [condition = amqp:resource-limit-exceeded]

In our test case we're sending 400 small custom events (z_idoc to event conversion) across in a couple of seconds. As for now no throttling possible from S4H. In most cases 80% fails with aforementioned error message.

The strange thing is that the Message Client we're sending to has 50 Allocated Resources and only serves as the receiver for topics from this Iflow. Aside from another message client that has 200 resources which contains subscribed queues, and during the test we only see the Connections and Producers increase by 1 in the Resource Usage tab in Event Mesh instead of going to the limit.


So we're a bit at a loss where exactly this issue is coming from or what limits we're hitting.

Do you have any ideas or suggestions?


Thanks in advance,
Stef
mandy_krimmel
Advisor
Advisor
0 Kudos
Hello,

I actually got informed by this limit just today as well based on a ticket.

The limit is: number of parallel producers for a single connection is limited to 10.

This means that if an integration flow with an AMQP receiver adapter that is triggered by an HTTP based sender and there are more than 10 calls in parallel, they will run into an error.

The event mesh team will further check if this can be made configurable.

For now it could help to either reduce the parallel load or ask to increase the number of workers for the tenant, then more connections are available and the load is distributed.

Best regards

Mandy
StefNoyens
Participant
0 Kudos
Hi Mandy,

Thanks for the response!
This will probably have been our ticket.

It looks to me that the issue is still on CPI side, because the support team is upping our limit to 20 on CPI per connection.

I'm still not sure if the parallelism is the same as the producers in Event Mesh, seeing in my first question the Resource Usage in Event Mesh only increased by 1 for Producers(and Connections) during the tests.

It just strikes us a very odd to have such a low limit for something to should be able to handle massive loads.

Cfr the number of worker nodes, this doesn't automatically increase dynamically?

Kind regards,
Stef
mandy_krimmel
Advisor
Advisor
Hi

we are in discussion with the EventMesh team, the limit definitely comes from them. They are discussing to increase the 10 producers per connection now, but this may take some time as it requires carful testing

The CPI support team is increasing the number of workers for you tenant, and with this the load will be disctributed between the two workers and each can use 10 producers because each worker has an own connection.

BR

Mandy
0 Kudos
Hello Mandy

This is an excellent blog .

However I'm looking for similair blog that explain how to connect an ABAP server to an AMQP sender like Azure Bus and I'm so blocked .

I'm surprised that SAP are not providing such documentation for an intersting feature .

 

How can we configure S4 Hana to act as a client for AMQP incoming message ?

 

Regards

Lamia
mandy_krimmel
Advisor
Advisor
0 Kudos
Hi Lamia,

I'm sorry, but this I cannot answer. My expertise is in Cloud Integration. Using Cloud Integration as middleware such a scenario should probably be possible. AMQP sender -> CPI -> ABAP server.

But if there is a way for direct connection could only be answered by the S4 Hana colleagues.

Best regards

Mandy
0 Kudos
Hello Mandy

 

Thanks a lot for your reply and for the great blog as well.

 

Kind Regards

Lamia
celofiorito
Product and Topic Expert
Product and Topic Expert
0 Kudos
Hi,

I just tested IBM MQ with 9.2.0 and the QUEUE option didn't work (topic subs is ok). I think only 9.2.2 have this option available.

So, its important to correct to "versions <= 9.2.0" or "versions < 9.2.2"

All the best,

Fiorito
Willem_Pardaens
Product and Topic Expert
Product and Topic Expert
0 Kudos
Hi Mandy,

Great blog, thank you.

When using SAP Integration Suite Advanced Event Mesh as broker, the AMQP adapter will automatically create a queue on AEM side. This is great, but I noticed this queue gets created with the 'retry forever' flag by default. Is there a way (header, flag, ...) to tell the adapter to create the queue with a predefined number of retries instead? I know you can change it manually in AEM after the queue is created, but it surprised me that the default behavior on failed messages would be an infinite loop?

Thanks a lot

Willem
mandy_krimmel
Advisor
Advisor
Hello,

no, there is no such option via AMQP as this is a behavior of the connected message broker.

I would suggest to ask the question about default behavior to the colleagues responsible for the AEM, please create a ticket on BC-CP-EM-MES.

Best regards

Mandy
1safeer
Discoverer
0 Kudos
Hi Mandy,

 

Between JMS and AMQP which one you recommend to use and if we want to compare both is there any comparison list .
1safeer
Discoverer
0 Kudos
Hi Mandy,

 

Can we use Retry process without JMS or AMQP ? any blog on that

mandy_krimmel
Advisor
Advisor
0 Kudos
Hello

the retry within Cloud Integration can be used with JMS, AMQP or data store as temporary storage (Data Store Write combined with Data Store sender adapter). The recommended option is JMS as this comes with the best performance.

Best regards

Mandy
mandy_krimmel
Advisor
Advisor
0 Kudos
Hi

recommendation is to use JMS, as this is build in in Cloud Integration. For AMQP you need an external broker.

Best regards

Mandy
jalvarezms
Explorer
0 Kudos
Hi  mandy.krimmel

I hope you are well. I am in need of your wisdom and guidance regarding a connection I am setting up from SAP Cloud Integration. I am using a new adapter called 'RabbitMQ Adapter for SAP Integration Suite,' specifically Version: 1.0.4 Published: 23 May 2023. I have a free RabbitMQ account in the Cloud, and I am attempting to consume a queue from CPI using the aforementioned RabbitMQ adapter

When deploying, I am receiving the following message in the content monitor

[CONTENT][CONTENT_DEPLOY][InstanceError] : {"message":"EXCEPTION","parameters":["com.sap.adapters.factory.saprabbitmq.exception.SapRabbitMQException: Invalid sender connection parameter"]}

I'm sharing the details of RabbitMQ in the cloud with you.

Region amazon-web-services::eu-north-1
Cluster hawk.rmq.cloudamqp.com (DNS load balanced)
Hosts hawk-01.rmq.cloudamqp.com
(Availability Zone eun1-az3)

AMQP details
User & Vhost uyyxaxnp
Password ***                           (Credentials already created in Material Security.)
Ports 5672 (5671 for TLS)      (Using port 5672 without TLS.)
URL amqps://uyyxaxnp:***@hawk.rmq.cloudamqp.com/uyyxaxnp

I have created a queue in RabbitMQ

Queue: DEV_SCPI_RABBITMQ

I have created the following artifact from Cloud Integration: a RabbitMQ adapter with a sender


Host:hawk-01.rmq.cloudamqp.com

port: 5672

virtual Host : /    (I don't know what value to indicate.)

Authentication: SASL

Credential Name TESTING_RABBITMQ  (Credentials already created in Material Security.)


 

Queue Name: The queue is named 'DEV_SCPI_RABBITMQ.' I'm not sure if what I'm indicating is correct

 

 


 

 

[CONTENT][CONTENT_DEPLOY][RuntimeError] : {"message":"EXCEPTION","parameters":["com.sap.adapters.factory.saprabbitmq.exception.SapRabbitMQException: Invalid sender connection parameter"]}
jalvarezms
Explorer
0 Kudos
Hi mandy.krimmel

I managed to identify my mistake, and it was the virtual host; I needed to specify the user


Host:hawk-01.rmq.cloudamqp.com

port: 5672

virtual Host : uyyxaxnp    

Authentication: SASL

Credential Name TESTING_RABBITMQ  (Credentials already created in Material Security.)

mandy_krimmel
Advisor
Advisor
thank you for your information. May help others as well.

Best regards

Mandy
aditinayak27
Explorer
0 Kudos
Hi Mandy,

 

I am facing error " com.sap.it.rt.adapter.http.api.exception.HttpResponseException: An internal server error occured: Request to open resource AmqpFixedProducer { ID:9ae502fb-4ce9-4f1d-a077-02ce2ce7f0ef:1:1:1 } timed out. The MPL ID for the failed message is : AGU2NsvyQcphJdSWPBbgVr6lpf9R"

Receiver is Rabbitmq. I have connected using AMQP adapter. After trigging the data, i am getting this error.

 

Where can be the issue. Kindly please suggest.

Thanks & Regards
mandy_krimmel
Advisor
Advisor
0 Kudos
Hello,

first I would suggest to use the AMQP connectivity test to check the connection. It looks like the connection to the broker does not work. If this does not help, you could look up the default trace to check for errors. Else, please open a support ticket and attach the flow and the respective error details.

Best regards

Mandy
Parthi1
Explorer
0 Kudos

Hi @mandy_krimmel 

Could you please help us in understanding the usability of concurrent process parameter in AMQP adapter. Our tenant is running with 8 nodes and we are using Cloud connector to connect to messaging system. And the AMQP sender adapter is configured with 10 concurrent processes.  In messaging system and in the cloud connector we could see only 8 connections. But we expecting to see 80 connections (8 Nodes * 10 Concurrent Processes) created from SAP Integration Suite to Messaging System. And there are around 10k messages to be consumed from the messaging system. Please advise on this behavior.

 

Thanks

Parthi

mandy_krimmel
Advisor
Advisor
0 Kudos

Hi @Parthi1 The concurrent processes do not open dedicated connections. There is one connection per worker, but 10 processes should consume in parallel via this one connection. Can you see the messages being consumed in the message monitoring?

Best regards

mandy

Parthi1
Explorer
0 Kudos

Hi @mandy_krimmel 

Thank you for your quick response.

We could see the messages being consumed in the message monitoring. But don’t see any difference in processing time between concurrent processes 1 and 10 (or 25). Hence would like to validate whether the concurrent processing is happening in the backend. 

Thanks

Parthi

mandy_krimmel
Advisor
Advisor
0 Kudos

If you don't see a difference, probably the amount of messages in the queues is not large enough? Is there a real backlog in the queue that needs to be handled? If so and there is no upscaling of the processes even if configured I would suggest you open a ticket on LOD-HCI-PI-CON-SOAP

Thank you

Mandy