如何在没有DB的情况下管理java中的序列?

时间:2012-10-30 07:43:19

标签: java spring cxf

方案如下:

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

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

3 个答案:

答案 0 :(得分:2)

如果所有内容都在同一个类加载器中运行,则可以创建一个包含AtomicLong私有字段的单例。

答案 1 :(得分:1)

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

如果你想自己跟踪,你应该查看(同步)单身数字输出数字。如果您想在重新启动后维护序列,需要一个持久性机制(尽管不一定是数据库)。我确信有人可以设计一个MQ队列来提供这项服务,虽然它会大大超出比例; - )

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

干杯,

答案 2 :(得分:1)

如果该服务只有一个实例,那么System.currentTimeMillis()的时间戳应该足以满足大多数情况。如果您可以使用字符串作为标识符,我建议使用时间戳字符串,加上纳米时间。 如果您同时提供多个Web服务实例,您可能需要一个singelton计数器:

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

(当然,你需要检查溢出)

大多数时候,我使用两者的组合。