Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 风暴不追上最大的花销_Java_Apache Storm - Fatal编程技术网

Java 风暴不追上最大的花销

Java 风暴不追上最大的花销,java,apache-storm,Java,Apache Storm,我已经创建了一个示例拓扑来测试设置max spout Expensing属性。这是一个简单的拓扑,有一个喷嘴和一个螺栓。喷口发出100000个元组,而螺栓在睡眠一秒钟后发出嘎嘎声。我已将“最大喷口支出”属性设置为10。我假设这意味着,如果一个喷口的未确认消息计数为10,那么该喷口将不会发出任何元组。但当我运行拓扑时,我可以看到喷口发出2160条消息,然后等待。我的理解是正确的还是遗漏了什么。我使用的是storm 0.9.5。 下面是代码 public static void main(Strin

我已经创建了一个示例拓扑来测试设置max spout Expensing属性。这是一个简单的拓扑,有一个喷嘴和一个螺栓。喷口发出100000个元组,而螺栓在睡眠一秒钟后发出嘎嘎声。我已将“最大喷口支出”属性设置为10。我假设这意味着,如果一个喷口的未确认消息计数为10,那么该喷口将不会发出任何元组。但当我运行拓扑时,我可以看到喷口发出2160条消息,然后等待。我的理解是正确的还是遗漏了什么。我使用的是storm 0.9.5。 下面是代码

public static void main(String[] args) {

    TopologyBuilder builder = new TopologyBuilder();
    builder.setSpout("spout", new TestSpout(), 1);
    builder.setBolt("bolt", new TestBolt(),1).shuffleGrouping("spout");
    Config conf = new Config();
    conf.setNumWorkers(1);
    conf.setMaxSpoutPending(10);
    try {
        StormSubmitter.submitTopology("test", conf, builder.createTopology());
    } catch (AlreadyAliveException e) {
        e.printStackTrace();
    } catch (InvalidTopologyException e) {
        e.printStackTrace();
    }
}


public class TestSpout extends BaseRichSpout {
private SpoutOutputCollector collector;
private int count = 1;

@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
    declarer.declare(new Fields("spoutData"));
}

@Override
public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {
    this.collector = collector;
    System.out.println(context.maxTopologyMessageTimeout());
}

@Override
public void nextTuple() {

    if(count <= 100000) {
        System.out.println("Emitting : " + count);
        collector.emit(new Values(count++ + ""));
    }
}

}

您需要将消息ID分配给在
Spout.nextTuple()方法中发出的元组。否则,将忽略参数
max.spout.pending
。例如,您可以使用
count
变量作为ID(基本上,任何东西都可以用作ID。它必须是唯一的。)

@覆盖
public void nextTuple(){

如果(count)尝试了这一点。我仍然可以看到,在喷口级别,确认和发出之间的差异为30000。这种差异是永久存在的?还是仅在短时间内存在?也许您希望设置参数
max.spout.pending
。是否看到失败(即超时)元组?您可能还需要增加
Config.TOPOLOGY\u MESSAGE\u TIMEOUT\u SECS
(参见此处)
public class TestBolt extends BaseRichBolt {
private OutputCollector collector;

@Override
public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
    this.collector = collector;
}

@Override
public void execute(Tuple input) {
    try {
        System.out.println(input.getString(0));
        Thread.sleep(1000);
        collector.ack(input);
    } catch (InterruptedException e) {
        e.printStackTrace();
        System.out.println("Exception");
    }
}

@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {

}
@Override
public void nextTuple() {
    if(count <= 100000) {
        System.out.println("Emitting : " + count);
        collector.emit(new Values(count++ + ""), count);
    }
}