0

私はタスク管理タイプのアプリケーションに取り組んでいます。したがって、誰かがタスクを完了すると、タスク作成者はタスク URL を含むメッセージを電子メールで送信します。Spring MVC を使用してこのアプリケーションを作成しています。問題は、2 つのタスクがほぼ同時に作成された場合です。1 番目のタスクのメールから 2 番目のタスクの URL が生成されます。

この機能を実行するために次のメソッドを作成しました

 @RequestMapping(value = "commentTask", method = RequestMethod.POST)
@ResponseBody public List<List<Task>> reply(@ModelAttribute Task task,@RequestParam ("parentId") long parentId,HttpSession session) {
    List<List<Task>> listTasks = null;

    taskEntryService.insertTask(task,session);

    listTasks = taskEntryService.selectAssignedTask(task.getAssignTo(), parentId);

    String taskurl = siteUrl + "showAssignedTask?assignto="+ task.getAssignTo() + "&taskId="+parentId; 

    if(task.getTaskUpdateEmailNotify().equalsIgnoreCase("1")){

            try {

                if(task.getStatus() == 4){

                    String completedTaskBody = taskCompletedEmailBody(taskurl, task.getAssignToName(), task.getTaskTitle(), task.getAssignerName(), task.getSummary()); 

                    sendmailService.sendMail("no-reply@gmail.com", task.getTaskCreatorEmail(), "Your Task has been Completed", completedTaskBody);
            }
            } catch (AddressException e) {
                e.printStackTrace();
            }

    }

    return listTasks;
}

したがって、この方法を同期する最良の方法は何ですか。

詳細が必要な場合はお知らせください

4

1 に答える 1

1

もちろん、このメソッドへのアクセスを同期する最も簡単な方法synchronizedは、署名でそれをマークすることです。

 @RequestMapping(value = "commentTask", method = RequestMethod.POST)
 @ResponseBody
 public synchronized List<List<Task>> reply(@ModelAttribute Task task,
      @RequestParam ("parentId") long parentId,
      HttpSession session) {

コードに特定の競合状態があるようには見えないため、ここでの同期で問題が解決されるとは思えません。提供されたTaskオブジェクトから完全な URL を作成するように注意します。どういうわけか、Taskオブジェクトがスレッドセーフではないか、間違ったparentIdものが渡されていると思われます。

于 2013-07-01T14:27:26.870 に答える