SORU
27 AĞUSTOS 2010, Cuma


Kullanılabilirlik için bir HTTP Url ping Java yolu tercih

Düzenli olarak belirli bir HTTP URL olup olmadığını kontrol eden bir monitör sınıfı ihtiyacım var. Bakım" Bahar kullanarak bu konuyu burada değil yani soyutlama TaskExecutor, parçası. "düzenli olarak alabilirim Soru:Java bir URL ping için tercih edilen yolu nedir?

Burada başlangıç noktası olarak benim geçerli kod:

try{
    final URLConnection connection = new URL(url).openConnection();
    connection.connect();
    LOG.info("Service "   url   " available, yeah!");
    available = true;
} catch(final MalformedURLException e){
    throw new IllegalStateException("Bad URL: "   url, e);
} catch(final IOException e){
    LOG.info("Service "   url   " unavailable, oh no!", e);
    available = false;
}
  1. Bu hiç de iyi (ben ne istiyorum?)
  2. Bir şekilde bağlantısı var mı?
  3. Bu istek bir ALMAK sanırım. Bir şekilde yerine KAFA göndermek için var mı?

CEVAP
27 AĞUSTOS 2010, Cuma


Bu hiç de iyi (ben ne istiyorum?)

Bunu yapabilirsiniz. Başka bir uygun şekilde java.net.Socket kullanıyor.

Socket socket = null;
boolean reachable = false;
try {
    socket = new Socket(hostnameOrIP, 80);
    reachable = true;
} finally {            
    if (socket != null) try { socket.close(); } catch(IOException e) {}
}

Ayrıca InetAddress#isReachable() var:

boolean reachable = InetAddress.getByName(hostname).isReachable();

Bu ancak açıkça port 80 test yok. Yanlış negatif bir güvenlik Duvarı diğer bağlantı noktalarını engelleme nedeniyle risk.


Bir şekilde bağlantısı var mı?

Hayır, açıkça gerek yok. Ve bu başlıklar altında ele alınan.


Bu istek bir ALMAK sanırım. Bir şekilde yerine KAFA göndermek için var mı?

HttpURLConnection URLConnection elde edilen dökme ve setRequestMethod() istek yöntemini ayarlamak için kullanabilirsiniz. Ancak, hesaba o zavallı bir Web uygulamasını veya homegrown sunucuları döndürebilir HTTP 405 error aklı (yani mevcut olmayan, tamamlanmamış, izin yok) iken ELDE çalıştığını gayet iyi. Ama bu oldukça nadir görülen durumlardır.


Güncellemebir ana bilgisayara bağlanırken, eğer ana varsa bilgilendirir, eğer içerik varsa. yorumlara göre: Bir Web sunucusu sorunsuz başladı o kadar iyi olur çünkü içerik daha fazla ilgi gibi görünüyor, ama Web server başlangıç sırasında dağıtmak için başarısız oldu. Bu ancak genellikle değil tüm sunucu aşağı gitmek neden olur. HTTP yanıt kodu belirlemek istiyorum.

HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
connection.setRequestMethod("HEAD");
int responseCode = connection.getResponseCode();
if (responseCode != 200) {
    // Not OK.
}

// < 100 is undetermined.
// 1nn is informal (shouldn't happen on a GET/HEAD)
// 2nn is success
// 3nn is redirect
// 4nn is client error
// 5nn is server error

Yanıt durumu ile ilgili daha fazla detay için kodları RFC 2616 section 10 bkz. connect() Arama Eğer yanıt verileri belirleyici şekilde gerekli değil. Örtülü olarak bağlanır.

İleride, işte yarar bir yöntem lezzet tam bir örnek, aynı zamanda zaman aşımı ile dikkate alarak:

/**
 * Pings a HTTP URL. This effectively sends a HEAD request and returns <code>true</code> if the response code is in 
 * the 200-399 range.
 * @param url The HTTP URL to be pinged.
 * @param timeout The timeout in millis for both the connection timeout and the response read timeout. Note that
 * the total timeout is effectively two times the given timeout.
 * @return <code>true</code> if the given HTTP URL has returned response code 200-399 on a HEAD request within the
 * given timeout, otherwise <code>false</code>.
 */
public static boolean ping(String url, int timeout) {
    // Otherwise an exception may be thrown on invalid SSL certificates:
    url = url.replaceFirst("^https", "http");

    try {
        HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
        connection.setConnectTimeout(timeout);
        connection.setReadTimeout(timeout);
        connection.setRequestMethod("HEAD");
        int responseCode = connection.getResponseCode();
        return (200 <= responseCode && responseCode <= 399);
    } catch (IOException exception) {
        return false;
    }
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • adrianisen

    adrianisen

    25 Kasım 2009
  • Project Mooncircle

    Project Moon

    6 Aralık 2009
  • wwjoshdo

    wwjoshdo

    25 Mayıs 2009