/*
* avenir: Predictive analytic based on Hadoop Map Reduce
* Author: Pranab Ghosh
*
* Licensed under the Apache License, Version 2.0 (the "License"); you
* may not use this file except in compliance with the License. You may
* obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
package org.avenir.reinforce;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.chombo.util.ConfigUtility;
import org.chombo.util.Pair;
import redis.clients.jedis.Jedis;
public class RedisRewardReader implements RewardReader {
private Jedis jedis;
private String rewardQueue;
private long startOffset = -1;
private boolean debugOn;
private static final String FIELD_DELIM = ",";
private static final Logger LOG = Logger.getLogger(RedisRewardReader.class);
private static final String NIL = "nil";
@Override
public void intialize(Map stormConf) {
//action output queue
String redisHost = ConfigUtility.getString(stormConf, "redis.server.host");
int redisPort = ConfigUtility.getInt(stormConf,"redis.server.port");
jedis = new Jedis(redisHost, redisPort);
rewardQueue = ConfigUtility.getString(stormConf, "redis.reward.queue");
debugOn = ConfigUtility.getBoolean(stormConf,"debug.on", false);
if (debugOn) {
LOG.setLevel(Level.INFO);
}
}
@Override
public List<Pair<String, Integer>> readRewards() {
List<Pair<String, Integer>> rewards = new ArrayList<Pair<String, Integer>>();
/*
List<String> messages = jedis.lrange(rewardQueue, startOffset, startOffset+1000000L);
if (debugOn) {
LOG.info("startOffset:" + startOffset + " num of reward records:" + messages.size());
}
for (String message : messages) {
String[] items = message.split(FIELD_DELIM);
Pair<String, Integer> reward = new Pair<String, Integer>(items[0], Integer.parseInt(items[1]));
rewards.add(reward);
if (debugOn) {
LOG.info("reward:" + message);
}
}
startOffset += messages.size();
*/
String message = null;
while(true) {
message = jedis.lindex(rewardQueue, startOffset);
if(null != message && !message.equals(NIL)) {
if (debugOn) {
LOG.info("next reward:" + message + " startOffset:" + startOffset);
}
String[] items = message.split(FIELD_DELIM);
Pair<String, Integer> reward = new Pair<String, Integer>(items[0], Integer.parseInt(items[1]));
rewards.add(reward);
--startOffset;
} else {
break;
}
}
return rewards;
}
}