001package gu.simplemq.activemq;
002
003import java.io.IOException;
004import java.net.URI;
005import java.net.URISyntaxException;
006import java.util.Map;
007import com.google.common.net.HostAndPort;
008
009import gu.simplemq.BaseMessageQueueFactory;
010import gu.simplemq.IConsumer;
011import gu.simplemq.IMessageQueueFactory;
012import gu.simplemq.IProducer;
013import gu.simplemq.IPublisher;
014import gu.simplemq.ISubscriber;
015import gu.simplemq.MQLocationType;
016import gu.simplemq.MessageQueueType;
017import gu.simplemq.mqtt.MqttConstants;
018import gu.simplemq.utils.MQProperties;
019import gu.simplemq.utils.URISupport;
020
021import static gu.simplemq.activemq.ActivemqPoolLazys.createInstance;
022import static gu.simplemq.activemq.PropertiesHelper.AHELPER;
023
024/**
025 * {@link IMessageQueueFactory}接口的activemq实现类
026 * @author guyadong
027 *
028 */
029public final class MessageQueueFactoryImpl extends BaseMessageQueueFactory<ActivemqPoolLazy> implements ActivemqConstants,MqttConstants {
030        public static final String MQTT_SCHEMA = "mqtt";
031
032        private volatile MQProperties props;
033        private IMessageQueueFactory mqttFactory;
034
035        private AdvisoryMessageManager advisoryMessageManager;
036        
037        public MessageQueueFactoryImpl() {
038        }
039
040        @SuppressWarnings({ "unchecked", "rawtypes", "resource" })
041        @Override
042        protected void doInit(Map<String, Object> properties){
043                mqConnParams = properties;
044                props =  AHELPER.with(MQLocationType.QUEUE).initParameters(properties);
045                pool = createInstance(props);
046                advisoryMessageManager = AdvisoryMessageManager.instanceOf(pool);
047
048                String pubsub = AHELPER.with(MQLocationType.PUBSUB).getLocationAsString(properties);
049                if(pubsub != null){
050                        URI uri = URI.create(pubsub);
051                        if(MQTT_SCHEMA.equals(uri.getScheme())){
052                                try {
053                                        uri = URISupport.changeScheme(uri, DEFAULT_MQTT_SCHEMA);
054                                } catch (URISyntaxException e) {
055                                        throw new RuntimeException(e);
056                                }
057                                MQProperties p = gu.simplemq.mqtt.PropertiesHelper.MHELPER.initParameters(properties).initURI(uri);
058                                mqttFactory = new gu.simplemq.mqtt.MessageQueueFactoryImpl().init((Map)p).forPubsub(advisoryMessageManager);
059                        }
060                }
061        }
062        @Override
063        protected HostAndPort doGetHostAndPort() {
064                return AHELPER.getHostAndPort(props);
065        }
066
067        @Override
068        public ISubscriber getSubscriber() {
069                if(mqttFactory != null){
070                        return mqttFactory.getSubscriber();
071                }
072                return ActivemqFactory.getSubscriber(getPool());
073        }
074
075        @Override
076        public IPublisher getPublisher() {
077                if(mqttFactory != null){
078                        return mqttFactory.getPublisher();
079                }
080                return ActivemqFactory.getPublisher(getPool());
081        }
082
083        @Override
084        public IProducer getProducer() {
085                return ActivemqFactory.getProducer(getPool());
086        }
087
088        @Override
089        public IConsumer getConsumer() {
090                return ActivemqFactory.getConsumer(getPool());
091        }
092
093        @Override
094        public final MessageQueueType getImplType(){
095                return MessageQueueType.ACTIVEMQ;
096        }
097
098        @Override
099        public boolean testConnect(){
100                return AHELPER.testConnect(props);
101        }
102
103        @Override
104        public void close() throws IOException {
105                if(mqttFactory != null){
106                        ((gu.simplemq.mqtt.MessageQueueFactoryImpl)mqttFactory).close();
107                }
108                advisoryMessageManager.close();
109                super.close();
110        }
111}