storm定时器
package com.example.mail; import org.apache.storm.Config;
import org.apache.storm.LocalCluster;
import org.apache.storm.topology.TopologyBuilder; public class Main {
public static void main(String[] args) {
// 组装topology
TopologyBuilder topologyBuilder = new TopologyBuilder();
topologyBuilder.setSpout("spout1", new MySpout());
// .shuffleGrouping("spout1"); 表示让MyBolt接收MySpout发射出来的tuple
topologyBuilder.setBolt("bolt1", new EmailBolt()).shuffleGrouping("spout1"); // 创建本地storm集群
LocalCluster localCluster = new LocalCluster();
Config config = new Config(); localCluster.submitTopology("sumTopology", config, topologyBuilder.createTopology());
}
}
package com.example.mail; import java.util.Map; import org.apache.storm.spout.SpoutOutputCollector;
import org.apache.storm.task.TopologyContext;
import org.apache.storm.topology.OutputFieldsDeclarer;
import org.apache.storm.topology.base.BaseRichSpout;
import org.apache.storm.tuple.Fields;
import org.apache.storm.tuple.Values;
import org.apache.storm.utils.Utils; public class MySpout extends BaseRichSpout {
private Map conf;
private TopologyContext context;
private SpoutOutputCollector collector; /**
* 初始化方法,只会执行一次
* 在这里面可以写一个初始化的代码
* Map conf:其实里面保存的是topology的一些配置信息
* TopologyContext context:topology的上下文,类似于servletcontext
* SpoutOutputCollector collector:发射器,负责向外发射数据(tuple)
*/
@Override
public void open(Map conf, TopologyContext context,
SpoutOutputCollector collector) {
this.conf = conf;
this.context = context;
this.collector = collector;
} int num = 1;
/**
* 这个方法是spout中最重要的方法,
* 这个方法会被storm框架循环调用,可以理解为这个方法是在一个while循环之内
* 每调用一次,会向外发射一条数据
*/
@Override
public void nextTuple() {
System.out.println("spout发射:"+num);
//把数据封装到values中,称为一个tuple,发射出去
this.collector.emit(new Values(num++));
Utils.sleep(1000);
} /**
* 声明输出字段
*/
@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
//给values中的数据起个名字,方便后面的bolt从这个values中取数据
//fields中定义的参数和values中传递的数值是一一对应的
declarer.declare(new Fields("num"));
}
}
package com.example.mail; import java.util.HashMap;
import java.util.Map; import org.apache.storm.Config;
import org.apache.storm.Constants;
import org.apache.storm.task.OutputCollector;
import org.apache.storm.task.TopologyContext;
import org.apache.storm.topology.OutputFieldsDeclarer;
import org.apache.storm.topology.base.BaseRichBolt;
import org.apache.storm.tuple.Tuple; import lombok.extern.slf4j.Slf4j; @Slf4j
public class EmailBolt extends BaseRichBolt { private transient OutputCollector collector; @Override
public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
this.collector = collector;
} @Override
public void execute(Tuple input) {
System.out.println(input.getSourceComponent());
System.out.println(input.getSourceStreamId());
if (input.getSourceComponent().equals(Constants.SYSTEM_COMPONENT_ID)
&& input.getSourceStreamId().equals(Constants.SYSTEM_TICK_STREAM_ID)) {
System.out.println("定时任务执行了。"); }
} @Override
public Map<String, Object> getComponentConfiguration() {
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put(Config.TOPOLOGY_TICK_TUPLE_FREQ_SECS, 10);
return hashMap;
} @Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
// last bolt in flow, no further processing
} }
23616 [Thread-24-__system-executor[-1 -1]] INFO o.a.s.d.executor - Preparing bolt __system:(-1)
23629 [Thread-24-__system-executor[-1 -1]] INFO o.a.s.d.executor - Prepared bolt __system:(-1)
23633 [Thread-20-spout1-executor[3 3]] INFO o.a.s.d.executor - Opening spout spout1:(3)
23637 [Thread-20-spout1-executor[3 3]] INFO o.a.s.d.executor - Opened spout spout1:(3)
23642 [Thread-20-spout1-executor[3 3]] INFO o.a.s.d.executor - Activating spout spout1:(3)
spout发射:1
23670 [Thread-22-__acker-executor[1 1]] INFO o.a.s.d.executor - Preparing bolt __acker:(1)
23673 [Thread-22-__acker-executor[1 1]] INFO o.a.s.d.executor - Prepared bolt __acker:(1)
23694 [Thread-18-bolt1-executor[2 2]] INFO o.a.s.d.executor - Preparing bolt bolt1:(2)
23696 [Thread-18-bolt1-executor[2 2]] INFO o.a.s.d.executor - Prepared bolt bolt1:(2)
spout1
default
spout发射:2
spout1
default
spout发射:3
spout1
default
spout发射:4
spout1
default
spout发射:5
spout1
default
spout发射:6
spout1
default
spout发射:7
spout1
default
spout发射:8
spout1
default
spout发射:9
spout1
default
spout发射:10
spout1
default
spout发射:11
spout1
default
__system
__tick
定时任务执行了。
spout发射:12
spout1
default
spout发射:13
spout1
default
spout发射:14
spout1
default
spout发射:15
spout1
default
spout发射:16
spout1
default
spout发射:17
spout1
default
spout发射:18
spout1
default
spout发射:19
spout1
default
spout发射:20
spout1
default
__system
__tick
定时任务执行了。
storm定时器的更多相关文章
- storm定时器timer源码分析-timer.clj
storm定时器与java.util.Timer定时器比较相似.java.util.Timer定时器实际上是个线程,定时调度所拥有的TimerTasks:storm定时器也有一个线程负责调度所拥有的& ...
- Nimbus<二>storm启动nimbus源码分析-nimbus.clj
nimbus是storm集群的"控制器",是storm集群的重要组成部分.我们可以通用执行bin/storm nimbus >/dev/null 2>&1 &a ...
- storm启动nimbus源码分析-nimbus.clj
nimbus是storm集群的"控制器",是storm集群的重要组成部分.我们可以通用执行bin/storm nimbus >/dev/null 2>&1 &a ...
- 近期开发storm遇到一些问题的解决点
storm开发解决问题点1.kafka消费速度跟不上问题 这个问题可以从加大topic partition进行解决,可以在topic正在运行时候运行命令 ./kafka-topics --alter ...
- 第3节 storm高级应用:6、定时器任务;7、与jdbc的整合使用;8、与jdbc整合打包集群运行
======================================= 5.storm的定时器以及与mysql的整合使用 功能需求:实现每五秒钟打印出当前时间,并将发送出来的数据存入到mysq ...
- 探索c#之storm的TimeCacheMap
阅读目录: 概述 算法介绍 清理线程 获取.插入.删除 总结 概述 最近在看storm,发现其中的TimeCacheMap算法设计颇为高效,就简单分享介绍下. 思考一下如果需要一个带过期淘汰的缓存容器 ...
- storm坑之---同步问题
最近在做一个监控系统,用来监控网站上各个业务功能的调用量以及处理时间,以便及时发现问题,及时处理.做这种实时统计处理系统,自然首先想到了storm,于是现学现用,自然遇到了一些坑,而且不少是网上也难以 ...
- storm源码之storm代码结构【译】【转】
[原]storm源码之storm代码结构[译] 说明:本文翻译自Storm在GitHub上的官方Wiki中提供的Storm代码结构描述一节Structure of the codebase,希望对正 ...
- 【原】storm源码之storm代码结构【译】
说明:本文翻译自Storm在GitHub上的官方Wiki中提供的Storm代码结构描述一节Structure of the codebase,希望对正在基于Storm进行源码级学习和研究的朋友有所帮助 ...
随机推荐
- 2018网络预选赛 徐州H 线段树+树状数组
设读入的数组是a,树状数组用来维护a数组区间和sum,线段树用来维护一个另一个数组ssum的区间和,区间每个点a[i]*(n-i+1),那么l-r的答案是l-r的ssum-(n-r)*(sum[r]- ...
- python 爬虫 下载图片
import os#导入操作系统模块from urllib.request import urlretrieve#下载url对应的文件from urllib.request import urlope ...
- Freemarker 使用注意事项
上次借助 Freemaker 模板引擎来动态构造 Kylin 访问的 SQL,在使用过程中,遇到了一些坑. ${} 输出变量时需要注意: 示例 WHERE shop_id = ${val} 里的 v ...
- then方法
sendSMS(phoneNo).then(function(data) { var msg = (data && data['msg']) ? data['msg'] : '验证码已 ...
- linux环境安装python
linux环境下安装python3,一步一步来吧! 安装python3 安装readline-devel依赖 ,用于解决python3安装完成后,退格和方向键乱码问题 yum install read ...
- JButton ButtonClickTest
package com.example.test; import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing. ...
- Entity Framework Tutorial Basics(33):Spatial Data type support in Entity Framework 5.0
Spatial Data type support in Entity Framework 5.0 MS SQL Server 2008 introduced two spatial data typ ...
- jmeter MD5加密
MD5.jar已经上传到博客园的文件中 第一步 添加变量${Qpassword} 第二步 调用MD5加密 import hehe.Str2MD5;String res = new Str2MD5() ...
- Mac下的UI自动化测试 (三)
使用sikuli进行UI自动化测试固然是方便很多,不用一切都使用AppleScript那烦人的语法,只要界面的UI没有变化,结构的变化不会影响到基于sikuli的自动化,但是基于AppleScript ...
- python web框架(bottle,flask,tornado)
Python的WEB框架 Bottle Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Python的标准库外,其不依赖任何其他模块. pip i ...