2010-06-30 84 views
4

我正在开发一个简单的Java测试框架,它需要通过响应JMS调用来模拟weblogic部署。其中一个测试配置选项是模拟延迟的延迟。我想知道如果有人有什么好的想法如何做到这一点。我只是想创建一个TimerTask来处理它,有没有更好的方法?谢谢。模拟Java中的延迟

回答

3

您可以创建一个ScheduledExecutorService来执行延迟后的操作。

private final ScheduleExecutorService executor = 
    Executors.newSingleThreadScheduledExecutor(); 


// is main loop, waits between 10 - 30 ms. 
executor.schedule(new Runnable() { public void run() { 
    // my delayed task 
}}, 10 + new Random().nextInt(20), TimeUnit.MILLI_SECOND); 

编辑:您可以使用Concurrency Backport为JDK 1.4。它适用于JDK 1.2到JDK 6

+0

这可能是我的首选,但不幸的是我使用的是Java 1.4。 – Igman 2010-07-01 00:34:30

+0

@Igman,见我的编辑 – 2010-07-02 07:13:49

2

如何只

Thread.sleep(10 + new Random().nextInt(20)); // waits between 10 - 30 ms. 

即在响应JMS叫你只是用它来模拟一个随机的等待时间延迟的代码。

+0

这是我原来的想法,问题在于,这与主线程相关,这不是我们系统的精确模拟。我希望应用程序在返回延迟响应之前能够在必要时响应下一条消息。 – Igman 2010-06-30 21:23:57

+0

@Igman嗯,在这种情况下,我理解你的问题,但这在架构上看起来很古怪。您是不是产卵了一个新线程或使用线程池来处理传入的JMS请求? – mikera 2010-06-30 22:20:55

0

您可以使用Quartz安排工作,这是否解决了目的?

+0

石英看起来像它可能有点大到我的目的,主要是因为我看到一个有几秒钟的延迟。石英似乎更适合定期安排的任务。 – Igman 2010-06-30 21:16:36

3

创建一个嘲笑服务器的对象。当它“接收”你的输入时,让它产生一个新线程来“处理连接”,就像真正的服务器一样。该产生的线程可以将Thread.sleep()放入其心脏的内容中,以模拟发送和接收延迟,并允许您模拟一些在测试期间可能有用的服务器状态属性。