完成所有工作后终止现有池

时间:2015-05-11 19:57:00

标签: groovy gpars

好吧,对gpars来说是全新的,如果有明显的答案,请原谅我。

这是我的情景。我们目前有一段包含在Thread.start {}块中的代码。它这样做是为了它可以在后台发送消息到消息队列,而不是阻止用户请求。我们最近遇到的一个问题是对于大块工作,用户可能会执行另一个操作,这会导致该块再次执行。由于它是线程化的,第二批消息可能会在第一批消息发送到第一批消息之前发送。

我想将此过程更改为使用gpar作为队列流。我已经看过创建池的示例,例如

def pool = GParsPool.createPool()

def pool = new ForkJoinPool()

然后将池用作

GParsPool.withExistingPool(pool) {
    ...
}

这似乎可以说明如果用户再次执行操作,我可以重用已创建的池,并且如果我的池大小为1,则不会无序执行操作。

我的问题是,这是用gpars做到这一点的最好方法吗?此外,我如何知道游泳池何时完成所有工作?所有工作完成后会终止吗?如果是这样,是否有一种方法可用于检查池是否已完成/终止以知道我需要一个新的?

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:0)

不,显式创建的池本身不会终止。你必须明确地对它们调用shutdown()。

然而,使用withPool(){}命令将保证在代码块完成后销毁池。

答案 1 :(得分:0)

以下是我们对此问题的解决方案。应该注意的是,由于我们的要求,我们遵循了这条路线

  • 工作按某些上下文分组
  • 订购上下文中的工作
  • 在给定上下文中工作是同步的
  • 上下文的其他工作应在前面的工作之后执行
  • 工作不应阻止用户请求
  • 上下文之间是异步的
  • 完成上下文工作后,上下文应自行清理

鉴于上述情况,我们实施了以下内容:

{{1}}