package com.alibaba.rocketmq.storm.spout.factory; import java.util.ServiceLoader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import backtype.storm.topology.IRichSpout; import com.alibaba.rocketmq.storm.annotation.Extension; import com.alibaba.rocketmq.storm.domain.RocketMQSpouts; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; /** * @author Von Gosling */ public final class RocketMQSpoutFactory { private static final Logger logger = LoggerFactory .getLogger(RocketMQSpoutFactory.class); private static IRichSpout spout; private static Cache<String, IRichSpout> cache = CacheBuilder.newBuilder().build(); private static final String DEFAULT_BROKER = RocketMQSpouts.STREAM.getValue(); public static IRichSpout getSpout(String spoutName) { RocketMQSpouts spoutType = RocketMQSpouts.fromString(spoutName); switch (spoutType) { case SIMPLE: case BATCH: case STREAM: return locateSpout(spoutName); default: logger.warn("Can not support this spout type {} temporarily !", spoutName); return locateSpout(DEFAULT_BROKER); } } private static IRichSpout locateSpout(String spoutName) { spout = cache.getIfPresent(spoutName); if (null == spout) { for (IRichSpout spoutInstance : ServiceLoader.load(IRichSpout.class)) { Extension ext = spoutInstance.getClass().getAnnotation(Extension.class); if (spoutName.equals(ext.value())) { spout = spoutInstance; cache.put(spoutName, spoutInstance); return spoutInstance; } } } return spout; } }