Переподключиться, если соединение не удается с помощью R - PullRequest
0 голосов
/ 22 мая 2018

Я написал небольшую функцию, но почему-то не работает должным образом.

У меня есть соединение с сервером, и иногда сервер не работает, поэтому я не могу подключиться.Сценарий выполняется в пакетном режиме, поэтому я должен его автоматизировать.

Сценарий должен успешно выполнить conn <- function(..) (это означает отсутствие сообщения об ошибке), если не restart/re-check, и перезапустить снова через прибл.1 мин.Это должно работать в цикле, пока соединение не будет установлено примерно 12 часов.(Прибл.).Соединение должно быть назначено объекту conn, поэтому объект должен вернуть успешное соединение.(что-то вроде <Connection established, @ 20180522 20:43:41 CET>

Функция, которая не работает, находится здесь:

connect <- function(c) { message(paste("remaining run", c)); 
                     withRestarts(err <- tryCatch({ conn <- server.coonect(settings...) }, 
                     error=function(e) { invokeRestart("reconnect") }), reconnect = function() { message("re-connecting"); 
                     stopifnot(c > 0); for(i in 1:10) { Sys.sleep(6); cat(i) }; connect(c-1) }) }

connect(1000) # with approx. 1min sleep we get here over 12 hours running..

Итак, вопрос в том, что не так и как переписать функцию так, чтобы она работала, как ожидалось. Спасибо.

РЕДАКТИРОВАТЬ

Кажется, что функция должна быть:

connect <- function(c) { message(paste("remaining run", c)); 
                 withRestarts(err <- tryCatch({ server.coonect(settings...) }, 
                 error=function(e) { invokeRestart("reconnect") }), reconnect = function() { message("re-connecting"); 
                 stopifnot(c > 0); for(i in 1:10) { Sys.sleep(6); cat(i) } }) }

conn <- connect(1000) 

РЕДАКТИРОВАТЬ 2

Вот комментарий к вышеупомянутой функции, которую я протестировал:

Я протестировал функцию EDIT, имитируя соединение, сначала запустив функцию без подключения к Интернету (теперь функция проверяет каждую 1:10 или 6 секунд, и после запуска функции я подключаюсь к Интернету, теперь я ожидаю, что функция в следующей итерации будет показана и подключится к серверу, если доступно ...), что происходит, когда функция не получает последующую возможностьподключить ...

1 Ответ

0 голосов
/ 23 мая 2018

Если вы хотите только установить соединение, это будет работать:

# simulate an instable connection
server.connect <- function(...) {
  if (round(as.numeric(Sys.time())) %% 10 != 0) # about 90 % failed connections
    stop("Connection error")
  return(TRUE)  # success
}

connect <- function(attempts = 1, sleep.seconds = 6) {
  for (i in 1:attempts) {
    res <- try(server.connect("my connection string"), silent = TRUE)
    if (!("try-error" %in% class(res))) {
      print("Connected...")
      return(res)
    }
    print(paste0("Attempt #", i, " failed"))
    Sys.sleep(sleep.seconds)
  }
  stop("Maximum number of connection attempts exceeded")
}

con <- connect(attempts = 10, sleep = 1)

Пример журнала выполнения:

[1] "Attempt #1 failed"
[1] "Attempt #2 failed"
[1] "Attempt #3 failed"
[1] "Attempt #4 failed"
[1] "Attempt #5 failed"
[1] "Attempt #6 failed"
[1] "Connected..."
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...