簡體   English   中英

在獨立java程序中調用rest web服務時的並發問題

[英]Concurrency issue while calling rest web service in standalone java programme

我正在嘗試使用執行器框架使用固定線程池。 提交給執行器的每個可運行實例都是處理 java 結果集的工作線程。 對於結果集的每次迭代,我必須調用使用 oauth 令牌的 rest webservice。 oauth 令牌將在每 50 分鍾后刷新一次,並且需要在提交給執行程序的所有可運行程序之間共享。我也在使用每 50 分鍾后執行一次的預定執行程序,但有時它會被正確調用,而有些時間不是由於哪個其余 Web 服務失敗,因為它在其標頭中使用了過期的令牌。 我需要確保每 50 分鍾后必須調用預定的服務而不會失敗。 但我堅持這一點。 此外,我需要一些機制,在完成其余 Web 服務調用組之后,在迭代結果集時只應進行新的 Web 服務調用。

ThreadPoolExecutor executorPool = (ThreadPoolExecutor) Executors.newFixedThreadPool(2);
WorkerThread wt1=new WorkerThread(conn,Queries.getAddressInfo("AL"),oauth_token,restTemplate);
WorkerThread wt2=new WorkerThread(conn,Queries.getAddressInfo("AK"),oauth_token,restTemplate);
executorPool.execute(wt1);
executorPool.execute(wt2);

ScheduledFuture scheduledFuture =
scheduledExecutorService.schedule(new Runnable() {
    public void run()  {

        System.out.println("token service");

        String url="";
        try {
            url = WebServicePropertyFileReader.getOauthUrl()+String.format(urlToGetOauthToken, WebServicePropertyFileReader.getClientId(),
                    WebServicePropertyFileReader.getClientSecret());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        Layer7Token token=restTemplate.postForObject(url, null, Layer7Token.class);
        GlobalTokenAccessor.oauth_token=token.getAccessToken();
    }
},
50,
TimeUnit.MINUTES);

有兩個問題: schedule 只安排一次。 您應該使用 scheduleAtFixedRate 來安排定期任務。 不能保證線程會在 50 分鍾內得到調度。 因此,您可能希望每 49 分鍾左右安排一次刷新。 其次,您應該通過同步的寫入和讀取方法來控制對共享變量的訪問。 否則,讀取線程可能會讀取不正確的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM