【发布时间】:2011-09-19 15:48:30
【问题描述】:
我的一个班级有一个非常奇怪的行为,我不知道到底发生了什么。
1) 我有一个 JSP,它使用 AJAX 向 Servlet 发送请求 2) servlet 以如下方式处理这个请求: - 它对一个类进行反射,然后调用一个方法(从 JSP 作为参数提供),然后将方法的结果输出回 Ajax。
所以这是最初的问题,然后是我想出的部分解决方案:
对该方法的调用被执行了多次,但我不知道为什么。 JSP-Ajax只调用一次(多次测试),但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
}
【问题讨论】:
-
即使在反射调用该方法时也应该强制执行同步。也许您可以发布似乎被多次调用的同步方法的代码。此外,我会在 doGet 方法的开头以及调用您的服务方法之前和之后将日志记录添加到 servlet 本身。
-
您每次调用时是否使用
createInstance?synchronized基于每个实例。 -
我认为我的问题是你所说的安德烈亚斯(至少是同步的问题),我将上面的代码粘贴在原始问题中。谢谢!
-
您需要找出 servlet 自身重新加载的原因,这是不正常的。 Mike Deck 关于日志记录的建议是一个很好的起点。
标签: java multithreading servlets reflection synchronization