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

问题描述:

该场景如下:如何在没有数据库的情况下管理java中的序列?

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

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

+0

它必须是一个序列或独特的ID足够吗? – beny23

+2

你有这个criteria..if一旦序列号被分配给它不应该在未来的任何点被分配到其他消息的一个消息头......我想你可以使用的AtomicLong通过artplasticka – user533

+0

给它必须是一个序列,这意味着每个值都是以前的值+ 1 – Benchik

如果一切同一个类加载器内的作品,你可以创建一个AtomicLong私人领域的单。

既然你将与MQ进行转发,为什么不干脆的MQ排序机制,而不是跟踪自己吗?

如果你想跟踪自己,你应该考虑一个(同步)单少量发放数量。如果你想在重新启动后维护序列,将需要一个持久性机制(尽管不一定是DB)。我敢肯定,人们可以工程师MQ队列提供这项服务,尽管这将是疯狂了的比例;-)

因此,看看MQ排序第一。

干杯,

+0

MQ排序要求接收应用程序能够检索组中的消息。在我的情况下这个应用程序是一个黑匣子,因此我不知道它是否有这样的能力。 – Benchik

+0

您声明“...将序列号添加到已处理的消息头中......”您是不是在说这里的MQ消息?如果不是,你怎么知道你的黑盒在另一端会理解消息体/值对象中的序列ID? –

+0

我确实在MQ上写了一条消息,黑匣子知道如何读取我放入消息正文中的序列号。但我不确定它是否知道如何读取消息的MQ头中的序列。 – Benchik

如果该服务只有一个实例,从System.currentTimeMillis()时间戳,这应该是足够的大多数情况下。如果你可以使用一个字符串作为标识符,我会建议使用时间戳字符串,加上纳秒的时间。 如果你有在同一时间服务的Web服务的多个实例,你可能需要一个singelton计数器:

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

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

大部分时间里,我使用两者的组合。