StreamInsight Yahoo Stock Demo (一)

一个StreamInsight 的Demo,从yahoo股票频道中获取实时股票信息并在控制台中输出股票价格,给自己一个学习的动力,简单分析一下类结构。

 

 

StockTicker.cs

程序入口文件。

初始化CEP Server和Application;

初始化两个input配置文件和两个output配置文件,在这里面其实就是初始化了一个标准普尔500指数期货和一个道琼斯指数的参数,以及一个生存周期,一个刷新频率和一个NumberOfReading,及读取条数。这些参数就是后面要输出的内容参数;

接着就该初始化CepStream了,这里的PayLoad包括两个属性,一个StockID(Unique ID of stock or index),一个Value(Current value of stock or index);

调用CepStream.Create方法后,这里用的是这个方法

public static CepStream<TPayload> Create(
	string streamName,
	Type adapterFactoryType,
	Object configInfo,
	EventShape eventShape
)

其中第一个是streamName;

adapterFactoryType是在StockTickerInputFactory文件里定义的;

configInfo就是前面初始化的两个input;

EventShape用的是.Point;

 

挨个分析一下:

StockTickerInputFactory:这个类是从ITypedInputAdapterFactory<TConfigInfo>继承的,重写的是

InputAdapterBase Create<TPayload>(TConfigInfo configInfo, EventShape eventShape)

这个方法。当然StockTickerInputConfig就是前面定义的两个input,EventShape就是Point了;

这里对EventShape为Point的情况用StockTickerTypedPointInput方法作了特殊处理,其实就是项目实际应用的情况,而默认情况下会返回default(InputAdapterBase);

StockTickerTypedPointInput这个方法才是开始获得数据源的地方,方法的参数是input,前面定义的那两个股票指数的属性在这里开始用上啦。然后剖析到这里,就把最重要的获取数据源的方法揪出来了,实现这个的类就是YahooFinance,顾名思义,是从Yahoo拿的股票信息数据了。

一层层的深入,来分析一下YahooFinance这个类:

首先,这个类有两个属性,一个是RUL,程序直接就在初始化YahooFinance类的时候就制定了,地址是"http://finance.yahoo.com/q?s=" + symbol;很明显,这个symbol是从inputconfig里面取得的;另一个属性是MatchPattern,这里是用的正则表达式来从网页中获得数据的,这其中的关键字就是从symbol这里面获得的。

OK,YahooFinance类的参数只有一个字符串类型的symbol,方法也只是初始化了它的两个基本属性RUL和MatchPattern,那这个YAHOO怎么用呢,原来这个YahooFinance实际还不是具体取数据的地方,它只是另一个类的输入参数,这个类就是ScreenScraper;

 

ScreenScraper:

屏幕刮刀?这个翻译有点不好理解,暂且不翻译,来看看它是怎么个刮数据法的吧。

构造函数初始化三个属性_rul, _timeout, _regex;

OK,到这ITypedInputAdapterFactory的方法就执行完毕了,向上回溯路径就是

ScreenScraper ->StockTickerInputFactory ->StockTicker,最终在StockTicker里初始化出两个input的CepStream,基本上到这里也就把所有取数据的准备做好,貌似就应该调用一个取调用数据的方法了,暂且不急,还有工作没有做完。

 

现在又了输入适配器,还有输出适配器呢。

输出适配器也需要一个Config,实现类是StockTickerOutputConfig,这个类就一个属性字符串类型的AdapterStopSignal,初始化值为"StockTickerWaitHandle”。

 

紧接着使用LINQ实现outputstream,这里是一个简单的LINQ语句,

然后将outputstream.ToQuery一下,转换成一个查询,使用方法是

public Query ToQuery(
 string queryName,
 string description,
 Type adapterFactoryType,
 Object adapterConfig,
 EventShape eventShape,
 StreamEventOrder eventOrder
)

在声明StockTickerOutputConfig时候,参数AdapterStopSignal是一个EventWaitHandle类型,这里使用EventWaitHandle.WaitOne()的方法来等待主线程执行完毕。

 

到这里所有需要做的准备工作已经完成,下面开始执行query.Start()方法,然后调用adapterStopSignal.WaitOne();的方法来等待线程执行完毕,最后调用query.Stop();,在这里,当调用Start()方法的时候,将会执行StockTickerTypedPointInput类下面重载的Start(),分析一下StockTickerTypedPointInput的继承顺序,依次是:

TypedPointInputAdapter<StockPayload> : TypedInputAdapter<PointEvent<TPayload>, TPayload> : InputAdapterBase where TEvent : global::Microsoft.ComplexEventProcessing.TypedEvent<TPayload> : Adapter,在Adapter里面定义了Start();Stop();等接口,我的理解是党query.Start()的时候,就开始调用输入适配器的Start()方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值