场景如下:
我正在使用 Apache CXF 向客户端公开 Web 服务。收到请求并处理后,我需要在处理后的消息头中添加一个序列号,并通过MQ将其转发给另一个程序。我也使用 Spring 来处理 bean 管理和注入。
在不使用数据库的情况下管理序列的最佳方法是什么(因为仅为序列管理安装数据库似乎有巨大的开销和膨胀)。如果解决方案是使用文件(属性文件?),如果发生任何异常,我该如何选择一致性?当多个请求同时到达时,我还需要序列保持一致。
如果一切都在同一个类加载器中工作,您可以使用AtomicLong私有字段创建一个单例。
既然您将使用 MQ 进行转发,为什么不只使用 MQ 排序机制而不是自己跟踪呢?
如果你想自己跟踪,你应该研究一个(同步的)单例分配数字。如果你想在重启后保持序列,你将需要一个持久性机制(尽管不一定是数据库)。我确信可以设计一个 MQ 队列来提供这项服务,尽管它会非常不成比例;-)
因此,首先看一下 MQ 排序。
干杯,
如果该服务只有一个实例,则来自 的时间戳System.currentTimeMillis()
,这对于大多数情况应该足够了。如果您可以使用字符串作为标识符,我建议您使用时间戳字符串,加上以 nanos 为单位的时间。如果您有多个同时提供服务的 Web 服务实例,您可能需要一个单数计数器:
private static long counter = 0;
private static synchronized long nextCounter() {
return counter++;
}
(当然,您需要检查是否有溢出)
大多数时候,我将两者结合使用。