请教banq,在应用服务器不提供这种singleton服务的时候,该如何实现singleton呢?

比如系统中有一个队列,所有的cluster机器都必须访问这个队列,该如何保证队列仅有一个实例,进而保证逻辑的正确性?

有人建议使用JNDI来解决,即通过JNDI来访问该队列,获取实例,再进行处理,这样可以吗?

应该是可以的,实际就类似这篇文章的做法,该队列所在JVM不参与集群,做一个备份就可以,不过这个方法动作大了点。

在集群中一般singleton的设计都可以被化解的,不知你这个队列根据项目需要是不是可以重新设计,将之化解?你这实际上是状态唯一性,可否使用数据库,然后分布式cache来解决?

谢谢banq大哥!

我准备采用JNDI的方案试试。

至于第二种方法,使用数据库作为中介,在这个系统中可能会有一定难度同时可能会有效率的影响。因为在系统中,队列中每一个元素保存的信息是比较复杂的。

队列中的每一个元素是当前正在运行的报表请求的抽象,姑且称之为一个job吧。每个job可能会于多个用户请求相对应(这多个用户请求报表的条件相同)。这个可以通过观察者模式来解决。当这个job运行完毕,需要通知这些用户请求(观察者),让这些请求进行下一步的动作。

如此一来,不仅要在数据库中保存job的信息,同时还要保存job的观察者信息。是不是复杂了点?呵呵。