方案如下:
我正在使用Apache CXF向客户端公开Web服务。 在收到请求并处理它之后,我需要在处理过的消息头中添加一个序列号,然后我通过MQ将它转发给另一个程序。 我也使用Spring来处理bean管理和注入。
在不使用数据库的情况下管理序列的最佳方法是什么(因为为序列管理安装数据库似乎有巨大的开销和膨胀)。 如果解决方案是使用文件(属性文件?),如果发生任何异常,我如何选择一致性? 此外,当多个请求同时到达时,我需要序列保持一致。
答案 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++;
}
(当然,你需要检查溢出)
大多数时候,我使用两者的组合。