5

以下はautosysジョブとして設定されたURLです。このURLが連続して10回押されるたびに、不適切なデータ変更で連続して呼び出されます。一度に1つのスレッドだけにアクセスしたいです。

同期されたメソッドまたはブロックを使用する必要があることはわかっています..方法がわからない..スレッドに精通していないため.

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());
    }

    }
 }

}

4

2 に答える 2

3

の機能をpsServiceWrapper.processHRFeed()、Runnable を実装する単純なクラスに移動します。

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

次に、固定スレッド プール サイズ 1 で ExecutorService を作成します。

ExecutorService psServiceRunner = Executors.newFixedThreadPool(1);

サーブレットが呼び出されるたびに、MyTask のインスタンスをこのサーブレットに投稿します。

psServiceRunner.execute(new MyTask());

この意志

  1. サーブレットの呼び出し元をブロックしないでください。
  2. 任意の時点で 1 つのサーブレットのみがメソッドを実行できるようにします。
于 2012-09-14T11:30:57.327 に答える
2
synchronized(this){ 
 psServiceWrapper.processHRFeed();     
}

psServiceWrapper.processHRFeed();ただし、現在のスレッドで実行される までサーブレットが応答を停止するため、これはボトルネックにつながり ます。

Java 5 を使用している場合は、ReetrantLockを使用することもできます

同期されたメソッドとステートメントを使用してアクセスされる暗黙的な監視ロックと同じ基本的な動作とセマンティクスを持つ再入可能な相互排他ロックですが、拡張機能があります。

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

以下のように使用します

 lock.lock();  // block until condition holds
 try {
   psServiceWrapper.processHRFeed();
 } finally {
   lock.unlock()
 }
于 2012-09-14T11:03:58.570 に答える