2012-09-14 33 views
4

下面给出的是配置为autosys作业的URL。这调用了下面给出的servlet。任何人都可以告诉我如何保护此方法“psServiceWrapper.processHRFeed();”被连续调用不正确的数据修改,每次这个url被连续按10次。我希望它一次只能访问一个线程。防止我的应用程序中的servlet的多重访问

我知道我必须使用同步的方法或块..am不知道如何...因为我不熟悉线程。

http://mydomain:11000/dorf/HRDORFScriptServlet?script=hrFeed 


public class HRDORFScriptServlet extends HttpServlet { 

private static final long serialVersionUID = 1L; 
private static final Logger log = Logger.getLogger(HRDORFScriptServlet.class); 
private final String script = "script"; 

@Override 
protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException { 
    // TODO Auto-generated method stub 
    performTask(arg0, arg1); 
} 

@Override 
protected void doPost(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException { 
    // TODO Auto-generated method stub 
    performTask(arg0, arg1); 
} 

/** Execute the servlet. 
* 
* @param request 
* @param response 
* @throws ServletException 
* @throws IOException 
*/ 
public void performTask(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException { 

    DorfUser dorfUser = DorfSessionUtils.getDorfUser(request.getSession()); 
    HRDorfFeedServiceWrapper psServiceWrapper = new HRDorfFeedServiceWrapper(dorfUser); 
    String reqParam = request.getParameter(script); 
    if(reqParam.equals("hrFeed")){ 
    try{ 
     psServiceWrapper.processHRFeed();   
    } 
    catch(ServiceException se){ 
     log.error("Error While calling HRFeed Service : "+se.getMessage()); 
    } 
    catch(Exception e){ 
     log.error("Error While calling HRFeed Service : "+e.getMessage()); 
    } 

    } 
} 

}

回答

3

我的psServiceWrapper.processHRFeed()功能移动到实现Runnable一个简单的类。

public class MyTask implements Runnable 
{ 
    public void run() 
    { 
     psServiceWrapper.processHRFeed(); 
    } 
} 

然后创建一个ExecutorService以1

ExecutorService psServiceRunner = Executors.newFixedThreadPool(1); 

每当一个固定的线程池的大小在servlet被调用时,我会后MyTask的实例,这一个。

psServiceRunner.execute(new MyTask()); 

这将

  1. 不能阻止你的servlet调用程序。
  2. 确保只有一个servlet可以在任何时间点运行该方法。
2
synchronized(this){ 
psServiceWrapper.processHRFeed();  
} 

但是,这会导致瓶颈,因为你的servlet将停止响应,直到psServiceWrapper.processHRFeed();由当前线程执行。

您也可以你ReetrantLock如果你使用的是Java 5

使用synchronized方法和语句,但功能更强大访问具有相同的基本行为和语义的隐式监视器锁可重入的互斥锁。

private final ReentrantLock lock = new ReentrantLock();//Declare it 

使用它像下面

lock.lock(); // block until condition holds 
try { 
    psServiceWrapper.processHRFeed(); 
} finally { 
    lock.unlock() 
} 
+0

正如本文中提到的序列化访问将确实解决您的问题,但是以牺牲应用程序的活力为代价。你的实际问题是processHRFeed()方法不是并发的。如果性能在你的项目中是有意义的,并且如果你有权访问方法的实现(也就是说,如果你可以修改它的话),我会建议调查你是否可以重新设计方法以便通过并发线程安全地运行。 –

相关问题