【问题标题】:Implementation to create a reporting methodology to report to admin through mail实施以创建报告方法以通过邮件向管理员报告
【发布时间】:2011-08-09 08:48:37
【问题描述】:

持续监控 http 请求,如果返回代码 200,则不采取任何措施,但如果返回 404,则应通过警告或邮件提醒管理员。

我想知道如何从 Java 的角度来处理它。可用的代码不是很有用。

【问题讨论】:

  • 在哪里有售?你想要什么?你都尝试了些什么? Java≠JavaScript。顺便说一句,你不能在 JavaScript 中发送邮件,你也需要一个服务器端脚本。
  • 我想要一个使用 Java 的恒定 http 请求监视器,如果返回的代码是 404,那么我希望程序向站点管理员发送邮件。不好意思问错了
  • 那么这个问题和JavaScript一点关系都没有。您认为哪些代码不是很有用?

标签: java http heartbeat


【解决方案1】:

首先,您应该考虑使用为这项工作设计的现有工具(例如Nagios 等)。否则,您可能会发现自己重写了许多相同的功能。一旦检测到问题,您可能只想发送一封电子邮件,否则您将向管理员发送垃圾邮件。同样,您可能希望等到第二次或第三次失败后再发送警报,否则您可能会发送错误警报。现有工具确实可以为您处理这些事情以及更多事情。

也就是说,您具体要求的内容在 Java 中并不太难。下面是一个简单的工作示例,可以帮助您入门。它通过每 30 秒向 URL 发出请求来监视 URL。如果它检测到状态代码 404,它将发送一封电子邮件。它依赖于 JavaMail API 并且需要 Java 5 或更高版本。

public class UrlMonitor implements Runnable {
    public static void main(String[] args) throws Exception {
        URL url = new URL("http://www.example.com/");
        Runnable monitor = new UrlMonitor(url);
        ScheduledExecutorService service = Executors.newScheduledThreadPool(1);
        service.scheduleWithFixedDelay(monitor, 0, 30, TimeUnit.SECONDS);
    }

    private final URL url;

    public UrlMonitor(URL url) {
        this.url = url;
    }

    public void run() {
        try {
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            if (con.getResponseCode() == HttpURLConnection.HTTP_NOT_FOUND) {
                sendAlertEmail();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void sendAlertEmail() {
        try {
            Properties props = new Properties();
            props.setProperty("mail.transport.protocol", "smtp");
            props.setProperty("mail.host", "smtp.example.com");

            Session session = Session.getDefaultInstance(props, null);
            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress("me@example.com", "Monitor"));
            message.addRecipient(Message.RecipientType.TO,
                    new InternetAddress("me@example.com"));
            message.setSubject("Alert!");
            message.setText("Alert!");

            Transport.send(message);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

【讨论】:

  • 我不想这么说,但我认为你的比我的更可取:)
【解决方案2】:

我将从石英调度程序开始,并创建一个 SimpleTrigger。 SimpleTrigger 将使用 httpclient 创建连接并使用 JavaMail api 在出现意外答案时发送邮件。我可能会使用 spring 连接它,因为它具有良好的石英集成,并且允许简单的模拟实现进行测试。

一个没有 spring 结合 Quartz 和 HttpClient 的快速而肮脏的例子(对于 JavaMail,请参阅How do I send an e-mail in Java?):

imports(所以你知道我从哪里得到这些类):

import java.io.IOException;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

代码:

public class CheckJob implements Job {
    public static final String PROP_URL_TO_CHECK = "URL";

    public void execute(JobExecutionContext context) 
                       throws JobExecutionException {
        String url = context.getJobDetail().getJobDataMap()
                            .getString(PROP_URL_TO_CHECK);
        System.out.println("Starting execution with URL: " + url);
        if (url == null) {
            throw new IllegalStateException("No URL in JobDataMap");
        }
        HttpClient client = new DefaultHttpClient();
        HttpGet get = new HttpGet(url);
        try {
            processResponse(client.execute(get));
        } catch (ClientProtocolException e) {
            mailError("Got a protocol exception " + e);
            return;
        } catch (IOException e) {
            mailError("got an IO exception " + e);
            return;
        }

    }

    private void processResponse(HttpResponse response) {
        StatusLine status = response.getStatusLine();
        int statusCode = status.getStatusCode();
        System.out.println("Received status code " + statusCode);
        // You may wish a better check with more valid codes!
        if (statusCode <= 200 || statusCode >= 300) {
            mailError("Expected OK status code (between 200 and 300) but got " + statusCode);
        }
    }

    private void mailError(String message) {
        // See https://stackoverflow.com/questions/884943/how-do-i-send-an-e-mail-in-java
    }
}

以及永远运行并每 2 分钟检查一次的主类:

进口:

import org.quartz.JobDetail;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

代码:

public class Main {

    public static void main(String[] args) {
        JobDetail detail = JobBuilder.newJob(CheckJob.class)
                           .withIdentity("CheckJob").build();
        detail.getJobDataMap().put(CheckJob.PROP_URL_TO_CHECK, 
                                   "http://www.google.com");

        SimpleTrigger trigger = TriggerBuilder.newTrigger()
                .withSchedule(SimpleScheduleBuilder
                .repeatMinutelyForever(2)).build();


        SchedulerFactory fac = new StdSchedulerFactory();
        try {
            fac.getScheduler().scheduleJob(detail, trigger);
            fac.getScheduler().start();
        } catch (SchedulerException e) {
            throw new RuntimeException(e);
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多