Java 测试用同步模式干扰器

Java 测试用同步模式干扰器,java,disruptor-pattern,Java,Disruptor Pattern,为了单元测试一些包含干扰程序的代码,我需要确保在主测试线程继续之前处理发布到干扰程序的事件(显然,我不是在测试干扰程序代码) 在没有更优雅的解决方案的情况下,我克服了以下问题: ... ringBuffer.publish(sequence); while (ringBuffer.getBufferSize() > ringBuffer.remainingCapacity()) { Thread.yield(); } 但是,我想知道是否有某种方法可以将中断器设置为“同步模式”(我

为了单元测试一些包含干扰程序的代码,我需要确保在主测试线程继续之前处理发布到干扰程序的事件(显然,我不是在测试干扰程序代码)

在没有更优雅的解决方案的情况下,我克服了以下问题:

...
ringBuffer.publish(sequence);
while (ringBuffer.getBufferSize() > ringBuffer.remainingCapacity()) {
    Thread.yield();
}

但是,我想知道是否有某种方法可以将中断器设置为“同步模式”(我查看了,但找不到任何),或者有一个“同步模拟中断器”实现可供使用,以确保线程在
onEvent()处理完所有事件之前不会从
publish()
返回

中断器没有同步模式

有多种方法可以伪造一个:

  • 例如,阻止事件处理程序倒计时的发布服务器
  • 另一种选择是使用同一个线程执行器,例如来自的线程执行器,以便中断程序在上调度事件处理程序。因此,您可以控制事件处理程序何时处理事件

然而,对我来说,这更像是一个集成测试,而不是一个单元测试。为什么发布者需要“知道”消费者已经消费了该事件?

我认为该测试可以作为单元测试,因为我正在测试单个类中的特定功能。发布者需要知道事件已被使用,因为特定功能仅在之后才相关(本例中的发布者是测试线程本身)。如果我理解正确,您的第一个建议要求更改事件处理程序,这对我来说没有意义(因为这仅是测试所需)。我用Guava的
MoreExecutors.newDirectExecutorService()
尝试了你的第二个建议。但是,这会导致中断程序卡在
Disruptor.start()
上。很抱歉,我以为您在测试发布服务器。如果您测试eventHandler,您可以使用任意序列号调用
onEvent
方法,而无需进行线程间通信。这是一个有趣的想法,但需要我更改正在测试的代码的结构,因为我的
eventHandler
类当前是一个私有内部类(除了测试之外,没有理由公开它)。幸运的是,我可以(也将)这样做,但我希望有一个更优雅的解决方案。无论如何,你带来的努力和有趣的想法+1。