2015-06-03 2 views
0

Я работаю над проектом J2EE, который, короче говоря, отправляет автоматическое письмо пользователю в назначенное время и позволяет пользователю загружать файлы с веб-страницы, которая отправляется по электронной почте им. Это работает очень хорошо.Java EJB @ Метод расписания Java-вызовов вызывается дважды

Однако мой метод таймера, который использует аннотацию @Schedule, вызывается дважды. Метод всегда выполняется сразу во время выполнения (чего я не хочу), а затем в назначенное время. Я включил код для Servlet, который загружается при развертывании моего приложения, класс Schedule и мой файл web.xml.

package downloadsupport; 

    import java.io.IOException; 
    import java.io.PrintWriter; 

    import javax.servlet.ServletException; 
    import javax.servlet.annotation.WebServlet; 
    import javax.servlet.http.HttpServlet; 
    import javax.servlet.http.HttpServletRequest; 
    import javax.servlet.http.HttpServletResponse; 

    import scheduleTimer.ScheduleEmail; 

    /** 
    * Servlet implementation class InitializeApplicationServlet 
    */ 
    @WebServlet("/DeployApplicationServlet") 
    public class DeployApplicationServlet extends HttpServlet { 
     private static final long serialVersionUID = 1L; 

     /** 
     * @see HttpServlet#HttpServlet() 
     */ 
     public DeployApplicationServlet() { 
      super(); 
     } 

     /** 
     * @see HttpServlet#doGet(HttpServletRequest request, 
     HttpServletResponse response) 
     */ 
     protected void doGet(HttpServletRequest request, HttpServletResponse 
     response) throws ServletException, IOException { 
      PrintWriter out = response.getWriter(); 
      out.println("Web Application Started"); 

      ScheduleEmail se = new ScheduleEmail(); 
      se.sendAutomatedEmail(); 
     } 

    /** 
    * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
    */ 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

    } 

} 




    package scheduleTimer; 

    import java.util.Date; 

    import javax.ejb.Schedule; 
    import javax.ejb.Stateless; 

    import java.net.*; 
    import java.io.*; 


    @Stateless 
    public class ScheduleEmail { 

     @Schedule(second = "0", minute = "10", hour = "12", dayOfWeek = "Wed") 
     public void sendAutomatedEmail() { 
      // Print Time to console for testing purposes 
      System.out.println(new Date()); 

      // Invoke the SendEmailServlet at the designated time 
      try { 
      URL emailServlet = new 
       URL("http://localhost:9081/downloadsupport/SendEmailServlet"); 
       URLConnection servletConn = emailServlet.openConnection(); 
      BufferedReader in = new BufferedReader(new InputStreamReader(
       servletConn.getInputStream())); 
      String inputLine; 

      while ((inputLine = in.readLine()) != null) 
       System.out.println(inputLine); 
       in.close(); 
      } 
      catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    <?xml version="1.0" encoding="UTF-8"?> 
    <web-app id="WebApp_ID" version="3.0" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 
     <display-name>downloadsupport</display-name> 

     <servlet> 
      <servlet-name>SendEmailServlet</servlet-name> 
      <servlet-class>downloadsupport.SendEmailServlet</servlet-class> 
     </servlet> 

     <servlet> 
      <servlet-name>DeployApplicationServlet</servlet-name> 
      <servlet-class>downloadsupport.DeployApplicationServlet</servlet- 
      class> 
     </servlet> 

     <welcome-file-list> 
      <welcome-file>DeployApplicationServlet</welcome-file> 
      <!-- <welcome-file>SendEmailServlet</welcome-file> --> 
      <welcome-file>index.html</welcome-file> 
      <welcome-file>index.htm</welcome-file> 
      <welcome-file>index.jsp</welcome-file> 
      <welcome-file>default.html</welcome-file> 
      <welcome-file>default.htm</welcome-file> 
      <welcome-file>default.jsp</welcome-file> 
    </welcome-file-list> 

    <servlet> 
     <servlet-name>DownloadServet</servlet-name> 
     <servlet-class>downloadsupport.DownloadServlet</servlet-class> 
    </servlet> 

    <!-- 
    <servlet-mapping> 
     <servlet-name>DownloadServlet</servlet-name> 
     <url-pattern>/downloadServlet</url-pattern> 
    </servlet-mapping> 
    --> 
    </web-app> 
+0

ли она выполнена 'сразу же запустить time' или, может быть, после того, как вы называете' DeployApplicationServlet'? :-) Почему вы создаете экземпляр своего компонента с помощью 'new' и почему вы вызываете метод' se.sendAutomatedEmail() '? – Gas

+0

Привет, большое спасибо за ваш ответ. Вот мой мыслительный процесс. Когда я запускаю свое веб-приложение, поскольку DeployApplicationServlet является первым приветственным файлом в моем web.xml, он запускает DeployApplicationServlet. Я создаю экземпляр ScheduleEmail в методе doGet моего DeployApplicationServlet, поэтому, когда загружается DeployApplicationServlet, вызывается метод sendAutomatedEmail (тот, у которого есть аннотация @Schedule), который вызывает другой сервлет (не показан выше), который отправляет электронное письмо пользователю в определенное время. – ElGatoGabe

+0

Вам не нужно создавать экземпляр 'ScheduleEmail'. Удалите эти две строки из сервлета, и он будет работать нормально. Контейнер несет ответственность за инициализацию ваших бобовых и вызывающих методов, отмеченных '@ Schedule'. – Gas

ответ

0

Ваш первый нежелательный вызов вызывается вами, а не не работает сервер.

Вам не нужно создавать экземпляр ScheduleEmail. Удалите эти две строки из сервлета, и он будет работать нормально.

Контейнер отвечает за инициализацию вашего боб и вызова методов, отмеченные @Schedule

-3

добавить аннотацию @Startup в классе

@Stateless 
@Startup 
public class ScheduleEmail { 
+0

Предоставление некоторых объяснений или цитирование соответствующих документов в вашем ответе поможет вашим читателям узнать. –

+0

Аннотации '@ Startup 'не влияют на' @ Stateless', только '@ Singleton'. Это не должно влиять на '@ Schedule'. –