我有从SDN接收从交换机到泛光灯控制器的数据包的方法,这意味着每个新的数据包都会触发此方法。我想在该方法中计算每秒的数据包。
这是我的尝试;它是正确的?
int CLoad,avergeLoad =0;
final String switchId = sw.getStringId();
CLoad = CLoad + 1;
avergeLoad = CLoad;
loadTable.put(switchId, avergeLoad);
ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);
exec.scheduleAtFixedRate(new Runnable()
{
public void run()
{
avergeLoad =(avergeLoad + CLoad)/2;
loadTable.put(switchId, avergeLoad);
CLoad=0;
}
}, 40, 1000, TimeUnit.SECONDS);
答案 0 :(得分:1)
您可以使用Metrics meter
米以几种不同的方式衡量事件的发生率。该 平均比率是事件的平均比率。它通常很有用 琐事,但因为它代表了你的申请的总费率 整个生命周期(例如,处理的请求总数,除以 通过进程运行的秒数,它没有 提供新的感觉。幸运的是,米也记录了三种不同 指数加权移动平均速率:1分钟,5分钟和15分钟 移动平均线。
的Maven:
<dependency>
<groupId>io.dropwizard.metrics</groupId>
<artifactId>metrics-core</artifactId>
<version>3.1.2</version>
</dependency>
示例代码:
//Setup the reporter
ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics)
.convertRatesTo(TimeUnit.SECONDS)
.convertDurationsTo(TimeUnit.MILLISECONDS)
.build();
reporter.start(1, TimeUnit.SECONDS);
//Initialize Metrics Metter
final Meter getRequests = registry.meter(name(WebProxy.class, "get-requests", "requests"));
// Mark when event occurs
getRequests.mark();
参考: