bivashy / java-vk-bots-long-poll-api

A Java library to create VK bots using Bots Long Poll API
MIT License
1 stars 0 forks source link

UnknownHostException for no reason #184

Closed Lunarelly closed 1 week ago

Lunarelly commented 8 months ago

Ошибка не постоянная, вылетает рандомно, с днс все в порядке

Exception in thread "main" java.lang.Error: api.longpoll.bots.exceptions.VkApiException: java.net.UnknownHostException: lp.vk.com: Temporary failure in name resolution
        at com.lunarelly.vkadmin.Main.main(Main.java:9)
Caused by: api.longpoll.bots.exceptions.VkApiException: java.net.UnknownHostException: lp.vk.com: Temporary failure in name resolution
        at api.longpoll.bots.methods.impl.VkMethod.execute(VkMethod.java:118)
        at api.longpoll.bots.LongPollBot.startPolling(LongPollBot.java:61)
        at com.lunarelly.vkadmin.Bot.<init>(Bot.java:34)
        at com.lunarelly.vkadmin.Main.main(Main.java:7)
Caused by: java.net.UnknownHostException: lp.vk.com: Temporary failure in name resolution
        at java.base/java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
        at java.base/java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:52)
        at java.base/java.net.InetAddress$PlatformResolver.lookupByName(InetAddress.java:1211)
        at java.base/java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1828)
        at java.base/java.net.InetAddress$NameServiceAddresses.get(InetAddress.java:1139)
        at java.base/java.net.InetAddress.getAllByName0(InetAddress.java:1818)
        at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1688)
        at okhttp3.Dns$Companion$DnsSystem.lookup(Dns.kt:49)
        at okhttp3.internal.connection.RouteSelector.resetNextInetSocketAddress(RouteSelector.kt:164)
        at okhttp3.internal.connection.RouteSelector.nextProxy(RouteSelector.kt:129)
        at okhttp3.internal.connection.RouteSelector.next(RouteSelector.kt:71)
        at okhttp3.internal.connection.ExchangeFinder.findConnection(ExchangeFinder.kt:205)
        at okhttp3.internal.connection.ExchangeFinder.findHealthyConnection(ExchangeFinder.kt:106)
        at okhttp3.internal.connection.ExchangeFinder.find(ExchangeFinder.kt:74)
        at okhttp3.internal.connection.RealCall.initExchange$okhttp(RealCall.kt:255)
        at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.kt:32)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
        at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.kt:95)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
        at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.kt:83)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
        at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.kt:76)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
        at api.longpoll.bots.http.LoggerInterceptor.intercept(LoggerInterceptor.java:44)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
        at okhttp3.internal.connection.RealCall.getResponseWithInterceptorChain$okhttp(RealCall.kt:201)
        at okhttp3.internal.connection.RealCall.execute(RealCall.kt:154)
        at api.longpoll.bots.methods.impl.VkMethod.execute(VkMethod.java:115)
        ... 3 more
yvasyliev commented 8 months ago

@Lunarelly советую найти другую библиотеку, потому что эту я больше не планирую поддерживать

Ferius057 commented 8 months ago

@Lunarelly советую найти другую библиотеку, потому что эту я больше не планирую поддерживать

image

bivashy commented 2 months ago

Скорее всего решением является использование IPv4 вместо IPv6.

Можно Использовать флаг -DpreferIPv4Stack Нужно добавить флаг -DpreferIPv4Stack при запуске Java приложения.

В теории можно использовать интерфейс Dns в библиотеке okhttp, для того чтобы предпочитать IPv4 вместо IPv6. Пример:

import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.List;
import java.util.stream.Collectors;

import org.jetbrains.annotations.NotNull;

import okhttp3.Dns;

public class IPv4Dns implements Dns {

    @NotNull
    @Override
    public List<InetAddress> lookup(@NotNull String hostName) throws UnknownHostException {
        return SYSTEM.lookup(hostName).stream().filter(address -> address instanceof Inet4Address).collect(Collectors.toList());
    }

}

И указать в самом OkHttpClient.builder():

OkHttpClient okHttpClient = new OkHttpClient.Builder()
    .dns(new IPv4Dns())
    .build();

Последнее решение вряд ли будет добавлено в саму библиотеку, ибо оно не проверялось.