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

org.frameworkset.mq.AMQConnectionFactory Maven / Gradle / Ivy

The newest version!
/*
 *  Copyright 2008 biaoping.yin
 *
 *  Licensed 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.frameworkset.mq;

import java.beans.IntrospectionException;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Session;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.ActiveMQSslConnectionFactory;
import org.apache.activemq.RedeliveryPolicy;
import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.command.ActiveMQTempQueue;
import org.apache.activemq.command.ActiveMQTempTopic;
import org.apache.activemq.command.ActiveMQTopic;
import org.apache.activemq.pool.PooledConnectionFactory;
import org.frameworkset.spi.BaseSPIManager2;
import org.frameworkset.spi.assemble.BeanAccembleHelper;
import org.frameworkset.spi.assemble.Pro;
import org.frameworkset.spi.assemble.ProMap;
import org.frameworkset.spi.remote.SSLHelper;

/**
 * 

* Title: AMQConnectionFactory.java *

*

* Description: *

*

* bboss workgroup *

*

* Copyright (c) 2007 *

* * @Date 2009-11-22 上午10:56:33 * @author biaoping.yin * @version 1.0 */ public class AMQConnectionFactory extends JMSConnectionFactory { private Map factoryparams; // @SuppressWarnings("unchecked") // private ProMap prefetchParams; // @SuppressWarnings("unchecked") // private ProMap redirectParams; private String keyStore; private String keyStorepassword; private String trustStore; private String trustPassword; private boolean ssl; @SuppressWarnings("unchecked") public AMQConnectionFactory(String connectURI, String username, String password, boolean usepool, boolean ssl, String keyStore, String keyStorepassword, String trustStore, String trustPassword, Map factoryparams ) { super(connectURI, username, password, JMSConnectionFactory.JMSProvider_ACTIVEMQ, usepool, factoryparams); if(factoryparams != null) this.factoryparams = factoryparams; // this.prefetchParams = prefetchParams; this.ssl = ssl; this.keyStore = keyStore; this.keyStorepassword = keyStorepassword; this.trustStore = trustStore; this.trustPassword = trustPassword; // this.redirectParams = redirectParams; } public AMQConnectionFactory(String connectURI, String username, String password, boolean usepool) { super(connectURI, username, password, JMSConnectionFactory.JMSProvider_ACTIVEMQ, usepool, null); } public AMQConnectionFactory(String connectURI, String username, String password, boolean usepool, ProMap factoryparams) { super(connectURI, username, password, JMSConnectionFactory.JMSProvider_ACTIVEMQ, usepool, null); this.factoryparams = factoryparams; // this.prefetchParams = prefetchParams; // this.redirectParams = redirectParams; } public AMQConnectionFactory(String connectURI, String username, String password, ProMap factoryparams) { this(connectURI, username, password,false, factoryparams); // this.prefetchParams = prefetchParams; // this.redirectParams = redirectParams; } public AMQConnectionFactory(String connectURI, String username, String password) { super(connectURI, username, password, JMSConnectionFactory.JMSProvider_ACTIVEMQ, false, null); } public AMQConnectionFactory(String connectURI) { super(connectURI, null, null, JMSConnectionFactory.JMSProvider_ACTIVEMQ, false, null); } public ConnectionFactory buildConnectionFactory() throws Exception { if (!this.ssl) return this.createActiveMQConnectionFactory(); else return this.createSSLConnectionFactory(); } public static String connection_params = "connection.params"; public static String connection_params_prefetchPolicy = "connection.params.prefetchPolicy"; public static String connection_params_reconnectPolicy = "connection.params.reconnectPolicy"; public static String connection_params_redirectPolicy = "connection.params.redirectPolicy"; /** * tcp 协议获取链接 * * @param brokerURL * tcp地址-(tcp://192.168.11.107:61615) * @param name * 用户名-(name) * @param password * 密码-(password) * @return */ @SuppressWarnings("unchecked") public ConnectionFactory createActiveMQConnectionFactory() throws Exception { ConnectionFactory instance = null; ActiveMQConnectionFactory instance_ = new ActiveMQConnectionFactory(); // tcp://192.168.11.107:61615 instance_.setBrokerURL(formatServerURL(this.connectURI)); instance_.setUserName(this.username); instance_.setPassword(this.password); if(factoryparams != null) { try { if(factoryparams instanceof ProMap){ ProMap temp = (ProMap)factoryparams; ProMap connectionParams = temp.getMap(connection_params); ProMap globalconnectionParams = BaseSPIManager2.getMapProperty(connection_params); if(connectionParams != globalconnectionParams) BeanAccembleHelper.injectProperties(instance_,globalconnectionParams, connectionParams); else BeanAccembleHelper.injectProperties(instance_, connectionParams); org.apache.activemq.ActiveMQPrefetchPolicy a = new org.apache.activemq.ActiveMQPrefetchPolicy(); ProMap prefetchParams = temp.getMap(connection_params_prefetchPolicy); ProMap globalprefetchParams = BaseSPIManager2.getMapProperty(connection_params_prefetchPolicy); if(prefetchParams != globalprefetchParams) BeanAccembleHelper.injectProperties(a, globalprefetchParams,prefetchParams); else BeanAccembleHelper.injectProperties(a,prefetchParams); instance_.setPrefetchPolicy(a); RedeliveryPolicy r = new RedeliveryPolicy(); ProMap redirectParams = temp.getMap(connection_params_redirectPolicy); ProMap globalredirectParams = BaseSPIManager2.getMapProperty(connection_params_redirectPolicy); if(redirectParams != globalredirectParams) BeanAccembleHelper.injectProperties(r,globalredirectParams, redirectParams); else BeanAccembleHelper.injectProperties(r, redirectParams); instance_.setRedeliveryPolicy(r); }else{ Map temp = (Map)factoryparams; ProMap connectionParams = (ProMap)temp.get(connection_params); ProMap globalconnectionParams = BaseSPIManager2.getMapProperty(connection_params); if(connectionParams != globalconnectionParams) BeanAccembleHelper.injectProperties(instance_,globalconnectionParams, connectionParams); else BeanAccembleHelper.injectProperties(instance_, connectionParams); org.apache.activemq.ActiveMQPrefetchPolicy a = new org.apache.activemq.ActiveMQPrefetchPolicy(); ProMap prefetchParams = (ProMap)temp.get(connection_params_prefetchPolicy); ProMap globalprefetchParams = BaseSPIManager2.getMapProperty(connection_params_prefetchPolicy); if(prefetchParams != globalprefetchParams) BeanAccembleHelper.injectProperties(a, globalprefetchParams,prefetchParams); else BeanAccembleHelper.injectProperties(a,prefetchParams); instance_.setPrefetchPolicy(a); RedeliveryPolicy r = new RedeliveryPolicy(); ProMap redirectParams = (ProMap)temp.get(connection_params_redirectPolicy); ProMap globalredirectParams = BaseSPIManager2.getMapProperty(connection_params_redirectPolicy); if(redirectParams != globalredirectParams) BeanAccembleHelper.injectProperties(r,globalredirectParams, redirectParams); else BeanAccembleHelper.injectProperties(r, redirectParams); instance_.setRedeliveryPolicy(r); } } catch (IntrospectionException e) { throw e; } } // instance = new PooledConnectionFactory(instance_); // mapActiveMQConnectionFactory.put(key, instance); if (this.usepool) { instance = new PooledConnectionFactory(instance_); } else { instance = instance_; } return instance; } // /** // * 默认存在的参数 backOffMultiplier change reconnectDelayExponent 文档提供的参数不正确 // */ // public static final String[] param = { "initialReconnectDelay", // "maxReconnectDelay", "useExponentialBackOff", // "reconnectDelayExponent", "maxReconnectAttempts", "randomize" }; public List getParams(ProMap reconnectPolicy) { Set keys = reconnectPolicy.keySet(); List list = new ArrayList(); if(keys.size() > 0) { Iterator it = keys.iterator(); while(it.hasNext()) { String key = it.next(); if(key.equals("USE_FAILOVER")) continue; if(key.startsWith("reconnectPolicy.")) list.add(key.substring("reconnectPolicy.".length())); else list.add(key); } } return list; } /** * 是否启用故障恢复机制,如果使用了将url增加参数 * * @param mq * @return */ private String formatServerURL(String brokerurl) { if(this.factoryparams != null) { ProMap reconnectPolicy = null; ProMap globalreconnectPolicy = null; if(factoryparams instanceof ProMap){ reconnectPolicy = ((ProMap)factoryparams).getMap(connection_params_reconnectPolicy); globalreconnectPolicy = BaseSPIManager2.getMapProperty(connection_params_reconnectPolicy); }else{ globalreconnectPolicy = BaseSPIManager2.getMapProperty(connection_params_reconnectPolicy); reconnectPolicy = (ProMap)(factoryparams).get(connection_params_reconnectPolicy); } if(globalreconnectPolicy == null) return brokerurl; if(reconnectPolicy == null || reconnectPolicy.size() == 0) { reconnectPolicy = globalreconnectPolicy; } StringBuffer url = new StringBuffer(); String SERVER_URL = brokerurl; boolean USE_FAILOVER = reconnectPolicy.getBoolean("USE_FAILOVER", globalreconnectPolicy.getBoolean("USE_FAILOVER",true)); // 是否启用故障重连机制 if (USE_FAILOVER) { String[] exitsParam = null; // 判断所填写的地址是否带参数 int isParam = SERVER_URL.indexOf("?"); if (isParam != -1) { exitsParam = (SERVER_URL.substring(isParam + 1, SERVER_URL .length())).split("&"); SERVER_URL = SERVER_URL.substring(0, isParam); } // 填写的服务地址中是否使用了failover if (SERVER_URL.startsWith("failover")) { url.append(SERVER_URL).append("?"); } else { url.append("failover://(").append(SERVER_URL).append(")") .append("?"); } List keys = this.getParams(globalreconnectPolicy); if (exitsParam != null && exitsParam.length > 0) { // List list = java.util.Arrays.asList(param); for (int i = 0; i < exitsParam.length; i++) { String existparam = exitsParam[i].split("=")[0]; if(!keys.contains(existparam)) { url.append(exitsParam[i]).append("&"); } } } boolean flag = false; // backOffMultiplier change reconnectDelayExponent Iterator keys_ = reconnectPolicy.keySet().iterator(); while(keys_.hasNext()) { String key_ = keys_.next(); if(!key_.startsWith("reconnectPolicy.")) continue; String key = key_.substring("reconnectPolicy.".length()); if(flag) url.append("&").append(key).append("=").append(reconnectPolicy.getString(key_, globalreconnectPolicy.getString(key_))); else { url.append(key).append("=").append(reconnectPolicy.getString(key_, globalreconnectPolicy.getString(key_))); flag = true; } } // url.append(param[0]).append("=").append(initialReconnectDelay) // .append("&").append(param[1]).append("=").append( // mq.getMaxreconnectdelay()).append("&").append( // param[2]).append("=").append( // mq.getUseexponentialbackoff() == 1).append("&") // .append(param[3]).append("=").append( // mq.getBackoffmutipler()).append("&").append( // param[4]).append("=").append( // mq.getMaxreconnecttimes()).append("&").append( // param[5]).append("=") // .append(mq.getRandomize() == 1); return url.toString(); } return SERVER_URL; } else { return brokerurl; } } public ConnectionFactory createSSLConnectionFactory() throws Exception { ConnectionFactory instance = null; try { ActiveMQSslConnectionFactory instance_ = new ActiveMQSslConnectionFactory(); // tcp://192.168.11.107:61615 instance_.setBrokerURL(formatServerURL(this.connectURI)); instance_.setUserName(this.username); instance_.setPassword(this.password); instance_.setKeyAndTrustManagers(SSLHelper.getKeyManagers(keyStore, this.keyStorepassword), SSLHelper .getTrustManagers(trustStore, trustPassword), new java.security.SecureRandom()); try { if(factoryparams instanceof ProMap){ ProMap temp = (ProMap)factoryparams; ProMap connectionParams = temp.getMap(connection_params); ProMap globalconnectionParams = BaseSPIManager2.getMapProperty(connection_params); if(connectionParams != globalconnectionParams) BeanAccembleHelper.injectProperties(instance_,globalconnectionParams, connectionParams); else BeanAccembleHelper.injectProperties(instance_, connectionParams); org.apache.activemq.ActiveMQPrefetchPolicy a = new org.apache.activemq.ActiveMQPrefetchPolicy(); ProMap prefetchParams = temp.getMap(connection_params_prefetchPolicy); ProMap globalprefetchParams = BaseSPIManager2.getMapProperty(connection_params_prefetchPolicy); if(prefetchParams != globalprefetchParams) BeanAccembleHelper.injectProperties(a, globalprefetchParams,prefetchParams); else BeanAccembleHelper.injectProperties(a,prefetchParams); instance_.setPrefetchPolicy(a); RedeliveryPolicy r = new RedeliveryPolicy(); ProMap redirectParams = temp.getMap(connection_params_redirectPolicy); ProMap globalredirectParams = BaseSPIManager2.getMapProperty(connection_params_redirectPolicy); if(redirectParams != globalredirectParams) BeanAccembleHelper.injectProperties(r,globalredirectParams, redirectParams); else BeanAccembleHelper.injectProperties(r, redirectParams); instance_.setRedeliveryPolicy(r); }else{ Map temp = (Map)factoryparams; ProMap connectionParams = (ProMap)temp.get(connection_params); ProMap globalconnectionParams = BaseSPIManager2.getMapProperty(connection_params); if(connectionParams != globalconnectionParams) BeanAccembleHelper.injectProperties(instance_,globalconnectionParams, connectionParams); else BeanAccembleHelper.injectProperties(instance_, connectionParams); org.apache.activemq.ActiveMQPrefetchPolicy a = new org.apache.activemq.ActiveMQPrefetchPolicy(); ProMap prefetchParams = (ProMap)temp.get(connection_params_prefetchPolicy); ProMap globalprefetchParams = BaseSPIManager2.getMapProperty(connection_params_prefetchPolicy); if(prefetchParams != globalprefetchParams) BeanAccembleHelper.injectProperties(a, globalprefetchParams,prefetchParams); else BeanAccembleHelper.injectProperties(a,prefetchParams); instance_.setPrefetchPolicy(a); RedeliveryPolicy r = new RedeliveryPolicy(); ProMap redirectParams = (ProMap)temp.get(connection_params_redirectPolicy); ProMap globalredirectParams = BaseSPIManager2.getMapProperty(connection_params_redirectPolicy); if(redirectParams != globalredirectParams) BeanAccembleHelper.injectProperties(r,globalredirectParams, redirectParams); else BeanAccembleHelper.injectProperties(r, redirectParams); instance_.setRedeliveryPolicy(r); } } catch (IntrospectionException e) { throw e; } // instance.getPrefetchPolicy().setAll(100); if (this.usepool) { instance = new PooledConnectionFactory(instance_); } else { instance = instance_; } } catch (NoSuchAlgorithmException e) { throw e; } catch (KeyStoreException e) { throw e; } catch (CertificateException e) { throw e; } catch (UnrecoverableKeyException e) { throw e; } catch (GeneralSecurityException e) { throw e; } catch (IOException e) { throw e; } catch (Exception e) { throw e; } return instance; } public Destination createDestination(Session session, String name, byte defaultType) throws JMSException { if (name == null) { throw new IllegalArgumentException("Invalid default destination type: " + defaultType + ",name=" + name); } if (name.startsWith(MQUtil.QUEUE_QUALIFIED_PREFIX)) { return new ActiveMQQueue(name.substring(MQUtil.QUEUE_QUALIFIED_PREFIX.length())); } else if (name.startsWith(MQUtil.TOPIC_QUALIFIED_PREFIX)) { return new ActiveMQTopic(name.substring(MQUtil.TOPIC_QUALIFIED_PREFIX.length())); } else if (name.startsWith(MQUtil.TEMP_QUEUE_QUALIFED_PREFIX)) { return new ActiveMQTempQueue(name.substring(MQUtil.TEMP_QUEUE_QUALIFED_PREFIX.length())); } else if (name.startsWith(MQUtil.TEMP_TOPIC_QUALIFED_PREFIX)) { return new ActiveMQTempTopic(name.substring(MQUtil.TEMP_TOPIC_QUALIFED_PREFIX.length())); } switch (defaultType) { case MQUtil.TYPE_QUEUE: return new ActiveMQQueue(name); case MQUtil.TYPE_TOPIC: return new ActiveMQTopic(name); case MQUtil.TYPE_TEMP_QUEUE: return new ActiveMQTempQueue(name); case MQUtil.TYPE_TEMP_TOPIC: return new ActiveMQTempTopic(name); default: throw new IllegalArgumentException("Invalid default destination type: " + defaultType + ",name=" + name); } } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy