Skip to content

Instantly share code, notes, and snippets.

@sizovs
Created July 24, 2014 07:54
Show Gist options
  • Save sizovs/c6f19ca6466d1bb583f1 to your computer and use it in GitHub Desktop.
Save sizovs/c6f19ca6466d1bb583f1 to your computer and use it in GitHub Desktop.
package fm.ask.components.counter;
import static org.joda.time.Duration.standardDays;
import org.joda.time.Duration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.rubylight.conf.ConfFacade;
import com.rubylight.conf.IConfProperty;
import fm.ask.dao.redis.DBCountersShardedDAOFactory;
@Configuration
public class CounterFactoryConfiguration {
private final DBCountersShardedDAOFactory dbCountersShardedDAOFactory;
private final ConfFacade configurationFacade;
@Autowired
public CounterFactoryConfiguration(DBCountersShardedDAOFactory dbCountersShardedDAOFactory,
ConfFacade configurationFacade) {
this.dbCountersShardedDAOFactory = dbCountersShardedDAOFactory;
this.configurationFacade = configurationFacade;
}
@Answers
@Bean
public CounterFactory answers() {
CounterExpirationPolicy expirationPolicy =
rangeBased("counter_expire_threshold.answers_count", standardDays(24));
return new ShardedCounterFactory(dbCountersShardedDAOFactory, expirationPolicy) {
@Override
protected RedisCounterDAO.CounterKey counterKey(long userId) {
return new AnswerCounterKey(userId);
}
};
}
@Likes
@Bean
public CounterFactory likes() {
CounterExpirationPolicy expirationPolicy = rangeBased("counter_expire_threshold.likes_count", standardDays(24));
return new ShardedCounterFactory(dbCountersShardedDAOFactory, expirationPolicy) {
@Override
protected RedisCounterDAO.CounterKey counterKey(long userId) {
return new LikeCounterKey(userId);
}
};
}
@Gifts
@Bean
public CounterFactory gifts() {
CounterExpirationPolicy expirationPolicy = rangeBased("counter_expire_threshold.gifts_count", standardDays(24));
return new ShardedCounterFactory(dbCountersShardedDAOFactory, expirationPolicy) {
@Override
protected RedisCounterDAO.CounterKey counterKey(long userId) {
return new GiftCounterKey(userId);
}
};
}
private CounterExpirationPolicy rangeBased(String thresholdProperty, Duration expiration) {
IConfProperty<Long> threshold = threshold(thresholdProperty);
ThresholdCounterExpirationPolicy expirationPolicy = new ThresholdCounterExpirationPolicy(threshold, expiration);
if (!expirationPolicy.isEnabled()) {
return AlwaysExpires.withExpiration(expiration);
}
return expirationPolicy;
}
private IConfProperty<Long> threshold(String propertyKey) {
return configurationFacade.getLong(propertyKey, 0L);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment