package com.zdatainc.rts.storm;
import org.apache.log4j.Logger;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.BasicOutputCollector;
import backtype.storm.topology.base.BaseBasicBolt;
import backtype.storm.tuple.Tuple;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClientBuilder;
public class NodeNotifierBolt extends BaseBasicBolt
{
private static final long serialVersionUID = 42L;
private static final Logger LOGGER =
Logger.getLogger(NodeNotifierBolt.class);
private String webserver = Properties.getString("rts.storm.webserv");
private HttpClient client;
private void reconnect()
{
this.client = HttpClientBuilder.create().build();
}
public void execute(Tuple input, BasicOutputCollector collector)
{
Long id = input.getLong(input.fieldIndex("tweet_id"));
String tweet = input.getString(input.fieldIndex("tweet_text"));
Float pos = input.getFloat(input.fieldIndex("pos_score"));
Float neg = input.getFloat(input.fieldIndex("neg_score"));
String score = input.getString(input.fieldIndex("score"));
HttpPost post = new HttpPost(this.webserver);
String content = String.format(
"{\"id\": \"%d\", " +
"\"text\": \"%s\", " +
"\"pos\": \"%f\", " +
"\"neg\": \"%f\", " +
"\"score\": \"%s\" }",
id, tweet, pos, neg, score);
try
{
post.setEntity(new StringEntity(content));
HttpResponse response = client.execute(post);
org.apache.http.util.EntityUtils.consume(response.getEntity());
}
catch (Exception ex)
{
LOGGER.error("exception thrown while attempting post", ex);
LOGGER.trace(null, ex);
reconnect();
}
}
public void declareOutputFields(OutputFieldsDeclarer declarer) { }
}