我有一個非常簡單的Java Web應用程序,它在開發系統上顯示出一些非常奇怪的行爲。這個執行流程如何實現?
//XXX: this shouldn't really be 'synchronized', but I've declared it as such
// for the sake of debugging this issue
public synchronized ModelAndView submitRegister(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String email = request.getParameter("email");
String pass = request.getParameter("pass");
String conf = request.getParameter("conf");
String name = request.getParameter("name");
EntityManager em = DatabaseUtil.getEntityManager(request);
//[make sure required fields are present and valid, etc.]
User user = getUserForEmail(email, em);
if (user != null) {
//[user already exists, go to error page]
}
//create the new user
em.getTransaction().begin();
try {
user = new User();
//[set fields, etc.]
em.persist(user);
//[generate e-mail message contents]
boolean validEmail = EmailUtility.sendEmail(admin, recip, subject, message, null, recip);
if (validEmail) {
em.getTransaction().commit();
//[go to 'registration successful' page]
}
em.getTransaction().rollback();
//[go to error page]
}
catch (Exception e) {
em.getTransaction().rollback();
//[go to error page]
}
}
在EmailUtility.sendEmail()
呼叫時發生該問題:問題與註冊處理程序,其按如下方式implented開始。該方法的代碼是非常簡單的:
public static boolean sendEmail(String fromAddress, String to, String subject, String message, String fromHeaderValue, String toHeaderValue) {
try {
Session session = getMailSession(to);
Message mailMessage = new MimeMessage(session);
mailMessage.setFrom(new InternetAddress(fromAddress));
if (fromHeaderValue != null) {
mailMessage.setHeader("From", fromHeaderValue);
}
if (toHeaderValue != null) {
mailMessage.setHeader("To", toHeaderValue);
}
mailMessage.setHeader("Date", new Date().toString());
mailMessage.setRecipients(RecipientType.TO, InternetAddress.parse(to, false));
mailMessage.setSubject(subject);
mailMessage.setContent(message, "text/html;charset=UTF-8");
Transport.send(mailMessage);
return true;
} catch (Throwable e) {
LOG.error("Failed to send e-mail!", e);
return false;
}
}
什麼情況是,當代碼達到的,而不是調用該方法執行呼籲EmailUtility.sendEmail()
,通過遞歸submitRegister()。這很容易成爲我見過的最奇異的事情之一。
有一段時間我甚至都不相信那是實際發生的事情;但在這一點上,我已經通過同步所涉及的方法並在兩種方法的每一行中添加了打印語句來確認它。 submitRegister()
遞歸,而sendEmail()
永遠不會被調用。我不知道這怎麼可能。
令人沮喪的是,完全相同的代碼就像它應該在生產服務器上運行一樣。只有在開發系統上纔會出現這個問題。
任何有關可能導致此問題的建議以及我可以如何解決該問題都是值得歡迎的。
你在調試版本嗎? – Azodious