Домой Учебники по Java и J2EE Как повторить операцию n раз в Java?

Как повторить операцию n раз в Java?

1008
0

Содержание

У нас есть ряд ситуаций, когда нам нужно повторить задачу n-times если это не удается (иногда с некоторой формой back-off-before-retry логика). Как правило, если выдается исключение , задание следует повторить до max-retry сосчитать.

Ниже приведен простой и полный пример Java, который объясняет логику повторов и логику callURL .

CrunchifyRetryNTimes.java

Джава
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
пакет ком . crunchify. учебные пособия ;
Импортировать Java. Ио. BufferedReader ;
Импортировать Java. Ио. InputStreamReader ;
Импортировать Java. нетто. URL ;
Импортировать Java. нетто. URLConnection ;
Импортировать Java. Nio . кодировок. Charset ;
/ **
* @author Crunchify.com
* /
общественности учебный класс CrunchifyRetryNTimes {
общественности статический недействительным main ( Строка [ ] аргументы ) {
// Выполнить эту программу как есть, чтобы получить правильный ответ.
// Изменить URL на
// https://crunchify.com/wp-content/uploads/code/json.sample2.txt to
// увидеть логику повторения в действии ..
строка myURL знак равно https://cdn.crunchify.com/wp-content/uploads/code/json.sample.txt ;
CrunchifyRetryOnExceptionStrategy повторить знак равно новый CrunchifyRetryOnExceptionStrategy ( ) ;
в то время как ( повторить . shouldRetry ( ) ) {
пытаться {
Система. вне. println ( Запрошенный URL: + myURL ) ;
StringBuilder sb знак равно новый StringBuilder ( ) ;
URLConnection urlConn знак равно ноль ;
InputStreamReader в знак равно ноль ;
URL URL знак равно новый URL ( myURL ) ;
urlConn знак равно URLадрес. openConnection ( ) ;
если ( urlConn ! знак равно ноль )
urlConn . setReadTimeout ( 60 * 1000 ) ;
если ( urlConn ! знак равно ноль && urlConn.getInputStream ()! = null) {
in = new InputStreamReader (urlConn.getInputStream (),
Charset.defaultCharset ());
BufferedReader bufferedReader знак равно новый BufferedReader ( в ) ;
если ( bufferedReader ! знак равно ноль ) {
ИНТ ср ;
в то время как ( ( ср знак равно bufferedReader . читать ( ) ) ! знак равно 1 ) {
бакалавр естественных наук добавить ( ( символ ) ср ) ;
}
bufferedReader . закрыть ( ) ;
}
}
Система. вне. println ( sb . toString ( ) ) ;
дюйм закрыть ( ) ;
перерыв ;
} ловить ( Исключение е ) {
пытаться {
Система. вне. println ( в улове ….. ) ;
повторите попытку. errorOccured ( ) ;
} ловить ( RuntimeException e1 ) {
бросать новый RuntimeException ( «Исключение при вызове URL:»
+ myURL , е ) ;
} ловить ( Исключение е1 ) {
бросать новый RuntimeException ( e1 ) ;
}
}
}
}
статический учебный класс CrunchifyRetryOnExceptionStrategy {
общественности статический окончательный ИНТ DEFAULT_RETRIES знак равно 3 ;
общественности статический окончательный долго DEFAULT_WAIT_TIME_IN_MILLI знак равно 2000 ;
частный ИНТ numberOfRetries ;
частный ИНТ numberOfTriesLeft ;
частный долго timeToWait ;
общественности CrunchifyRetryOnExceptionStrategy ( ) {
это ( DEFAULT_RETRIES , DEFAULT_WAIT_TIME_IN_MILLI ) ;
}
общественности CrunchifyRetryOnExceptionStrategy ( int numberOfRetries ,
долго timeToWait ) {
это. numberOfRetries знак равно numberOfRetries ;
numberOfTriesLeft знак равно numberOfRetries ;
это. timeToWait знак равно timeToWait ;
}
/ **
* @ return true, если остались попытки
* /
общественности логический shouldRetry ( ) {
вернуть numberOfTriesLeft > 0 ;
}
общественности недействительным errorOccured ( ) бросает исключение {
numberOfTriesLeft;
если ( ! shouldRetry ( ) ) {
бросать новый Исключение ( «Ошибка повторной попытки: Всего» + numberOfRetries
+ попытки сделаны с интервалом + getTimeToWait ( )
+ мс ) ;
}
waitUntilNextTry ( ) ;
}
общественности долго getTimeToWait ( ) {
вернуть timeToWait ;
}
частный недействительным waitUntilNextTry ( ) {
пытаться {
Thread. sleep ( getTimeToWait ( ) ) ;
} ловить ( InterruptedException игнорируется ) {
}
}
}
}

Output1:

С URL : https://crunchify.com/wp-content/uploads/code/json.sample.txt

1
2
3
4
5
6
7
8
9
10
11
12
Запрашиваемый URL : https : //crunchify.com/wp-content/uploads/code/json.sample.txt
{ меню : {
   id : файл ,
   «значение» : «Файл» ,
   всплывающее окно : {
     пункт меню : [
       { значение : Новый , onclick : CreateNewDoc () } ,
       { значение : Открыть , onclick : OpenDoc () } ,
       { значение : «Закрыть» , onclick : CloseDoc () }
     ]
   }
} }

Выход2:

С URL : https://crunchify.com/wp-content/uploads/code/json.sample2.txt

1
2
3
4
5
6
7
8
9
10
11
Запрашиваемый URL : https : //crunchify.com/wp-content/uploads/code/json.sample2.txt
в поймать. , , , ,
Запрашиваемый URL : https : //crunchify.com/wp-content/uploads/code/json.sample2.txt
в поймать. , , , ,
Запрашиваемый URL : https : //crunchify.com/wp-content/uploads/code/json.sample2.txt
в поймать. , , , ,
Исключение в нить главный Java. яз. RuntimeException : Java. яз. Исключение : < strong > Не удалось повторить попытку : Всего 3 попытки сделаны с интервалом 2000 мс < / strong >
на ком . crunchify. учебники . CrunchifyRetryNTimes . main ( CrunchifyRetryNTimes . java : 58 )
Вызванный: Java. яз. Исключение : Повторить не удалось : Всего 3 попытки сделаны с интервалом 2000 мс
на ком . crunchify. учебники . CrunchifyRetryNTimes $ CrunchifyRetryOnExceptionStrategy . errorOccured ( CrunchifyRetryNTimes . java : 93 )
на ком . crunchify. учебники . CrunchifyRetryNTimes . main ( CrunchifyRetryNTimes . java : 53 )

Поделитесь своими мыслями.

Как повторить операцию n раз в Java?

0.00 (0%) 0 votes

ЧИТАТЬ ТАКЖЕ:  Java 10, выпущенная с Parallel Full GC, обмен данными между классами приложений - Java SE 10 (JDK 10)

ОСТАВЬТЕ ОТВЕТ

Пожалуйста, введите ваш комментарий!
пожалуйста, введите ваше имя здесь