All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.sap.cds.feature.messaging.em.jms.EnterpriseMessagingConnectionProvider Maven / Gradle / Ivy

/**************************************************************************
 * (C) 2019-2024 SAP SE or an SAP affiliate company. All rights reserved. *
 **************************************************************************/
package com.sap.cds.feature.messaging.em.jms;

import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.sap.cds.services.messaging.jms.BrokerConnection;
import com.sap.cds.services.messaging.jms.BrokerConnectionProvider;
import com.sap.cloud.environment.servicebinding.api.ServiceBinding;
import com.sap.cloud.servicesdk.xbem.core.MessagingServiceFactory;
import com.sap.cloud.servicesdk.xbem.core.exception.MessagingException;
import com.sap.cloud.servicesdk.xbem.core.impl.MessagingServiceFactoryCreator;
import com.sap.cloud.servicesdk.xbem.extension.sapcp.jms.MessagingServiceJmsConnectionFactory;
import com.sap.cloud.servicesdk.xbem.extension.sapcp.jms.MessagingServiceJmsSettings;


/**
 *  Implementation of the {@link BrokerConnectionProvider} class for enterprise messaging.
 */
public class EnterpriseMessagingConnectionProvider extends BrokerConnectionProvider {

	private static final Logger logger = LoggerFactory.getLogger(EnterpriseMessagingConnectionProvider.class);

	private final ServiceBinding binding;

	public EnterpriseMessagingConnectionProvider(ServiceBinding binding) {
		super(binding.getName().get());
		this.binding = binding;
	}

	@Override
	public BrokerConnection createBrokerConnection(String name, Map clientProperties) throws MessagingException {

		MessagingServiceJmsSettings settings = new MessagingServiceJmsSettings();

		// backwards compatibility
		int oldMaxReconnectAttempts = getIntClientProperty("MaxReconnectAttempts", 10, clientProperties);
		int oldInitialReconnectDelay = getIntClientProperty("InitialReconnectDelay", 5000, clientProperties);
		int oldReconnectDelay = getIntClientProperty("ReconnectDelay", 5000, clientProperties);

		settings.setFailoverMaxReconnectAttempts(getIntClientProperty("FailoverMaxReconnectAttempts", oldMaxReconnectAttempts, clientProperties));
		settings.setFailoverInitialReconnectDelay(getIntClientProperty("FailoverInitialReconnectDelay", oldInitialReconnectDelay, clientProperties));
		settings.setFailoverReconnectDelay(getIntClientProperty("FailoverReconnectDelay", oldReconnectDelay, clientProperties));
		settings.setAmqpIdleTimeout(getIntClientProperty("AmqpIdleTimeout", -1, clientProperties));

		MessagingServiceFactory messagingServiceFactory =
				MessagingServiceFactoryCreator.createFactoryFromCredentials(binding.getCredentials());

		// create the broker connection
		BrokerConnection connection = new BrokerConnection(name,
				messagingServiceFactory.createConnectionFactory(MessagingServiceJmsConnectionFactory.class, settings));

		return connection;
	}

	private int getIntClientProperty(String prop, int def, Map clientProperties) {

		if (clientProperties == null) {
			return def;
		}

		String val = getClientProperty(prop, clientProperties);

		if (val != null) {
			try {
				return Integer.parseInt(val);
			} catch (NumberFormatException e) {
				logger.error("invalid client configuration value of '{}' property. The default value '{}' is used", prop, def);
			}
		}

		return def;
	}

	private String getClientProperty(String prop, Map clientProperties) {

		return clientProperties.entrySet().stream()
				.filter(e -> e.getKey().equalsIgnoreCase(prop))
				.map(e -> e.getValue())
				.findFirst()
				.orElse(null);
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy