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}