blob: 04b67ef24642ed6b317b5bf919df2409dc478f67 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.cxf.transport.jms;
import java.util.Properties;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.naming.NamingException;
import javax.transaction.TransactionManager;
import org.apache.cxf.common.injection.NoJSR250Annotations;
import org.apache.cxf.transport.jms.util.DestinationResolver;
import org.apache.cxf.transport.jms.util.JMSDestinationResolver;
import org.apache.cxf.transport.jms.util.JndiHelper;
@NoJSR250Annotations
public class JMSConfiguration {
/**
* Default value to mark as unset
*/
public static final int DEFAULT_VALUE = -1;
private volatile ConnectionFactory connectionFactory;
private Properties jndiEnvironment;
private String connectionFactoryName;
private String userName;
private String password;
private DestinationResolver destinationResolver = new JMSDestinationResolver();
private boolean pubSubNoLocal;
private Long clientReceiveTimeout = 60000L;
private Long serverReceiveTimeout;
private boolean explicitQosEnabled;
private int deliveryMode = Message.DEFAULT_DELIVERY_MODE;
private int priority = Message.DEFAULT_PRIORITY;
private long timeToLive = Message.DEFAULT_TIME_TO_LIVE;
private boolean sessionTransacted;
private boolean createSecurityContext = true;
private int concurrentConsumers = 1;
private int maxSuspendedContinuations = DEFAULT_VALUE;
private int reconnectPercentOfMax = 70;
private volatile String messageSelector;
private boolean subscriptionDurable;
private String durableSubscriptionClientId;
private String durableSubscriptionName;
private String targetDestination;
/**
* Destination name to listen on for reply messages
*/
private String replyDestination;
private volatile Destination replyDestinationDest;
/**
* Destination name to send out as replyTo address in the message
*/
private String replyToDestination;
private String messageType = JMSConstants.TEXT_MESSAGE_TYPE;
private boolean pubSubDomain;
private boolean replyPubSubDomain;
/**
* Default to use conduitIdSelector as it allows to receive using a listener
* which improves performance.
* Set to false to use message id as correlation id for compatibility with IBM MQ.
*/
private boolean useConduitIdSelector = true;
private String conduitSelectorPrefix;
private boolean jmsProviderTibcoEms;
private TransactionManager transactionManager;
// For jms spec. Do not configure manually
private String targetService;
private String requestURI;
private int retryInterval;
public void ensureProperlyConfigured() {
ConnectionFactory cf = getConnectionFactory();
if (cf == null) {
throw new IllegalArgumentException("connectionFactory may not be null");
}
if (targetDestination == null) {
throw new IllegalArgumentException("targetDestination may not be null");
}
}
public Properties getJndiEnvironment() {
return jndiEnvironment;
}
public void setJndiEnvironment(Properties jndiEnvironment) {
this.jndiEnvironment = jndiEnvironment;
}
public String getConnectionFactoryName() {
return connectionFactoryName;
}
public void setConnectionFactoryName(String connectionFactoryName) {
this.connectionFactoryName = connectionFactoryName;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public boolean isPubSubNoLocal() {
return pubSubNoLocal;
}
public void setPubSubNoLocal(boolean pubSubNoLocal) {
this.pubSubNoLocal = pubSubNoLocal;
}
public Long getReceiveTimeout() {
return clientReceiveTimeout;
}
public void setReceiveTimeout(Long receiveTimeout) {
this.clientReceiveTimeout = receiveTimeout;
}
public Long getServerReceiveTimeout() {
return serverReceiveTimeout;
}
public void setServerReceiveTimeout(Long receiveTimeout) {
this.serverReceiveTimeout = receiveTimeout;
}
public boolean isExplicitQosEnabled() {
return explicitQosEnabled;
}
public void setExplicitQosEnabled(boolean explicitQosEnabled) {
this.explicitQosEnabled = explicitQosEnabled;
}
public int getDeliveryMode() {
return deliveryMode;
}
public void setDeliveryMode(int deliveryMode) {
this.deliveryMode = deliveryMode;
}
public int getPriority() {
return priority;
}
public void setPriority(int priority) {
this.priority = priority;
}
public long getTimeToLive() {
return timeToLive;
}
public void setTimeToLive(long timeToLive) {
this.timeToLive = timeToLive;
}
public String getMessageSelector() {
return messageSelector;
}
public void setMessageSelector(String messageSelector) {
this.messageSelector = messageSelector;
}
public void setConduitSelectorPrefix(String conduitSelectorPrefix) {
this.conduitSelectorPrefix = conduitSelectorPrefix;
}
public String getConduitSelectorPrefix() {
if (conduitSelectorPrefix == null) {
return "";
}
return conduitSelectorPrefix;
}
public boolean isSetConduitSelectorPrefix() {
return conduitSelectorPrefix != null;
}
public boolean isSubscriptionDurable() {
return subscriptionDurable;
}
public void setSubscriptionDurable(boolean subscriptionDurable) {
this.subscriptionDurable = subscriptionDurable;
}
public String getDurableSubscriptionName() {
return durableSubscriptionName;
}
public void setDurableSubscriptionName(String durableSubscriptionName) {
this.durableSubscriptionName = durableSubscriptionName;
}
public void afterPropertiesSet() throws Exception {
if (connectionFactory == null) {
throw new RuntimeException("Required property connectionfactory was not set");
}
}
public void setConnectionFactory(ConnectionFactory connectionFactory) {
this.connectionFactory = connectionFactory;
}
public String getTargetDestination() {
return targetDestination;
}
public void setTargetDestination(String targetDestination) {
this.targetDestination = targetDestination;
}
public String getReplyDestination() {
return replyDestination;
}
public void setReplyDestination(String replyDestination) {
this.replyDestination = replyDestination;
}
public String getReplyToDestination() {
return replyToDestination != null ? replyToDestination : replyDestination;
}
public void setReplyToDestination(String replyToDestination) {
this.replyToDestination = replyToDestination;
}
public String getMessageType() {
return messageType;
}
public void setMessageType(String messageType) {
this.messageType = messageType;
}
public boolean isPubSubDomain() {
return pubSubDomain;
}
public void setPubSubDomain(boolean pubSubDomain) {
this.pubSubDomain = pubSubDomain;
}
public boolean isReplyPubSubDomain() {
return replyPubSubDomain;
}
public void setReplyPubSubDomain(boolean replyPubSubDomain) {
this.replyPubSubDomain = replyPubSubDomain;
}
public DestinationResolver getDestinationResolver() {
return destinationResolver;
}
public void setDestinationResolver(DestinationResolver destinationResolver) {
this.destinationResolver = destinationResolver;
}
public boolean isSessionTransacted() {
return sessionTransacted;
}
public void setSessionTransacted(boolean sessionTransacted) {
this.sessionTransacted = sessionTransacted;
}
public boolean isCreateSecurityContext() {
return createSecurityContext;
}
public void setCreateSecurityContext(boolean b) {
this.createSecurityContext = b;
}
/**
* For compatibility with old spring based code
* @param transactionManager
*/
@Deprecated
public void setTransactionManager(Object transactionManager) {
}
public int getConcurrentConsumers() {
return concurrentConsumers;
}
public void setConcurrentConsumers(int concurrentConsumers) {
this.concurrentConsumers = concurrentConsumers;
}
public int getMaxSuspendedContinuations() {
return maxSuspendedContinuations;
}
public void setMaxSuspendedContinuations(int maxSuspendedContinuations) {
this.maxSuspendedContinuations = maxSuspendedContinuations;
}
public int getReconnectPercentOfMax() {
return reconnectPercentOfMax;
}
public void setReconnectPercentOfMax(int reconnectPercentOfMax) {
this.reconnectPercentOfMax = reconnectPercentOfMax;
}
public void setUseConduitIdSelector(boolean useConduitIdSelector) {
this.useConduitIdSelector = useConduitIdSelector;
}
public boolean isUseConduitIdSelector() {
return useConduitIdSelector;
}
@Deprecated
public void setReconnectOnException(boolean reconnectOnException) {
// Ignore. We always reconnect on exceptions
}
public ConnectionFactory getConnectionFactory() {
ConnectionFactory factory = connectionFactory;
if (factory == null) {
synchronized (this) {
factory = connectionFactory;
if (factory == null) {
factory = getConnectionFactoryFromJndi();
connectionFactory = factory;
}
}
}
return factory;
}
/**
* Retrieve connection factory from JNDI
*
* @param jmsConfig
* @param jndiConfig
* @return
*/
private ConnectionFactory getConnectionFactoryFromJndi() {
if (getJndiEnvironment() == null || getConnectionFactoryName() == null) {
return null;
}
try {
ConnectionFactory cf = new JndiHelper(getJndiEnvironment()).
lookup(getConnectionFactoryName(), ConnectionFactory.class);
return cf;
} catch (NamingException e) {
throw new RuntimeException(e);
}
}
public String getDurableSubscriptionClientId() {
return durableSubscriptionClientId;
}
public void setDurableSubscriptionClientId(String durableSubscriptionClientId) {
this.durableSubscriptionClientId = durableSubscriptionClientId;
}
public void setTargetService(String targetService) {
this.targetService = targetService;
}
public String getTargetService() {
return targetService;
}
public void setRequestURI(String requestURI) {
this.requestURI = requestURI;
}
public String getRequestURI() {
return requestURI;
}
/** * @return Returns the jmsProviderTibcoEms.
*/
public boolean isJmsProviderTibcoEms() {
return jmsProviderTibcoEms;
}
/**
* @param jmsProviderTibcoEms The jmsProviderTibcoEms to set.
*/
public void setJmsProviderTibcoEms(boolean jmsProviderTibcoEms) {
this.jmsProviderTibcoEms = jmsProviderTibcoEms;
}
public static Destination resolveOrCreateDestination(final Session session,
final DestinationResolver resolver,
final String replyToDestinationName,
final boolean pubSubDomain) throws JMSException {
if (replyToDestinationName == null) {
return session.createTemporaryQueue();
}
return resolver.resolveDestinationName(session, replyToDestinationName, pubSubDomain);
}
public Destination getReplyToDestination(Session session, String userDestination) throws JMSException {
if (userDestination == null) {
return getReplyDestination(session);
}
return destinationResolver.resolveDestinationName(session, userDestination, replyPubSubDomain);
}
public Destination getReplyDestination(Session session) throws JMSException {
Destination result = replyDestinationDest;
if (result == null) {
synchronized (this) {
result = replyDestinationDest;
if (result == null) {
result = replyDestination == null
? session.createTemporaryQueue()
: destinationResolver.resolveDestinationName(session, replyDestination, replyPubSubDomain);
replyDestinationDest = result;
}
}
}
return result;
}
public Destination getTargetDestination(Session session) throws JMSException {
return destinationResolver.resolveDestinationName(session, targetDestination, pubSubDomain);
}
public Destination getReplyDestination(Session session, String replyToName) throws JMSException {
return destinationResolver.resolveDestinationName(session, replyToName, replyPubSubDomain);
}
public TransactionManager getTransactionManager() {
return this.transactionManager;
}
public void setTransactionManager(TransactionManager transactionManager) {
this.transactionManager = transactionManager;
}
public int getRetryInterval() {
return this.retryInterval;
}
public void setRetryInterval(int retryInterval) {
this.retryInterval = retryInterval;
}
}