1

场景如下:

我正在使用 Apache CXF 向客户端公开 Web 服务。收到请求并处理后,我需要在处理后的消息头中添加一个序列号,并通过MQ将其转发给另一个程序。我也使用 Spring 来处理 bean 管理和注入。

在不使用数据库的情况下管理序列的最佳方法是什么(因为仅为序列管理安装数据库似乎有巨大的开销和膨胀)。如果解决方案是使用文件(属性文件?),如果发生任何异常,我该如何选择一致性?当多个请求同时到达时,我还需要序列保持一致。

4

3 回答 3

2

如果一切都在同一个类加载器中工作,您可以使用AtomicLong私有字段创建一个单例。

于 2012-10-30T07:56:51.527 回答
1

既然您将使用 MQ 进行转发,为什么不只使用 MQ 排序机制而不是自己跟踪呢?

如果你想自己跟踪,你应该研究一个(同步的)单例分配数字。如果你想在重启后保持序列,你需要一个持久性机制(尽管不一定是数据库)。我确信可以设计一个 MQ 队列来提供这项服务,尽管它会非常不成比例;-)

因此,首先看一下 MQ 排序。

干杯,

于 2012-10-30T07:53:19.790 回答
1

如果该服务只有一个实例,则来自 的时间戳System.currentTimeMillis(),这对于大多数情况应该足够了。如果您可以使用字符串作为标识符,我建议您使用时间戳字符串,加上以 nanos 为单位的时间。如果您有多个同时提供服务的 Web 服务实例,您可能需要一个单数计数器:

private static long counter = 0;
private static synchronized long nextCounter() {
    return counter++;
}

(当然,您需要检查是否有溢出)

大多数时候,我将两者结合使用。

于 2012-10-30T07:57:03.483 回答