1

こんにちはみんな!送信ボタンをクリックして特定のIDにメールを送信する小さなアプリケーションを開発しました。今私のニーズに従って:

  1. 特定の時間に自動的にメールを送信する必要があります。
  2. これを明確にするために、メールは特定の時間に特定のIDに送信する必要があります。

したがって、必要なのは、プロセスを自動的に作成することです。

任意の提案をいただければ幸いです。

protected void processRequest(HttpServletRequest request,
        HttpServletResponse response)
        throws IOException, ServletException {final String err = "/error.jsp";
    final String succ = "/success.jsp";


    String to = request.getParameter("to");
    String subject = request.getParameter("subject");
    String message = request.getParameter("message");
    String login = request.getParameter("login");
    String password = request.getParameter("password");

    try {
        Properties props = new Properties();
        props.setProperty("mail.host", "smtp.gmail.com");
        props.setProperty("mail.smtp.port", "587");
        props.setProperty("mail.smtp.auth", "true");
        props.setProperty("mail.smtp.starttls.enable", "true");

        Authenticator auth = new SMTPAuthenticator(login, password);

        Session session = Session.getInstance(props, auth);

        MimeMessage msg = new MimeMessage(session);
        msg.setText(message);
        msg.setSubject(subject);


        msg.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
        Transport.send(msg);

    } catch (AuthenticationFailedException ex) {
        request.setAttribute("ErrorMessage", "Authentication failed");

        RequestDispatcher dispatcher = request.getRequestDispatcher(err);
        dispatcher.forward(request, response);

    } catch (AddressException ex) {
        request.setAttribute("ErrorMessage", "Wrong email address");

        RequestDispatcher dispatcher = request.getRequestDispatcher(err);
        dispatcher.forward(request, response);

    } catch (MessagingException ex) {
        request.setAttribute("ErrorMessage", ex.getMessage());

        RequestDispatcher dispatcher = request.getRequestDispatcher(err);
        dispatcher.forward(request, response);
    }
    RequestDispatcher dispatcher = request.getRequestDispatcher(succ);
    dispatcher.forward(request, response);

}

private class SMTPAuthenticator extends Authenticator {

    private PasswordAuthentication authentication;

    public SMTPAuthenticator(String login, String password) {
        authentication = new PasswordAuthentication(login, password);
    }

    protected PasswordAuthentication getPasswordAuthentication() {
        return authentication;
    }
}

protected void doGet(HttpServletRequest request,
        HttpServletResponse response)
        throws ServletException, IOException {
    processRequest(request, response);
}

protected void doPost(HttpServletRequest request,
        HttpServletResponse response)
        throws ServletException, IOException {
    processRequest(request, response);
}
}
4

4 に答える 4

2

QuartzスケジューラのJavaライブラリを確認してください。幅広い構成およびセットアップオプションがあり、最も単純な(たとえば、標準のJavaに類似したTimer)ユースケースから複雑なcronのような動作までのユースケースに及びます。

Quartzは、フル機能のオープンソースジョブスケジューリングサービスであり、最小のスタンドアロンアプリケーションから最大のeコマースシステムまで、事実上すべてのJavaEEまたはJavaSEアプリケーションと統合または併用できます。Quartzを使用して、数十、数百、さらには数万のジョブを実行するための単純または複雑なスケジュールを作成できます。タスクが標準のJavaコンポーネントとして定義されているジョブで、プログラムして実行できる事実上すべてを実行できます。

于 2012-09-14T09:05:07.240 に答える
0

Quartzに加えて、Timer API(http://java.sun.com/j2se/1.4.2/docs/api/java/util/Timer.html)もあります。

A facility for threads to schedule tasks for future execution in a background thread. Tasks may be scheduled for one-time execution, or for repeated execution at regular intervals.

Webアプリケーションに追加する新しいサーブレットにタイマーコードを配置します。または、Webアプリケーションの既存のサーブレットにコードを追加します。

他にもたくさんのオープンソーススケジューリングAPIがあります。

于 2012-09-14T09:42:57.270 に答える
0

ビカス、

電子メールジョブを開始するには、スケジューリングメカニズムを使用する必要があります。さらに、メールジョブプログラムを別のJavaクラスに保持し、サーブレットでスケジューリングコードを使用することをお勧めします。

于 2012-09-14T11:16:16.193 に答える
0
public class ClassExecutingTask {

long delayfornextstart = 60*60*24*7*1000; // delay in ms : 10 * 1000 ms = 10 sec.
LoopTask tasktoexecute = new LoopTask();
Timer timer = new Timer("TaskName");
public void start() throws ParseException, InterruptedException {
timer.cancel();
timer = new Timer("TaskName");
//@SuppressWarnings("deprecation")
//Date executionDate = new Date(2013-05-04); // no params = now
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
System.out.println("waiting for the rght day to come");
Date executionDate = sdf.parse("2014-04-03");

Date date1 = sdf.parse("2014-04-07");

Date date2 = sdf.parse("2014-04-07");
System.out.println(date1+"and"+date2);
long waitTill=getTimeDiff(date2,date1);
if(date2==date1)
{
    waitTill=0;
     System.out.println(waitTill);
}

   System.out.println(waitTill);
  Thread.sleep(waitTill);
timer.scheduleAtFixedRate(tasktoexecute, executionDate, delayfornextstart);
}

private class LoopTask extends TimerTask {
public void run() {
    ExcelReadExample EE=new ExcelReadExample();
    try {
        EE.ReadFile();//ur Mail code or the method which send the MAil
    } catch (IOException e) {
        e.printStackTrace();
    }
}
}

public static void main(String[] args) throws ParseException, InterruptedException {
ClassExecutingTask executingTask = new ClassExecutingTask();
executingTask.start();
}
public static long getTimeDiff(Date dateOne, Date dateTwo) {
    String diff = "";
    long timeDiff = Math.abs(dateOne.getTime() - dateTwo.getTime());
    diff = String.format("%d hour(s) %d min(s)",     TimeUnit.MILLISECONDS.toHours(timeDiff),
            TimeUnit.MILLISECONDS.toMinutes(timeDiff) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(timeDiff)));
    return timeDiff;
}


}
于 2014-04-07T12:06:33.330 に答える