我在一个类上有一个非常奇怪的行为,不知道到底发生了什么。
1) 我有一个JSP,它用AJAX向Servlet发送请求2) servlet以以下方式处理此请求:-它对一个类进行反射,然后调用一个方法(从JSP中作为参数提供),然后将方法的结果输出回Ajax。
这是最初的问题,然后是我提出的部分解决方案:
对该方法的调用已经进行了多次,但我不知道为什么。JSP Ajax只调用它ONCE(测试了很多次),但servlet就像"重新加载自己",并多次调用该方法,因此在过程中会导致错误。由于我找不到servlet发生了什么,我使"反射"方法同步,因此无论请求多少次,一个请求都会完成,然后另一个请求会完成,以此类推。
但是。。。在抛出结束消息之前,会多次写入表示已访问的消息。。。所以我不明白,也许同步和反射不太好用?我缺少什么,为什么在方法完成之前会访问多次?根本不明白。你能帮我吗?
此外,您对最初的问题(类似servlet的"重新加载"本身)有什么想法吗?在这个问题中,我认为可能会发送一个头,使servlet重新加载,但我不确定。
编辑:
事实上,我正在做一个例子。这是我的servlet代码:
Class clase = Class.forName("com.cargaporinterfase.CargaPorInterfase_"+cd_matriz);
Object obj = clase.newInstance();
Method met = clase.getDeclaredMethod(metodo, new Class[]{String.class, String.class});
Ant被调用的方法是:
public synchronized String procesar(String url,String nu_spid) throws CargaPorInterfaseException{
//... more processing
}
您可能需要了解更多关于synchronized
功能的背景信息。
我使"反射"方法同步,因此无论有多少收到请求的次数,一次请求将完成[…]
方法上的synchronized
与synchronized(this) {...}
相同,其中this
是调用该方法的对象。
很有可能您正在处理同一类的多个不同实例(您正在使用反射),在这种情况下,synchronized
不会像您想象的那样工作。此外,在反射对象上同步与按请求同步完全不同(我认为您必须在Servlet实例上同步,尽管在某些情况下您可能也有多个实例。)
一些假设:
当你说"它对一个类进行了反射"时,我猜这意味着你正在使用反射来创建一个新对象。
我猜您调用的方法是实例方法(不是静态的)。
因此,如果这些猜测是正确的,使您通过反射调用的方法同步并不能防止调用重叠,因为您每次都在不同的对象上调用该方法。如果将synchronized
关键字添加到方法定义中,则它将使用调用该方法的对象作为其锁。