/** * 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.camel.component.sjms.jms; import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.ExceptionListener; import javax.jms.Session; import org.apache.camel.util.ObjectHelper; import org.apache.commons.pool.BasePoolableObjectFactory; import org.apache.commons.pool.impl.GenericObjectPool; /** * The default {@link ConnectionResource} implementation for the SJMSComponent. */ public class ConnectionFactoryResource extends BasePoolableObjectFactory<Connection> implements ConnectionResource { private static final long DEFAULT_WAIT_TIMEOUT = 5 * 1000; private static final int DEFAULT_POOL_SIZE = 1; private GenericObjectPool<Connection> connections; private ConnectionFactory connectionFactory; private String username; private String password; private String clientId; private ExceptionListener exceptionListener; /** * Default Constructor */ public ConnectionFactoryResource() { this(DEFAULT_POOL_SIZE, null); } public ConnectionFactoryResource(int poolSize, ConnectionFactory connectionFactory) { this(poolSize, connectionFactory, null, null); } public ConnectionFactoryResource(int poolSize, ConnectionFactory connectionFactory, String username, String password) { this(poolSize, connectionFactory, username, password, null); } public ConnectionFactoryResource(int poolSize, ConnectionFactory connectionFactory, String username, String password, String connectionId) { this(poolSize, connectionFactory, username, password, connectionId, DEFAULT_WAIT_TIMEOUT); } public ConnectionFactoryResource(int poolSize, ConnectionFactory connectionFactory, String username, String password, String connectionId, long maxWait) { this(poolSize, connectionFactory, username, password, connectionId, DEFAULT_WAIT_TIMEOUT, true); } public ConnectionFactoryResource(int poolSize, ConnectionFactory connectionFactory, String username, String password, String connectionId, long maxWait, boolean testOnBorrow) { this.connectionFactory = connectionFactory; this.username = username; this.password = password; this.clientId = connectionId; this.connections = new GenericObjectPool<Connection>(this); this.connections.setMaxWait(maxWait); this.connections.setMaxActive(poolSize); this.connections.setMaxIdle(poolSize); this.connections.setMinIdle(poolSize); this.connections.setLifo(false); this.connections.setTestOnBorrow(testOnBorrow); } @Override public boolean validateObject(Connection connection) { try { // ensure connection works so we need to start it connection.start(); return true; } catch (Throwable e) { // ignore } return false; } @Override public Connection borrowConnection() throws Exception { return connections.borrowObject(); } @Override public void returnConnection(Connection connection) throws Exception { connections.returnObject(connection); } @Override public Connection makeObject() throws Exception { Connection connection = null; if (connectionFactory != null) { if (getUsername() != null && getPassword() != null) { connection = connectionFactory.createConnection(getUsername(), getPassword()); } else { connection = connectionFactory.createConnection(); } } if (connection != null) { if (ObjectHelper.isNotEmpty(getClientId())) { connection.setClientID(getClientId()); } // we want to listen for exceptions if (exceptionListener != null) { connection.setExceptionListener(exceptionListener); } connection.start(); } return connection; } @Override public void destroyObject(Connection connection) throws Exception { if (connection != null) { connection.stop(); connection.close(); } } public ConnectionFactory getConnectionFactory() { return connectionFactory; } public void setConnectionFactory(ConnectionFactory connectionFactory) { this.connectionFactory = connectionFactory; } 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 String getClientId() { return clientId; } public void setClientId(String clientId) { this.clientId = clientId; } public ExceptionListener getExceptionListener() { return exceptionListener; } public void setExceptionListener(ExceptionListener exceptionListener) { this.exceptionListener = exceptionListener; } public int size() { return connections.getNumActive() + connections.getNumIdle(); } public void fillPool() throws Exception { while (connections.getNumIdle() < connections.getMaxIdle()) { connections.addObject(); } } public void drainPool() throws Exception { connections.close(); } }