同步方法的最佳方法

时间:2013-07-01 13:23:37

标签: java multithreading spring spring-mvc

我正在开发一个任务管理类型的应用程序。因此,当某人完成任务时,任务创建者会使用任务URL通过电子邮件发送消息。我正在使用spring MVC来创建这个应用程序。所以现在问题是当几乎同时创建两个任务时,第一个任务的电子邮件我得到为第二个任务生成的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;
}

那么同步这种方法的最佳方法是什么。

如果需要更多详细信息,请与我们联系

1 个答案:

答案 0 :(得分: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