@Override
  public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {
    _collector = collector;
    Map stateConf = new HashMap(conf);

    List<String> zkServers = _spoutConfig.zkServers;
    if (zkServers == null) zkServers = (List<String>) conf.get(Config.STORM_ZOOKEEPER_SERVERS);

    Integer zkPort = _spoutConfig.zkPort;
    if (zkPort == null) zkPort = ((Number) conf.get(Config.STORM_ZOOKEEPER_PORT)).intValue();

    String zkRoot = _spoutConfig.zkRoot;

    stateConf.put(Config.TRANSACTIONAL_ZOOKEEPER_SERVERS, zkServers);
    stateConf.put(Config.TRANSACTIONAL_ZOOKEEPER_PORT, zkPort);
    stateConf.put(Config.TRANSACTIONAL_ZOOKEEPER_ROOT, zkRoot);

    Config componentConf = new Config();
    componentConf.registerSerialization(ZooMeta.class);

    // using TransactionalState like this is a hack
    _state = TransactionalState.newUserState(stateConf, _spoutConfig.id, componentConf);
    _partitions = new KafkaPartitionConnections(_spoutConfig);

    int totalPartitions = _spoutConfig.partitionsPerHost * _spoutConfig.hosts.size();
    int numTasks = context.getComponentTasks(context.getThisComponentId()).size();
    for (int p = context.getThisTaskIndex(); p < totalPartitions; p += numTasks) {
      _managedPartitions.add(p);
      _managers.put(p, new PartitionManager(p));
    }
  }
 @Override
 public void ack(Object msgId) {
   TransactionAttempt tx = (TransactionAttempt) msgId;
   TransactionStatus status = _activeTx.get(tx.getTransactionId());
   if (status != null && tx.equals(status.attempt)) {
     if (status.status == AttemptStatus.PROCESSING) {
       status.status = AttemptStatus.PROCESSED;
     } else if (status.status == AttemptStatus.COMMITTING) {
       _activeTx.remove(tx.getTransactionId());
       _coordinatorState.cleanupBefore(tx.getTransactionId());
       _currTransaction = nextTransactionId(tx.getTransactionId());
       _state.setData(CURRENT_TX, _currTransaction);
     }
     sync();
   }
 }
 @Override
 public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {
   _rand = new Random(Utils.secureRandomLong());
   _state =
       TransactionalState.newCoordinatorState(
           conf,
           (String) conf.get(Config.TOPOLOGY_TRANSACTIONAL_ID),
           _spout.getComponentConfiguration());
   _coordinatorState = new RotatingTransactionalState(_state, META_DIR, true);
   _collector = collector;
   _coordinator = _spout.getCoordinator(conf, context);
   _currTransaction = getStoredCurrTransaction(_state);
   Object active = conf.get(Config.TOPOLOGY_MAX_SPOUT_PENDING);
   if (active == null) {
     _maxTransactionActive = 1;
   } else {
     _maxTransactionActive = Utils.getInt(active);
   }
   _initializer = new StateInitializer();
 }
 @Override
 public void close() {
   _state.close();
 }
 private BigInteger getStoredCurrTransaction(TransactionalState state) {
   BigInteger ret = (BigInteger) state.getData(CURRENT_TX);
   if (ret == null) return INIT_TXID;
   else return ret;
 }