Yahoo! «Финансы» — ведущий интернет-сайт, посвященный деловым новостям и финансовым данным Это часть Yahoo! и предоставляет информацию о финансовых новостях, статистике рынка, данных о международном рынке и другую информацию о финансовых ресурсах, к которым имеет доступ каждый.
Если вы являетесь зарегистрированным Yahoo! пользователь, то вы можете настроить Yahoo! Финансировать, чтобы воспользоваться его определенными предложениями. Yahoo! Финансовый API используется для запроса финансовых данных из Yahoo!
Этот API-интерфейс отображает данные, которые задерживаются на 15 минут от реального времени, и обновляет свою базу данных каждые 1 минуту, чтобы получить доступ к текущей информации, связанной с запасами. Теперь давайте рассмотрим сценарий компании в режиме реального времени и посмотрим, как создать предупреждение, когда стоимость ее акций опустится ниже 100.
Создание носика
Цель носика состоит в том, чтобы получить подробную информацию о компании и сообщить цены на болты. Вы можете использовать следующий программный код для создания носика.
Кодирование: YahooFinanceSpout.java
import java.util.*; import java.io.*; import java.math.BigDecimal; //import yahoofinace packages import yahoofinance.YahooFinance; import yahoofinance.Stock; import backtype.storm.tuple.Fields; import backtype.storm.tuple.Values; import backtype.storm.topology.IRichSpout; import backtype.storm.topology.OutputFieldsDeclarer; import backtype.storm.spout.SpoutOutputCollector; import backtype.storm.task.TopologyContext; public class YahooFinanceSpout implements IRichSpout { private SpoutOutputCollector collector; private boolean completed = false; private TopologyContext context; @Override public void open(Map conf, TopologyContext context, SpoutOutputCollector collector){ this.context = context; this.collector = collector; } @Override public void nextTuple() { try { Stock stock = YahooFinance.get("INTC"); BigDecimal price = stock.getQuote().getPrice(); this.collector.emit(new Values("INTC", price.doubleValue())); stock = YahooFinance.get("GOOGL"); price = stock.getQuote().getPrice(); this.collector.emit(new Values("GOOGL", price.doubleValue())); stock = YahooFinance.get("AAPL"); price = stock.getQuote().getPrice(); this.collector.emit(new Values("AAPL", price.doubleValue())); } catch(Exception e) {} } @Override public void declareOutputFields(OutputFieldsDeclarer declarer) { declarer.declare(new Fields("company", "price")); } @Override public void close() {} public boolean isDistributed() { return false; } @Override public void activate() {} @Override public void deactivate() {} @Override public void ack(Object msgId) {} @Override public void fail(Object msgId) {} @Override public Map<String, Object> getComponentConfiguration() { return null; } }
Создание болта
Здесь цель «болта» — обработать цены данной компании, когда цены упадут ниже 100. Он использует объект Java Map для установки предупреждения об ограничении цены отсечения как истинного, когда цены на акции опускаются ниже 100; иначе ложь. Полный код программы выглядит следующим образом:
Кодирование: PriceCutOffBolt.java
import java.util.HashMap; import java.util.Map; import backtype.storm.tuple.Fields; import backtype.storm.tuple.Values; import backtype.storm.task.OutputCollector; import backtype.storm.task.TopologyContext; import backtype.storm.topology.IRichBolt; import backtype.storm.topology.OutputFieldsDeclarer; import backtype.storm.tuple.Tuple; public class PriceCutOffBolt implements IRichBolt { Map<String, Integer> cutOffMap; Map<String, Boolean> resultMap; private OutputCollector collector; @Override public void prepare(Map conf, TopologyContext context, OutputCollector collector) { this.cutOffMap = new HashMap <String, Integer>(); this.cutOffMap.put("INTC", 100); this.cutOffMap.put("AAPL", 100); this.cutOffMap.put("GOOGL", 100); this.resultMap = new HashMap<String, Boolean>(); this.collector = collector; } @Override public void execute(Tuple tuple) { String company = tuple.getString(0); Double price = tuple.getDouble(1); if(this.cutOffMap.containsKey(company)){ Integer cutOffPrice = this.cutOffMap.get(company); if(price < cutOffPrice) { this.resultMap.put(company, true); } else { this.resultMap.put(company, false); } } collector.ack(tuple); } @Override public void cleanup() { for(Map.Entry<String, Boolean> entry:resultMap.entrySet()){ System.out.println(entry.getKey()+" : " + entry.getValue()); } } @Override public void declareOutputFields(OutputFieldsDeclarer declarer) { declarer.declare(new Fields("cut_off_price")); } @Override public Map<String, Object> getComponentConfiguration() { return null; } }
Отправка топологии
Это основное приложение, в котором YahooFinanceSpout.java и PriceCutOffBolt.java соединены вместе и создают топологию. Следующий программный код показывает, как вы можете отправить топологию.
Кодирование: YahooFinanceStorm.java
import backtype.storm.tuple.Fields; import backtype.storm.tuple.Values; import backtype.storm.Config; import backtype.storm.LocalCluster; import backtype.storm.topology.TopologyBuilder; public class YahooFinanceStorm { public static void main(String[] args) throws Exception{ Config config = new Config(); config.setDebug(true); TopologyBuilder builder = new TopologyBuilder(); builder.setSpout("yahoo-finance-spout", new YahooFinanceSpout()); builder.setBolt("price-cutoff-bolt", new PriceCutOffBolt()) .fieldsGrouping("yahoo-finance-spout", new Fields("company")); LocalCluster cluster = new LocalCluster(); cluster.submitTopology("YahooFinanceStorm", config, builder.createTopology()); Thread.sleep(10000); cluster.shutdown(); } }
Сборка и запуск приложения
Полное приложение имеет три кода Java. Они заключаются в следующем —
- YahooFinanceSpout.java
- PriceCutOffBolt.java
- YahooFinanceStorm.java
Приложение может быть построено с помощью следующей команды —
javac -cp “/path/to/storm/apache-storm-0.9.5/lib/*”:”/path/to/yahoofinance/lib/*” *.java
Приложение можно запустить с помощью следующей команды —
javac -cp “/path/to/storm/apache-storm-0.9.5/lib/*”:”/path/to/yahoofinance/lib/*”:. YahooFinanceStorm
Выход
Вывод будет похож на следующее —