(要清除问题,'T'指的是在Class中声明的类型参数)
举个例子,请查看以下应用程序:
public class TestClass {
interface InterfaceA{}
interface InterfaceB{}
interface InterfaceC{}
class ClassA implements InterfaceA, InterfaceB, InterfaceC{}
public static void main(String[] args){
Class<? super ClassA> superClass1 = ClassA.class;
Class<? super ClassA> superclass2 = InterfaceA.class;
Class<? super ClassA> superclass3 = InterfaceB.class;
Class<? super ClassA> superclass4 = InterfaceC.class;
for(Class<?> clazz : ClassA.class.getInterfaces()){
System.out.println(clazz.getName());
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出是人们所期望的:
TestClass$InterfaceA
TestClass$InterfaceB
TestClass$InterfaceC
Run Code Online (Sandbox Code Playgroud)
因此,基于上面的这个例子,我们可以看到编译器认识到InterfaceA 确实符合通配符的边界,所有其他接口也是如此.
直观地说,我希望以下是安全的,但它不是:
Class<? super ClassA>[] interfaces = ClassA.class.getInterfaces();
Run Code Online (Sandbox Code Playgroud)
编译器发出警告,因为签名表示它返回Class; 但是,Class的javadoc声明如下:
如果此对象表示类,则返回值是一个数组,其中包含表示该类实现的所有接口的对象.
'这个对象'在我们的例子中指的是ClassA.基于此声明,如果我们致电:
ClassA.class.getInterfaces()
Run Code Online (Sandbox Code Playgroud)
然后我们从逻辑上知道Class<?>返回数组中的每一个都将包含对超类型的引用ClassA …
所以,我有一个Web客户端和一个EJB计时器,单独部署.
工作流程如下:
1)用户访问客户端.2)用户请求发生已知长时间运行的操作,因此我们在数据库表中编写运行此进程的请求.3)TimerOne每隔几秒检查一次该表以查看是否有任何等待任务,因此它找到用户的请求并运行任务.
我的问题是,在我们的应用程序运行的某些环境中,我们正在利用服务器群集.当我们这样做时,客户端和EJB计时器都部署到集群中的每个服务器.
将客户端部署到多个服务器是可以的,因为它有助于工作负载; 但是,让计时器在多个服务器上运行是一个问题.当用户请求运行长时间运行的任务时,两个计时器同时从数据库中获取任务并开始运行它.由于长时间运行的作业通常写入数据库,因此这种情况会导致冲突等问题.
我的目标是能够将我的EJB计时器部署到两个服务器,但是要在整个集群中维护一些状态,计时器可以使用它来决定是否应该接收任务或者其他实例之一是否有已经把它拿了起来.
我尝试使用数据库并尝试文件存储,但这些要么太慢,要么我无法提出防弹工作流程来进行同步.
有谁知道处理这个问题的好方法?它甚至可能吗?
该解决方案应该能够在集群WebLogic域,非集群WebLogic域,集群Glassfish域和非集群Glassfish域上运行.
如果有另一种更加优雅的解决方案,我愿意改变这种方式.
谢谢你的任何想法!