Вопрос:

автоматическое подключение в случае ошибки

java jackson

36 просмотра

2 ответа

16 Репутация автора

Я работаю над приложением для Android. Я часто получаю HTTP-ошибку 500, когда пытаюсь получить доступ к URL из-за плохой связи, которая приводит к сбою приложения. Ответ, возвращаемый с URL-адреса, находится в формате JSON, поэтому для разбора этого json я использовал API-интерфейс Jackson

JsonNode monthlyUrlNode  = objectMapper.readValue(url, JsonNode.class);

В случае неудачи я хочу переподключиться к URL с задержкой в ​​30 секунд.

я передал это Retry соединение по тайм-ауту в Java , но это не очень полезно для меня

Автор: kumar0981 Источник Размещён: 04.03.2017 08:53

Ответы (2)


0 плюса

1954 Репутация автора

Вы думали об использовании объекта Proxy? Прокси позволяет вам обернуть интерфейс таким образом, чтобы вы могли выполнять одно и то же вмешательство независимо от вызываемого метода. Предположим, вы уже создали клиентский объект для доступа к интерфейсу SomeService. Затем вы можете создать прокси-класс со встроенной 30-секундной повторной попыткой:

public class ServiceProxy implements InvocationHandler {
   private final SomeService realClient;
   public ServiceProxy(SomeService realClientObject) {
      this.realClient = realClientObject;
   }
   @Override
   public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
      Object result = method.invoke(realClient, args);
      if (result instanceof URL) {
          JsonNode urlNode = objectMapper.readValue(url, JsonNode.class);
          if (some condition on urlNode) {
             // Wait and retry
             Thread.sleep(30000);
             result = method.invoke(realClient, args);
          }
      }
      return result;
   }
}

Вы создаете прокси-объект, передавая ему оригинальный интерфейс, например:

public class ProxyFactory {
    public static SomeService get(SomeService originalClient) {
        return (SomeService)Proxy.newProxyInstance(SomeService.class.getClassLoader(),
                new Class[]{SomeService.class},
                new ServiceProxy(originalClient));
    }
}
Автор: Wheezil Размещён: 05.03.2017 04:12

0 плюса

80550 Репутация автора

Если вам нужен такой точный контроль, не передавайте URL Джексону. Используйте соответствующую библиотеку HTTP для чтения содержимого из URL-адреса в память, повторяя при необходимости, а затем передавайте его Джексону.

Автор: bmargulies Размещён: 05.03.2017 04:45
Вопросы из категории :
32x32