将呼叫延迟作为IntStream提供

时间:2014-05-15 21:52:25

标签: java java-8 java-stream

我正在尝试使用Java 8和流,我试图替换的其中一个是我们所拥有的系统

  • 使用方面来测量呼出延迟(每个配置时间段)以发布Web服务,然后
  • 将这些结果输入复杂事件处理器(esper),以便
  • 我们可以发出提醒通知

所以,一步一步。对于第一步,我需要生成一个流(我认为),它允许我将这些延迟数字提供给现有的侦听器。了解这一点,获得下一个号码可能需要等到有电话。

我该怎么做?这是带注释的延迟方面。

public class ProfilingAspect {

    private ProfilingAction action;

    public ProfilingAspect(ProfilingAction action) {
        this.action = action;
    }

    public Object doAroundAdvice(ProceedingJoinPoint jp) throws Throwable{
        long startTime = System.currentTimeMillis();

        Object retVal = null;
        Throwable error = null;
        try{
            retVal = jp.proceed();
        }catch (Throwable t){
            error = t;
        }

        Class withinType = jp.getSourceLocation().getWithinType();
        String methodName = jp.getSignature().getName();

        long endTime = System.currentTimeMillis();
        long runningTime = endTime - startTime;
        // Let the IntStream know we have a new latency. Or really, we have an object 
        // stream with all this extra data
        action.perform(withinType, methodName, jp.getArgs(), runningTime, error);

        if( error != null ){
            throw error;
        }

        return retVal;
    }
}

1 个答案:

答案 0 :(得分:0)

好的,我有一个有效的例子。它不处理我必须缓冲结果的情况,尽管流的读取速度不够快。我愿意接受一些改进

public class LatencySupplier implements Supplier<SomeFancyObject> {

    private Random r = new Random();

    @Override
    public SomeFancyObject get() {
        try {
            Thread.sleep(100 + r.nextInt(1000));
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }

        return new SomeFancyObject(10 + r.nextInt(1000));
    }
}

public class SomeFancyObject {

    private static String[] someGroups = {"Group1","Group2","Group3"};
    private final String group;

    private int value;

    public SomeFancyObject(int value) {
        this.value = value;
        this.group = WSRandom.selectOne(someGroups);
    }

    public String getGroup() {
        return group;
    }

    public int getValue() {
        return value;
    }

    @Override
    public String toString() {
        return value + "";
    }
}

我的下一步是按时间创建一个流,这样我就可以进行平均/ 5分钟等等。

public class Sample {

    public static void main(String[] args) throws InterruptedException {


        Stream<SomeFancyObject> latencyStream = Stream.generate(new LatencySupplier());
        Map<Object,List<SomeFancyObject>> collect = latencyStream.limit(10).collect(Collectors.groupingBy(sfo -> sfo.getGroup()));
        System.out.println(collect);
        Object o = new Object();
        synchronized (o){
            o.wait();
        }

    }

}