Apache Storm ใน Yahoo! การเงิน
Yahoo! Finance เป็นเว็บไซต์ข่าวธุรกิจและข้อมูลทางการเงินชั้นนำของอินเทอร์เน็ต เป็นส่วนหนึ่งของ Yahoo! และให้ข้อมูลเกี่ยวกับข่าวการเงินสถิติการตลาดข้อมูลตลาดต่างประเทศและข้อมูลอื่น ๆ เกี่ยวกับแหล่งข้อมูลทางการเงินที่ทุกคนสามารถเข้าถึงได้
หากคุณลงทะเบียน Yahoo! จากนั้นคุณสามารถปรับแต่ง Yahoo! การเงินเพื่อใช้ประโยชน์จากข้อเสนอบางอย่าง Yahoo! Finance 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 เพื่อตั้งค่าการแจ้งเตือนขีด จำกัด ราคาตัดเป็น trueเมื่อราคาหุ้นลดลงต่ำกว่า 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
เอาต์พุต
ผลลัพธ์จะคล้ายกับสิ่งต่อไปนี้ -
GOOGL : false
AAPL : false
INTC : true