不得不说storm是一个特别棒的实时计算框架。为了对后文理解的方便,先说几个storm中的术语:

Topology:拓扑图或者拓扑结构。在storm中它通过消息分组的分式连接Spout和Bolt节点定义了运算处理的拓扑结构。如下图:

那什么是Spout呢?

在计算任务需要的数据其实就是由Spout提供的,所以它可以说是Storm中的消息源,一般是从外部数据源(日志文件、数据库、消息队列等等)不间断地读取数据然后发送给tuple元组的。

那它是通过谁发送的呢?又是如何发送的呢?

这里我们先回答第一个问题,第二个问题以后解答。

好了上面说了那么多就是为了引出今天的任务:阅读SpoutOutputCollector源码。

在阅读之前,我们先明确一下SpoutOutputCollector到底是什么?其实从类名就能说出大概(不得不说老外写的代码的可读性真是好的没法说。这里啰嗦一句,

个人觉得这也是他们分享精神的体现,时刻记住方便给别人看。),它就是Spout输出收集器。

那它到底能干些啥呢?请看代码:

1.ISpoutOutputCollector:是SpoutOutputCollector的接口

 public interface ISpoutOutputCollector {
/**
发送tuple消息,并返回起发送任务的task的序列号集合
*/
List<Integer> emit(String streamId, List<Object> tuple, Object messageId);
/**
*与上述发送方法类似,只不过emitDirect方法是要指定接收端的task,让接收端特定的task接收消息。
*/
void emitDirect(int taskId, String streamId, List<Object> tuple, Object messageId);
/**
*处理异常
*/
void reportError(Throwable error);
}

从上述接口ISpoutOutputCollector源码可以看出ISpoutOutputCollector中声明了3个方法,两个属于发送tuple元组的方法,他们之间的差异在上述注释中已说的很清楚,还有一个处理异常的方法。

2.SpoutOutputCollector:它实现了接口ISpoutOutputCollector

 public class SpoutOutputCollector implements ISpoutOutputCollector {
ISpoutOutputCollector _delegate; public SpoutOutputCollector(ISpoutOutputCollector delegate) {
_delegate = delegate;
} /**
* 指定一个streamid和message发射tuple消息并返回起发送消息的task的序号。当tuple消息完全处理了,就会回调ack方法,否则会回调fail方法。
*/
public List<Integer> emit(String streamId, List<Object> tuple, Object messageId) {
return _delegate.emit(streamId, tuple, messageId);
} /**
* emit(String streamId, List<Object> tuple, Object messageId)的重载方法,这没有指定streamid,故采用默认的streamid
*/
public List<Integer> emit(List<Object> tuple, Object messageId) {
return emit(Utils.DEFAULT_STREAM_ID, tuple, messageId);
} /**
* emit(String streamId, List<Object> tuple, Object messageId)
*的重载方法,这没有指定streamid,故采用默认的streamid,因为没有messageid,故ack方法和fail方法不会被调用
*/
public List<Integer> emit(List<Object> tuple) {
return emit(tuple, null);
} /**
* emit(String streamId, List<Object> tuple, Object messageId)的重载方法,因为没有messageid,故ack方法和fail方法不会被调用
*/
public List<Integer> emit(String streamId, List<Object> tuple) {
return emit(streamId, tuple, null);
} /**
* 发射tuple消息,不过需要指定接收端的task来接收,并且输出必须声明为直接流,同时指定用来接收消息的task必须采用直接分组的方式来接收消息.
*
*/
public void emitDirect(int taskId, String streamId, List<Object> tuple, Object messageId) {
_delegate.emitDirect(taskId, streamId, tuple, messageId);
} /**
* emitDirect(int taskId, String streamId, List<Object> tuple, Object messageId)的重载方法,采用默认的streamid
*/
public void emitDirect(int taskId, List<Object> tuple, Object messageId) {
emitDirect(taskId, Utils.DEFAULT_STREAM_ID, tuple, messageId);
} /**
* emitDirect(int taskId, String streamId, List<Object> tuple, Object messageId)的重载方法,因为没有指定的消息id,所以ack和fail方法就不会调用.
*/
public void emitDirect(int taskId, String streamId, List<Object> tuple) {
emitDirect(taskId, streamId, tuple, null);
} /**
* 该类提供的重载方法,因为没有指定的消息id,所以ack和fail方法就不会调用.
*/
public void emitDirect(int taskId, List<Object> tuple) {
emitDirect(taskId, tuple, null);
}
/**
* 接口ISpoutOutputCollector中reportError的实现.
*/
@Override
public void reportError(Throwable error) {
_delegate.reportError(error);
}
}

在SpoutOutputCollector类中,实现了消息发射的方法,并且还提供了多个重载方法方便用户使用。

Storm源码阅读之SpoutOutputCollector的更多相关文章

  1. Apache Storm源码阅读笔记

    欢迎转载,转载请注明出处. 楔子 自从建了Spark交流的QQ群之后,热情加入的同学不少,大家不仅对Spark很热衷对于Storm也是充满好奇.大家都提到一个问题就是有关storm内部实现机理的资料比 ...

  2. storm源码阅读笔记之任务调度算法

    3种Scheduler概述 EventScheduler:将系统中的可用资源均匀地分配给需要资源的topology,其实也不是绝对均匀,后续会详细说明 DefaultScheduler:和Evenet ...

  3. fw: 专访许鹏:谈C程序员修养及大型项目源码阅读与学习

      C家最近也有一篇关于如何阅读大型c项目源代码的文章,学习..融合.. -------------------- ref:http://www.csdn.net/article/2014-06-05 ...

  4. storm源码之storm代码结构【译】【转】

    [原]storm源码之storm代码结构[译]  说明:本文翻译自Storm在GitHub上的官方Wiki中提供的Storm代码结构描述一节Structure of the codebase,希望对正 ...

  5. 【原】storm源码之storm代码结构【译】

    说明:本文翻译自Storm在GitHub上的官方Wiki中提供的Storm代码结构描述一节Structure of the codebase,希望对正在基于Storm进行源码级学习和研究的朋友有所帮助 ...

  6. storm源码之storm代码结构【译】

    storm源码之storm代码结构[译] 说明:本文翻译自Storm在GitHub上的官方Wiki中提供的Storm代码结构描述一节Structure of the codebase,希望对正在基于S ...

  7. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  8. 【原】FMDB源码阅读(二)

    [原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...

  9. 【原】FMDB源码阅读(一)

    [原]FMDB源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 说实话,之前的SDWebImage和AFNetworking这两个组件我还是使用过的,但是对于 ...

随机推荐

  1. 夜神模拟器与HBuilder连接/cmd运行提示符/执行夜神模拟器命令/执行HBuilder命令

    第一步:启动HBuilder和夜神模拟器 第二步:通过运行电脑命令CMD进入(电脑运行命令的快捷键是:windows键+R2.Ctrl键与Alt键之间的那个键就是windows键或者点击左下角开始图标 ...

  2. 最新开源DBLayer,原来数据库操作可以这么简单

    DBLayer,我最近开源的数据库轻量级orm框架,目前支持sqlserver.mysql.oracle, 特别做了分页的封装. 这个框架从七八年前开始逐渐升级而来,也经历了不少项目,希望可以将大家从 ...

  3. cordova 插件开发

    从事基于cordova开发混合APP也快一年了,一直没有自己"亲自操刀"写一个插件,因为网上插件太丰富了,可耻了. 今天完整的记录一次插件开发. cordova环境6.4.0 第一 ...

  4. javascript中的window.open()被浏览器拦截

    最近做项目的时候,点击事件的时候遇到了window .open()被浏览器拦截的情况,虽然在自己的开发环境中都能正常使用,但是放在测试环境中window.open()就是不能使用, 后来经过测试,单纯 ...

  5. .Net中的AOP系列之《将AOP作为架构工具》

    返回<.Net中的AOP>系列学习总目录 本篇目录 编译时初始化和验证 编译时初始化 切面验证的正确用法 真实案例:复习线程 架构约束 强制架构 真实案例:NHibernate 多播 类级 ...

  6. Swift3 访问权限fileprivate和 open

    在swift 3中新增加了两种访问控制权限 fileprivate和 open. 下面结合网上资料和个人理解整理一下两个属性的原理与介绍. fileprivate 在原有的swift中的 privat ...

  7. java hascode

    有部分代码如下: Cat cat=new Cat("Kitty",2);system.out.println(cat):问题:输出什么? 调用并执行toString()方法,两种情 ...

  8. Redis客户端管理工具,状态监控工具

    TreeNMS是一款Redis web客户端管理工具,采用JAVA开发,实现基于web方式对Redis数据库进行管理.监控.数据维护. 功能包括:数据库的状态监控,库表的展示,key,value的展示 ...

  9. CYQ.Data V5 分布式自动化缓存设计介绍(二)

    前言: 最近一段时间,开始了<IT连>创业,所以精力和写的文章多数是在分享创业的过程. 而关于本人三大框架CYQ.Data.Aries.Taurus.MVC的相关文章,基本都很少写了. 但 ...

  10. el表达式字符串使用总结

    el表达式截取 逗号后面的字符串${fn:substringAfter(strVar,',' )} el表达式判断字段长度<c:if test="${fn:length(strVar) ...