001 /**
002 *
003 * Licensed to the Apache Software Foundation (ASF) under one or more
004 * contributor license agreements. See the NOTICE file distributed with
005 * this work for additional information regarding copyright ownership.
006 * The ASF licenses this file to You under the Apache License, Version 2.0
007 * (the "License"); you may not use this file except in compliance with
008 * the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018 package org.apache.activemq.spring;
019
020 import java.util.ArrayList;
021 import java.util.List;
022
023 import org.springframework.beans.factory.FactoryBean;
024
025 /**
026 * A helper class for creating a failover configured {@link ActiveMQConnectionFactory}
027 * which supports one or more TCP based hostname/ports which can all be configured in a
028 * consistent way without too much URL hacking.
029 *
030 *
031 */
032 public class ActiveMQConnectionFactoryFactoryBean implements FactoryBean {
033 private List<String> tcpHostAndPorts = new ArrayList<String>();
034
035 // tcp properties
036 private Long maxInactivityDuration;
037 private String tcpProperties;
038
039 // failover properties
040 private Long maxReconnectDelay;
041 private String failoverProperties;
042
043 public Object getObject() throws Exception {
044 ActiveMQConnectionFactory answer = new ActiveMQConnectionFactory();
045 String brokerURL = getBrokerURL();
046 answer.setBrokerURL(brokerURL);
047 return answer;
048 }
049
050 public String getBrokerURL() {
051 StringBuffer buffer = new StringBuffer("failover:(");
052 int counter = 0;
053 for (String tcpHostAndPort : tcpHostAndPorts) {
054 if (counter++ > 0) {
055 buffer.append(",");
056 }
057 buffer.append(createTcpHostAndPortUrl(tcpHostAndPort));
058 }
059 buffer.append(")");
060
061 List<String> parameters = new ArrayList<String>();
062 if (maxReconnectDelay != null) {
063 parameters.add("maxReconnectDelay=" + maxReconnectDelay);
064 }
065 if (notEmpty(failoverProperties)) {
066 parameters.add(failoverProperties);
067 }
068 buffer.append(asQueryString(parameters));
069 return buffer.toString();
070 }
071
072 public Class getObjectType() {
073 return ActiveMQConnectionFactory.class;
074 }
075
076 public boolean isSingleton() {
077 return true;
078 }
079
080 // Properties
081 //-------------------------------------------------------------------------
082
083 public List<String> getTcpHostAndPorts() {
084 return tcpHostAndPorts;
085 }
086
087 public void setTcpHostAndPorts(List<String> tcpHostAndPorts) {
088 this.tcpHostAndPorts = tcpHostAndPorts;
089 }
090
091 public void setTcpHostAndPort(String tcpHostAndPort) {
092 tcpHostAndPorts = new ArrayList<String>();
093 tcpHostAndPorts.add(tcpHostAndPort);
094 }
095
096 public Long getMaxInactivityDuration() {
097 return maxInactivityDuration;
098 }
099
100 public void setMaxInactivityDuration(Long maxInactivityDuration) {
101 this.maxInactivityDuration = maxInactivityDuration;
102 }
103
104 public String getTcpProperties() {
105 return tcpProperties;
106 }
107
108 public void setTcpProperties(String tcpProperties) {
109 this.tcpProperties = tcpProperties;
110 }
111
112 public Long getMaxReconnectDelay() {
113 return maxReconnectDelay;
114 }
115
116 public void setMaxReconnectDelay(Long maxReconnectDelay) {
117 this.maxReconnectDelay = maxReconnectDelay;
118 }
119
120 public String getFailoverProperties() {
121 return failoverProperties;
122 }
123
124 public void setFailoverProperties(String failoverProperties) {
125 this.failoverProperties = failoverProperties;
126 }
127
128 // Implementation methods
129 //-------------------------------------------------------------------------
130
131 /**
132 * Turns a list of query string key=value strings into a query URL string
133 * of the form "?a=x&b=y"
134 */
135 protected String asQueryString(List<String> parameters) {
136 int size = parameters.size();
137 if (size < 1) {
138 return "";
139 }
140 else {
141 StringBuffer buffer = new StringBuffer("?");
142 buffer.append(parameters.get(0));
143 for (int i = 1; i < size; i++) {
144 buffer.append("&");
145 buffer.append(parameters.get(i));
146 }
147 return buffer.toString();
148 }
149 }
150
151 /**
152 * Allows us to add any TCP specific URI configurations
153 */
154 protected String createTcpHostAndPortUrl(String tcpHostAndPort) {
155 List<String> parameters = new ArrayList<String>();
156 if (maxInactivityDuration != null) {
157 parameters.add("wireFormat.maxInactivityDuration=" + maxInactivityDuration);
158 }
159 if (notEmpty(tcpProperties)) {
160 parameters.add(tcpProperties);
161 }
162 return tcpHostAndPort + asQueryString(parameters);
163 }
164
165
166 protected boolean notEmpty(String text) {
167 return text != null && text.length() > 0;
168 }
169
170 }