/** * * 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.activemq.spring; import java.util.ArrayList; import java.util.List; import org.springframework.beans.factory.FactoryBean; /** * A helper class for creating a failover configured {@link ActiveMQConnectionFactory} * which supports one or more TCP based hostname/ports which can all be configured in a * consistent way without too much URL hacking. * * */ public class ActiveMQConnectionFactoryFactoryBean implements FactoryBean { private List<String> tcpHostAndPorts = new ArrayList<String>(); // tcp properties private Long maxInactivityDuration; private String tcpProperties; // failover properties private Long maxReconnectDelay; private String failoverProperties; public Object getObject() throws Exception { ActiveMQConnectionFactory answer = new ActiveMQConnectionFactory(); String brokerURL = getBrokerURL(); answer.setBrokerURL(brokerURL); return answer; } public String getBrokerURL() { StringBuffer buffer = new StringBuffer("failover:("); int counter = 0; for (String tcpHostAndPort : tcpHostAndPorts) { if (counter++ > 0) { buffer.append(","); } buffer.append(createTcpHostAndPortUrl(tcpHostAndPort)); } buffer.append(")"); List<String> parameters = new ArrayList<String>(); if (maxReconnectDelay != null) { parameters.add("maxReconnectDelay=" + maxReconnectDelay); } if (notEmpty(failoverProperties)) { parameters.add(failoverProperties); } buffer.append(asQueryString(parameters)); return buffer.toString(); } public Class getObjectType() { return ActiveMQConnectionFactory.class; } public boolean isSingleton() { return true; } // Properties //------------------------------------------------------------------------- public List<String> getTcpHostAndPorts() { return tcpHostAndPorts; } public void setTcpHostAndPorts(List<String> tcpHostAndPorts) { this.tcpHostAndPorts = tcpHostAndPorts; } public void setTcpHostAndPort(String tcpHostAndPort) { tcpHostAndPorts = new ArrayList<String>(); tcpHostAndPorts.add(tcpHostAndPort); } public Long getMaxInactivityDuration() { return maxInactivityDuration; } public void setMaxInactivityDuration(Long maxInactivityDuration) { this.maxInactivityDuration = maxInactivityDuration; } public String getTcpProperties() { return tcpProperties; } public void setTcpProperties(String tcpProperties) { this.tcpProperties = tcpProperties; } public Long getMaxReconnectDelay() { return maxReconnectDelay; } public void setMaxReconnectDelay(Long maxReconnectDelay) { this.maxReconnectDelay = maxReconnectDelay; } public String getFailoverProperties() { return failoverProperties; } public void setFailoverProperties(String failoverProperties) { this.failoverProperties = failoverProperties; } // Implementation methods //------------------------------------------------------------------------- /** * Turns a list of query string key=value strings into a query URL string * of the form "?a=x&b=y" */ protected String asQueryString(List<String> parameters) { int size = parameters.size(); if (size < 1) { return ""; } else { StringBuffer buffer = new StringBuffer("?"); buffer.append(parameters.get(0)); for (int i = 1; i < size; i++) { buffer.append("&"); buffer.append(parameters.get(i)); } return buffer.toString(); } } /** * Allows us to add any TCP specific URI configurations */ protected String createTcpHostAndPortUrl(String tcpHostAndPort) { List<String> parameters = new ArrayList<String>(); if (maxInactivityDuration != null) { parameters.add("wireFormat.maxInactivityDuration=" + maxInactivityDuration); } if (notEmpty(tcpProperties)) { parameters.add(tcpProperties); } return tcpHostAndPort + asQueryString(parameters); } protected boolean notEmpty(String text) { return text != null && text.length() > 0; } }