我的一个班上有一个非常奇怪的行为,并且不知道到底发生了什么。
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
}
答案 0 :(得分:3)
一些假设:
当你说“它反映了一个类”时,我猜这意味着你正在使用反射创建一个新对象。
我猜你正在调用的方法是实例方法(不是静态的)。
因此,如果这些猜测是正确的,那么通过反射同步调用的方法不会阻止调用重叠,因为您每次都在不同的对象上调用该方法。如果将synchronized
关键字添加到方法定义中,它将使用调用该方法的对象作为其锁定。
答案 1 :(得分:3)
您可能希望了解synchronized
所做的更多背景信息。
方法上的我使“反射”方法同步,所以无论多少 它被请求的时间,一个请求 将完成[...]
synchronized
与synchronized(this) {...}
相同,其中this
是您调用方法的对象。
你很可能正在使用同一个类的多个不同实例(你正在使用反射),在这种情况下,synchronized
不会像你想象的那样工作。
另外,对反射对象进行同步与每个请求的同步完全不同(我假设您必须在Servlet实例上进行同步,尽管在某些情况下您可能也有多个实例。)