2013-07-01 85 views
0

我正在处理任务管理类型的应用程序。所以当有人完成任务时,任务创建者通过任务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("[email protected]", task.getTaskCreatorEmail(), "Your Task has been Completed", completedTaskBody); 
      } 
      } catch (AddressException e) { 
       e.printStackTrace(); 
      } 

    } 

    return listTasks; 
} 

那么什么是syncronize这种方法的最佳途径。

请让我知道如果有更多的细节需要

+2

什么是'sendmailService'类型,并且类是线程安全的? 'taskEntryService'同上 –

+0

这个方法是如何被调用的?用户是否点击了一个URL?你确定这个方法没有被错误的'Task'调用(可能是前端的一个bug)吗? –

+0

@EmilSit此方法是有人回复创建的任务。因此,此方法将值存储在数据库中并将电子邮件发送给任务创建者。当有人在同一时间回复任务时,这种情况只发生一次,否则其工作正常。 – user965884

回答

1

最简单的方法当然会是将其标记为在签名​​同步访问此方法。

@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被传入。

+0

感谢您的回复。我怎么能发现这种方法没有任何竞争条件。我在同一时间通过评论任务再次尝试,但这不会再发生在我身上,但担心我的任务数据可能会如何交换 – user965884

+0

您没有在此方法中调用任何“任务”增变器(至少,假设使用“get”方法不要改变),所以对我来说这种方法似乎不可能发生任何种族事件。 –

+0

嗨,埃米尔,对于迟到的回复抱歉。我认为你是对的,我的任务对象不是线程安全的。你能帮我解释一下,我怎样才能使我的任务对象线程安全的 – user965884