Реализация для создания методологии отчетности, чтобы сообщить администратору по почте - PullRequest
1 голос
/ 20 апреля 2011

Постоянный мониторинг http-запроса, который, если возвращает код 200, не предпринимает никаких действий, но если возвращается 404, администратор должен получить предупреждение с помощью предупреждения или по почте.

Я хотел знать, как подойти к нему с точки зрения Java. Доступные коды не очень полезны.

Ответы [ 2 ]

2 голосов
/ 25 апреля 2011

Прежде всего, вы должны рассмотреть возможность использования существующего инструмента, предназначенного для этой работы (например, Nagios или тому подобное).В противном случае вы, вероятно, будете переписывать многие из тех же функций.Возможно, вы захотите отправить только одно электронное письмо, как только проблема будет обнаружена, иначе вы будете рассылать спам администратору.Точно так же вы можете подождать до второго или третьего сбоя, прежде чем отправлять предупреждение, в противном случае вы можете отправлять ложные тревоги.Существующие инструменты справляются с этими и другими задачами для вас.

Тем не менее, то, что вы специально просили, не слишком сложно в Java.Ниже приведен простой рабочий пример, который должен помочь вам начать работу.Он отслеживает URL-адрес, отправляя запрос каждые 30 секунд.Если он обнаружит код состояния 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();
        }
    }
}
1 голос
/ 24 апреля 2011

Я бы начал с кварцевого планировщика и создал SimpleTrigger.SimpleTrigger будет использовать httpclient для создания соединения и API JavaMail для отправки почты в случае неожиданного ответа.Я бы, вероятно, связал его с помощью пружины, поскольку он имеет хорошую кварцевую интеграцию и позволил бы простые тестовые реализации для тестирования.

Быстрый и простой пример без пружинного объединения Quartz и HttpClient (для JavaMail см. Какотправить электронное письмо на Java? ):

import (чтобы вы знали, откуда у меня классы):

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 /700489/kak-otpravit-elektronnoe-pismo-na-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);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...