{"id":291911,"date":"2019-07-10T15:01:29","date_gmt":"2019-07-10T15:01:29","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=291911"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=291911","title":{"rendered":"\u041c\u043e\u0439 \u043e\u043f\u044b\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u044d\u043a\u0430\u043f\u0430\u043c\u0438"},"content":{"rendered":"\n<div class=\"post__text post__text-html js-mediator-article\">\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u043d\u0438\u043a\u043e\u0433\u043e \u043d\u0435 \u0443\u0434\u0438\u0432\u0438\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u043c\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438, \u043e\u0434\u043d\u0430\u043a\u043e \u044f \u0434\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u0438\u0434\u0435\u0439. \u041c\u043e\u0435 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0435 Java \u043d\u0430\u0447\u0430\u043b\u043e\u0441\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0441 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u0435\u0441\u0442\u0430\u0445 \u044f \u0431\u0443\u0434\u0443 \u0441\u0438\u043b\u044c\u043d\u043e \u043d\u0435 \u043f\u0440\u0430\u0432 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434, \u043d\u043e \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u043a\u043e\u043c\u0443-\u043d\u0438\u0431\u0443\u0434\u044c \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d \u043e\u043f\u044b\u0442 \u043d\u043e\u0432\u0438\u0447\u043a\u0430 \u0432 \u0434\u0436\u0430\u0432\u0435. \u041f\u0440\u0438\u0432\u0435\u0434\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u0431\u044d\u043a\u0430\u043f\u0430\u043c\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0431\u044d\u043a\u0430\u043f\u0430<\/li>\n<li>\u041d\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0432\u0435\u0441\u044c \u0431\u044d\u043a\u0430\u043f \u0432 \u043f\u0430\u043c\u044f\u0442\u044c<\/li>\n<li>\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f\/\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u044d\u043a\u0430\u043f\u0430 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u043d\u044f\u0442\u044c<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0430 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0448\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0438 \u0438\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0435.<\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<h2 id=\"obzor-prilozheniya\">\u041e\u0431\u0437\u043e\u0440 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h2>\n<p>  <\/p>\n<p>\u041e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 Web UI, \u043d\u043e \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0438 REST API \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0443\u043c\u0435\u0435\u0442:<\/p>\n<p>  <\/p>\n<ol>\n<li>\u0421\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0431\u044d\u043a\u0430\u043f\u044b \u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0438\u0445 \u043d\u0430 \u043e\u0434\u043d\u043e \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449<\/li>\n<li>\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0431\u044d\u043a\u0430\u043f\u044b, \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u044f \u0438\u0445 \u0441 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430<\/li>\n<li>\u0423\u0434\u0430\u043b\u044f\u0442\u044c \u0431\u044d\u043a\u0430\u043f\u044b \u0441\u043e \u0432\u0441\u0435\u0445 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449<\/li>\n<li>\u0421\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0431\u044d\u043a\u0430\u043f\u044b \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0444\u0430\u0439\u043b\u043e\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 (\u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0437 Docker)<\/li>\n<li>Dropbox<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445:<\/p>\n<p>  <\/p>\n<ul>\n<li>PostgreSQL<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0418\u0437 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0439 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u043e\u0433\u0443 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c:<\/p>\n<p>  <\/p>\n<ol>\n<li>\u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043d\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438<\/li>\n<li>\u0411\u044d\u043a\u0430\u043f \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u0432\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0431\u044d\u043a\u0430\u043f\u0430. \u0424\u0430\u0439\u043b\u043e\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0434\u043b\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0431\u044d\u043a\u0430\u043f\u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0435 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442\u0441\u044f. \u041a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0431\u044d\u043a\u0430\u043f\u0430, \u0442\u0430\u043a \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430\/\u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0430 \u0431\u044d\u043a\u0430\u043f\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432 \u043f\u0430\u043c\u044f\u0442\u0438.<\/li>\n<li>\u041a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u2014 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u043d\u0430 Windows, \u0442\u0430\u043a \u0438 \u043d\u0430 Linux.<\/li>\n<li>\u0412\u0441\u0435 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u0438 \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442\u043c\u0435\u043d\u044f\u0442\u044c.<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b Web UI, \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430\u043c\u0438<\/b><\/p>\n<div class=\"spoiler_text\">\n<p><a href=\"https:\/\/habrastorage.org\/webt\/vl\/qg\/n5\/vlqgn5f58ub5jhxixeeg2uq-oa8.png\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/vl\/qg\/n5\/vlqgn5f58ub5jhxixeeg2uq-oa8.png\" title=\"\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430\"><\/a><br \/>  <a href=\"https:\/\/habrastorage.org\/webt\/oj\/o5\/uj\/ojo5uj_raxkwd1btsjrktiowifo.png\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/oj\/o5\/uj\/ojo5uj_raxkwd1btsjrktiowifo.png\" title=\"\u0421\u043f\u0438\u0441\u043e\u043a \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\"><\/a><\/p>\n<\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/b><\/p>\n<div class=\"spoiler_text\">\n<p><a href=\"https:\/\/habrastorage.org\/webt\/wn\/6p\/bk\/wn6pbkcqg4qu_9btgrvnqm3l7x0.png\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/wn\/6p\/bk\/wn6pbkcqg4qu_9btgrvnqm3l7x0.png\" title=\"\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445\"><\/a><br \/>  <a href=\"https:\/\/habrastorage.org\/webt\/wu\/9a\/4k\/wu9a4ky7icuiyqdxeiii9xbu5d8.png\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/wu\/9a\/4k\/wu9a4ky7icuiyqdxeiii9xbu5d8.png\" title=\"\u0421\u043f\u0438\u0441\u043e\u043a \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445\"><\/a><\/p>\n<\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0431\u044d\u043a\u0430\u043f\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<p><a href=\"https:\/\/habrastorage.org\/webt\/1d\/zb\/6s\/1dzb6scvtua5v3m_3l11lch4rgm.png\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/1d\/zb\/6s\/1dzb6scvtua5v3m_3l11lch4rgm.png\" title=\"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0431\u044d\u043a\u0430\u043f\u0430\"><\/a><\/p>\n<\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u044d\u043a\u0430\u043f\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<p><a href=\"https:\/\/habrastorage.org\/webt\/gj\/9f\/w0\/gj9fw0onqw7f0lf7ycw05aphinc.png\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/gj\/9f\/w0\/gj9fw0onqw7f0lf7ycw05aphinc.png\" title=\"\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u044d\u043a\u0430\u043f\u0430\"><\/a><\/p>\n<\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0431\u044d\u043a\u0430\u043f\u0430\u043c\u0438<\/b><\/p>\n<div class=\"spoiler_text\">\n<p><a href=\"https:\/\/habrastorage.org\/webt\/sy\/jz\/y6\/syjzy68wqxgi8smgq74giqstgu0.png\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/sy\/jz\/y6\/syjzy68wqxgi8smgq74giqstgu0.png\" title=\"\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0445 \u0431\u044d\u043a\u0430\u043f\u043e\u0432\"><\/a><\/p>\n<\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0431\u044d\u043a\u0430\u043f\u044b<\/b><\/p>\n<div class=\"spoiler_text\">\n<p><a href=\"https:\/\/habrastorage.org\/webt\/hk\/pw\/tg\/hkpwtg3kf7c5ho3f7ae7_uos7v0.png\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/hk\/pw\/tg\/hkpwtg3kf7c5ho3f7ae7_uos7v0.png\" title=\"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438\"><\/a><\/p>\n<\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447<\/b><\/p>\n<div class=\"spoiler_text\">\n<p><a href=\"https:\/\/habrastorage.org\/webt\/al\/dt\/su\/aldtsuel4amtjlvbbbusccxddh0.png\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/al\/dt\/su\/aldtsuel4amtjlvbbbusccxddh0.png\" title=\"\u0421\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447\"><\/a><\/p>\n<\/div>\n<\/div>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<h2 id=\"arhitektura\">\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430<\/h2>\n<p>  <\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0432 3 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u0445 \u2014 <em>DatabaseBackup<\/em>, <em>Processor<\/em>, <em>Storage<\/em>, \u0430 \u0441\u0432\u044f\u0436\u0435\u043c \u0438\u0445 \u0432\u043c\u0435\u0441\u0442\u0435 \u043c\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <em>\u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438 \u0442\u0430\u0441\u043a\u043e\u0432<\/em>. \u041e\u0431\u043e \u0432\u0441\u0435\u043c \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435.<\/p>\n<p>  <\/p>\n<h3 id=\"databasebackup\">DatabaseBackup<\/h3>\n<p>  <\/p>\n<p>\u0414\u0430\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 plain-text \u0431\u044d\u043a\u0430\u043f\u0430.<\/p>\n<p>  <\/p>\n<p>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441\u0435\u0440\u0432\u0438\u0441\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public interface DatabaseBackup {     InputStream createBackup(DatabaseSettings databaseSettings, Integer id);      void restoreBackup(InputStream in, DatabaseSettings databaseSettings, Integer id); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0431\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043e\u043f\u0435\u0440\u0438\u0440\u0443\u044e\u0442 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430\u043c\u0438 <strong>InputStream<\/strong>, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u0435\u0441\u044c \u0431\u044d\u043a\u0430\u043f \u043d\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u043b\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u044c, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0431\u044d\u043a\u0430\u043f \u0434\u043e\u043b\u0436\u0435\u043d \u0447\u0438\u0442\u0430\u0442\u044c\u0441\u044f\/\u043f\u0438\u0441\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u043e\u0432\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435. \u0421\u0443\u0449\u043d\u043e\u0441\u0442\u044c <em>DatabaseSettings<\/em> \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0438\u0437 Web UI \u0438 \u0445\u0440\u0430\u043d\u0438\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u0427\u0442\u043e \u044d\u0442\u043e \u0437\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u2014 <code>id<\/code> \u2014 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u0435 \u0447\u0443\u0442\u044c \u0434\u0430\u043b\u0435\u0435.<\/p>\n<p>  <\/p>\n<p>\u0422\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0443 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435:<\/p>\n<p>  <\/p>\n<ol>\n<li>\u041e\u0431\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0447\u0438\u0442\u0430\u0442\u044c \u0432\u0435\u0441\u044c \u0431\u044d\u043a\u0430\u043f \u0432 \u043f\u0430\u043c\u044f\u0442\u044c.<\/li>\n<li>\u041c\u0435\u0442\u043e\u0434 <code>restoreBackup()<\/code> \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0431\u044d\u043a\u0430\u043f \u0432 \u043e\u0434\u0438\u043d\u043e\u0447\u043d\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u043d\u0435 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043d\u0435\u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438.<\/li>\n<\/ol>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u043b\u044f PostgreSQL (\u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435)<\/b><\/p>\n<div class=\"spoiler_text\">\n<p>\u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043b\u044f PostgreSQL \u0441\u0435\u0440\u0432\u0438\u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <\/p>\n<ol>\n<li><code>createBackup()<\/code>: \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441 <em>pg_dump<\/em>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0431\u044d\u043a\u0430\u043f \u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0433\u043e \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0432\u044b\u0432\u043e\u0434\u0430. \u0418\u0437 \u043c\u0435\u0442\u043e\u0434\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0432\u044b\u0432\u043e\u0434\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 (\u0441\u043c. <a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/lang\/Process.html#getInputStream--\">https:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/lang\/Process.html#getInputStream&#8212;<\/a>). \u041f\u043e\u0442\u043e\u043a\u0438 \u0432\u0432\u043e\u0434\u0430\/\u0432\u044b\u0432\u043e\u0434\u0430 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u044b \u043d\u0430 \u0431\u0443\u0444\u0435\u0440\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430, \u0438 \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0438\u0448\u0435\u0442 \u0432 \u043f\u043e\u0442\u043e\u043a \u0432\u044b\u0432\u043e\u0434\u0430, \u043e\u043d \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043f\u0438\u0448\u0435\u0442 \u0432 \u0431\u0443\u0444\u0435\u0440 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438. \u0417\u0434\u0435\u0441\u044c \u0441\u0430\u043c\u043e\u0435 \u0432\u0430\u0436\u043d\u043e\u0435 \u044d\u0442\u043e \u0442\u043e, \u0447\u0442\u043e \u0442\u0440\u0435\u0434 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u0432 <em>\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0439<\/em> \u0431\u0443\u0444\u0435\u0440, \u043f\u043e\u043a\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u043e\u0439, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0442\u0440\u0435\u0434 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0438 \u0431\u044d\u043a\u0430\u043f \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0432 \u043f\u0430\u043c\u044f\u0442\u044c. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432\u044b \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043b\u0438\u0441\u044c \u0441 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0435\u0439, \u043a\u043e\u0433\u0434\u0430 \u0432\u0430\u0448\u0430 Java \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043b\u043e\u0432\u0438\u043b\u0430 deadlock \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u043c\u0438 \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0432\u044b \u043d\u0435 \u0447\u0438\u0442\u0430\u043b\u0438 stdout \u0438\u043b\u0438 stderr \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430. \u041a\u0440\u0430\u0439\u043d\u0435 \u0432\u0430\u0436\u043d\u043e \u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0437\u0430 \u044d\u0442\u0438\u043c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435, \u0435\u0441\u043b\u0438 \u043e\u043d \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u043c I\/O \u0432\u044b\u0437\u043e\u0432\u0435 \u043f\u0440\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u0438 \u043d\u0438\u043a\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u043d\u0435 \u0447\u0438\u0442\u0430\u0435\u0442.<\/li>\n<li><code>restoreBackup()<\/code>: \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441 <em>psql<\/em>, \u0431\u044d\u043a\u0430\u043f \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432 \u043c\u0435\u0442\u043e\u0434 InputStream \u0438 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0432 \u043f\u043e\u0442\u043e\u043a \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u0432\u0432\u043e\u0434\u0430 psql (\u0441\u043c. <a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/lang\/Process.html#getOutputStream--\">https:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/lang\/Process.html#getOutputStream&#8212;<\/a>). \u042d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e plain-text PostgreSQL \u0431\u044d\u043a\u0430\u043f \u2014 \u044d\u0442\u043e \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u043d\u0430\u0431\u043e\u0440 DDL \u0438 DML \u043a\u043e\u043c\u0430\u043d\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043b\u0435\u0433\u043a\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u044e\u0442\u0441\u044f psql.<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u041a\u043e\u0434\u0430 \u043c\u043d\u043e\u0433\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0434\u0435\u0441\u044c \u044f \u0435\u0433\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0443, \u0430 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430 GitHub \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438. <\/p>\n<\/div>\n<\/div>\n<p>  <\/p>\n<h3 id=\"processor\">Processor<\/h3>\n<p>  <\/p>\n<p>\u0414\u0430\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u0432 \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u0434\u0435\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u043d\u0433 \u0431\u044d\u043a\u0430\u043f\u0430. \u041f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u043d\u0430 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0438\u043b\u0438 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0438 \u0441 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430. \u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430: \u043a\u043e\u043c\u043f\u0440\u0435\u0441\u0441\u043e\u0440, \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435.<\/p>\n<p>  <\/p>\n<p>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441\u0435\u0440\u0432\u0438\u0441\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public interface Processor {     InputStream process(InputStream in);      InputStream deprocess(InputStream in);      ProcessorType getType(); \/\/ ProcessorType - \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 Enum, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440      int getPrecedence(); \/\/ \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u2014 \u0435\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u0432, \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u044b \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044f \u0438\u0445 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u0430. \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432 \u0442\u0430\u043a\u043e\u043c \u0436\u0435 \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u044b\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u044b \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u044b, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0431\u044d\u043a\u0430\u043f. <\/p>\n<p>  <\/p>\n<h3 id=\"storage\">Storage<\/h3>\n<p>  <\/p>\n<p>\u0414\u0430\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0438 \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0443 \u0431\u044d\u043a\u0430\u043f\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0435\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430. \u041f\u0440\u0438\u043c\u0435\u0440 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430: Dropbox, \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0444\u0430\u0439\u043b\u043e\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430.<\/p>\n<p>  <\/p>\n<p>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441\u0435\u0440\u0432\u0438\u0441\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public interface Storage {     void uploadBackup(InputStream in, StorageSettings storageSettings, String backupName, Integer id);      InputStream downloadBackup(StorageSettings storageSettings, String backupName, Integer id);      void deleteBackup(StorageSettings storageSettings, String backupName, Integer id); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u0430\u0436\u0434\u043e\u043c\u0443 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u0431\u044d\u043a\u0430\u043f\u0443 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f \u2014 \u0442\u0430\u043a \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u043d\u0430\u0439\u0442\u0438 \u0435\u0433\u043e \u043d\u0430 \u043b\u044e\u0431\u043e\u043c \u0438\u0437 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043d \u0431\u044b\u043b \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d. \u0422\u043e, \u043a\u0430\u043a \u0431\u044d\u043a\u0430\u043f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043d\u0430 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u2014 \u0434\u0435\u043b\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u043d\u043e \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435 \u0438\u043c\u0435\u043d\u0438 \u0431\u044d\u043a\u0430\u043f\u0430 \u0432 \u043e\u0434\u043d\u0443 \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0436\u0438\u0434\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f. \u0421\u0443\u0449\u043d\u043e\u0441\u0442\u044c <em>StorageSettings<\/em> \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0438\u0437 Web UI \u0438 \u0445\u0440\u0430\u043d\u0438\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0443.<\/p>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<h3 id=\"koncepciya-taskov\">\u041a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f \u0442\u0430\u0441\u043a\u043e\u0432<\/h3>\n<p>  <\/p>\n<p>\u041c\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u0431\u044b \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043d\u0430\u0448\u0438\u0445 \u0437\u0430\u0434\u0430\u0447, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u0430 \u0437\u0430\u0434\u0430\u0447\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0442\u043c\u0435\u043d\u044f\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043e\u043f\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043b\u0435\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u0441\u043a\u0430\u043c\u0438. \u041a\u0430\u0436\u0434\u044b\u0439 \u0442\u0430\u0441\u043a \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435, \u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e \u2014 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u043c <strong>Future<\/strong> (\u0441\u043c. Java <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/util\/concurrent\/Future.html\">Future<\/a>). \u041a\u0430\u0436\u0434\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0432\u043e\u044f Future (\u043f\u0440\u0438\u0447\u0435\u043c, \u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432, \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u044b Future \u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432).<\/p>\n<p>  <\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0439\u0434\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u0412 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0441\u0435\u0440\u0432\u0438\u0441 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0442\u0430\u0441\u043a\u043e\u0432 \u2014 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f, \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0431\u044d\u043a\u0430\u043f\u0430.<\/p>\n<p>  <\/p>\n<h4 id=\"zapusk-zadach\">\u0417\u0430\u043f\u0443\u0441\u043a \u0437\u0430\u0434\u0430\u0447<\/h4>\n<p>  <\/p>\n<p><strong>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0431\u044d\u043a\u0430\u043f\u0430:<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public Task startBackupTask(@NotNull Task.RunType runType, @NotNull List&lt;String&gt; storageSettingsNameList, @Nullable List&lt;ProcessorType&gt; processors,                                 @NotNull DatabaseSettings databaseSettings) {         Objects.requireNonNull(runType);         Objects.requireNonNull(storageSettingsNameList);         Objects.requireNonNull(processors);         Objects.requireNonNull(databaseSettings);          BackupProperties backupProperties =                 backupPropertiesManager.initNewBackupProperties(storageSettingsNameList, processors, databaseSettings.getName());         Task task = tasksManager.initNewTask(Task.Type.CREATE_BACKUP, runType, backupProperties.getId());         Integer taskId = task.getId();          Future future = tasksStarterExecutorService.submit(() -&gt; {             tasksManager.updateTaskState(taskId, Task.State.CREATING);             logger.info(\"Creating backup...\");              try (InputStream backupStream = databaseBackupManager.createBackup(databaseSettings, taskId)) {                 if (Thread.interrupted()) {                     throw new InterruptedException();                 }                  tasksManager.updateTaskState(taskId, Task.State.APPLYING_PROCESSORS);                 logger.info(\"Applying processors on created backup. Processors: {}\", processors);                  try (InputStream processedBackupStream = backupProcessorManager.process(backupStream, processors)) {                     if (Thread.interrupted()) {                         throw new InterruptedException();                     }                      tasksManager.updateTaskState(taskId, Task.State.UPLOADING);                     logger.info(\"Uploading backup...\");                      backupLoadManager.uploadBackup(processedBackupStream, backupProperties, taskId);                     if (Thread.interrupted()) {                         throw new InterruptedException();                     }                      tasksManager.updateTaskState(taskId, Task.State.COMPLETED);                     logger.info(\"Creating backup completed. Backup properties: {}\", backupProperties);                 }             } catch (IOException ex) {                 logger.error(\"Error occurred while closing input stream of created backup\", ex);             } catch (RuntimeException ex) {                 logger.error(\"Error occurred while creating backup. Backup properties: {}\", backupProperties, ex);                 errorTasksManager.addErrorTask(taskId);             } catch (InterruptedException ex) {                 tasksManager.setInterrupted(taskId);                 logger.error(\"Backup creating task was interrupted. Task ID: {}\", taskId);             } finally {                 futures.remove(taskId);             }         });          futures.put(taskId, future);         return task;     }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0431\u044d\u043a\u0430\u043f\u0430 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 3 \u0433\u043b\u0430\u0432\u043d\u044b\u0445 \u0448\u0430\u0433\u0430 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435: \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0431\u044d\u043a\u0430\u043f\u0430 -&gt; \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u0432 -&gt; \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043d\u0430 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435. \u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u043e \u0432\u0441\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043c\u044b \u043f\u0440\u043e\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c ID \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0442\u0430\u0441\u043a\u0430 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u0435\u0440\u0432\u0438\u0441 \u043c\u043e\u0433 \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0438\u0437 \u0442\u0440\u0435\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0444\u043e\u043d\u0435. \u041e\u0431 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043e\u0448\u0438\u0431\u043e\u043a, \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u0437\u0434\u0435\u0441\u044c <em>InterruptedException<\/em> \u0438 \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439 \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f <em>RuntimeException<\/em> \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0434\u0430\u043b\u0435\u0435.<\/p>\n<p>  <\/p>\n<p>\u0410 \u0432\u043e\u0442 \u043a\u0430\u043a \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0431\u044d\u043a\u0430\u043f\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">tasksStarterService.startBackupTask(Task.RunType.USER, storageSettingsNameList, processors, databaseSettings);<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0438\u043d\u0438\u0446\u0438\u0430\u0442\u043e\u0440\u0430 \u0437\u0430\u0434\u0430\u0447\u0438: \u044e\u0437\u0435\u0440 \u0438\u043b\u0438 \u0436\u0435 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 (\u043f\u0440\u0438\u043c\u0435\u0440 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u2014 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0431\u044d\u043a\u0430\u043f). \u0417\u043d\u0430\u043d\u0438\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u0442\u043e\u0440\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0432 Web UI \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u0434\u043b\u044f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0431\u044d\u043a\u0430\u043f\u0430 \u2014 \u0441\u043f\u0438\u0441\u043e\u043a \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449, \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u044b \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u0434\u0430\u043c\u043f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c. <\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0431\u044d\u043a\u0430\u043f\u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <strong>BackupProperties<\/strong>. \u0414\u0430\u043d\u043d\u0430\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0431\u044d\u043a\u0430\u043f\u0430, \u043a\u0430\u043a \u0438\u043c\u044f, \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u044b \u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044d\u043a\u0430\u043f \u0431\u044b\u043b \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d. \u0414\u0430\u043b\u0435\u0435 \u0434\u043b\u044f \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0431\u044d\u043a\u0430\u043f\u0430 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043e\u043f\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c\u044e.<\/p>\n<p>  <\/p>\n<p>\u0417\u0430\u0434\u0430\u0447\u0430 \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0432\u0438\u0434\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">@Entity @Table(name = \"backup_tasks\") public class Task {     \/**      * Identifier of each backup task. Identifier is generated by PostgreSQL database after saving of entity.      *\/     @Id     @Column(insertable = false, updatable = false)     @GeneratedValue(strategy = GenerationType.IDENTITY)     private Integer id;      \/**      * Backup task type.      * &lt;p&gt;      * Type is set at the very start of any task and can't be changed.      *      * @see Type      *\/     @Enumerated(EnumType.STRING)     @Column(updatable = false)     private Type type;      \/**      * Who initiated a task: user or server.      * &lt;p&gt;      * We need to know it to show on front only these tasks that was started by user.      *      * @see RunType      *\/     @Enumerated(EnumType.STRING)     @Column(updatable = false)     private RunType runType;      \/**      * Backup task state.      * &lt;p&gt;      * State is updated with every new step in task being executed.      *      * @see Task.State      *\/     @Enumerated(EnumType.STRING)     private State state;      \/**      * Whether task has been interrupted or not.      * &lt;p&gt;      * Default is {@literal false}.      *\/     @Column(insertable = false)     private boolean interrupted;      \/**      * Identifier of {@link BackupProperties}.      * &lt;p&gt;      * We need to know backup ID to be able to handle occurred errors.      *\/     @Column(updatable = false)     private Integer backupPropertiesId;      \/**      * Start time of the task.      *\/     @Column(updatable = false)     private LocalDateTime date;      public enum RunType {         USER,         INTERNAL     }      public enum State {         PLANNED,         CREATING,         RESTORING,         DELETING,         APPLYING_PROCESSORS,         APPLYING_DEPROCESSORS,         DOWNLOADING,         UPLOADING,         COMPLETED,     }      public enum Type {         CREATE_BACKUP {             @Override             public String toString() {                 return \"CREATE BACKUP\";             }         },         RESTORE_BACKUP {             @Override             public String toString() {                 return \"RESTORE BACKUP\";             }         },         DELETE_BACKUP {             @Override             public String toString() {                 return \"DELETE BACKUP\";             }         }     }      \/\/ getters &amp; setters...  }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0431\u044d\u043a\u0430\u043f\u0430 \u0432 \u0432\u0438\u0434\u0435 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/bm\/um\/cy\/bmumcyhyapjg4ono73qo8kiquom.png\" alt=\"\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0431\u044d\u043a\u0430\u043f\u0430\" title=\"\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0431\u044d\u043a\u0430\u043f\u0430\"><\/p>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<p>\u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0437\u0430\u0434\u0430\u0447 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438. \u0414\u0430\u0431\u044b \u043d\u0435 \u0437\u0430\u0433\u0440\u043e\u043c\u043e\u0436\u0434\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043a\u043e\u0434\u0430, \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u043f\u044b\u0442\u043d\u044b\u0445 \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043a\u043e\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0437\u0430\u0434\u0430\u0447 \u043f\u043e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044e \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044e \u0431\u044d\u043a\u0430\u043f\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0432 \u0441\u043f\u043e\u0439\u043b\u0435\u0440\u0435.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u044d\u043a\u0430\u043f\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">public Task startRestoreTask(@NotNull Task.RunType runType, @NotNull BackupProperties backupProperties, @NotNull String storageSettingsName,                                  @NotNull DatabaseSettings databaseSettings) {         Objects.requireNonNull(runType);         Objects.requireNonNull(backupProperties);         Objects.requireNonNull(storageSettingsName);         Objects.requireNonNull(databaseSettings);          Task task = tasksManager.initNewTask(Task.Type.RESTORE_BACKUP, runType, backupProperties.getId());         Integer taskId = task.getId();          Future future = tasksStarterExecutorService.submit(() -&gt; {             tasksManager.updateTaskState(taskId, Task.State.DOWNLOADING);             logger.info(\"Downloading backup...\");              try (InputStream downloadedBackup =                          backupLoadManager.downloadBackup(backupProperties.getBackupName(), storageSettingsName, taskId)) {                 if (Thread.interrupted() || downloadedBackup == null) {                     throw new InterruptedException();                 }                  tasksManager.updateTaskState(taskId, Task.State.APPLYING_DEPROCESSORS);                 logger.info(\"Deprocessing backup...\");                  try (InputStream deprocessedBackup = backupProcessorManager.deprocess(downloadedBackup, backupProperties.getProcessors())) {                     if (Thread.interrupted()) {                         throw new InterruptedException();                     }                      tasksManager.updateTaskState(taskId, Task.State.RESTORING);                     logger.info(\"Restoring backup...\");                      databaseBackupManager.restoreBackup(deprocessedBackup, databaseSettings, taskId);                     if (Thread.interrupted()) {                         throw new InterruptedException();                     }                      tasksManager.updateTaskState(taskId, Task.State.COMPLETED);                     logger.info(\"Restoring backup completed. Backup properties: {}\", backupProperties);                 }             } catch (IOException ex) {                 logger.error(\"Error occurred while closing input stream of downloaded backup\", ex);             } catch (RuntimeException ex) {                 logger.info(\"Error occurred while restoring backup. Backup properties: {}\", backupProperties, ex);                 errorTasksManager.addErrorTask(taskId);             } catch (InterruptedException ex) {                 tasksManager.setInterrupted(taskId);                 logger.error(\"Task was interrupted. Task ID: {}\", taskId);             } finally {                 futures.remove(taskId);             }         });          futures.put(taskId, future);         return task;     }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u044d\u043a\u0430\u043f\u0430 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 3 \u0433\u043b\u0430\u0432\u043d\u044b\u0445 \u0448\u0430\u0433\u0430 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435: \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0430 \u0431\u044d\u043a\u0430\u043f\u0430 \u0441 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 -&gt; \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0434\u0435\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u0432 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e plain-text \u0431\u044d\u043a\u0430\u043f\u0430 -&gt; \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u044d\u043a\u0430\u043f\u0430.<\/p>\n<p>  <\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">tasksStarterService.startRestoreTask(Task.RunType.USER, backupProperties, storageSettingsName, databaseSettings);<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u044d\u043a\u0430\u043f\u0430 \u0432 \u0432\u0438\u0434\u0435 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/hr\/_m\/bk\/hr_mbkvfkszhyhj6ebi1q_wa1nc.png\" alt=\"\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u044d\u043a\u0430\u043f\u0430\" title=\"\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u044d\u043a\u0430\u043f\u0430\"><\/p>\n<\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0431\u044d\u043a\u0430\u043f\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">public Task startDeleteTask(@NotNull Task.RunType runType, @NotNull BackupProperties backupProperties) {         Objects.requireNonNull(runType);         Objects.requireNonNull(backupProperties);          Task task = tasksManager.initNewTask(Task.Type.DELETE_BACKUP, runType, backupProperties.getId());         Integer taskId = task.getId();          Future future = tasksStarterExecutorService.submit(() -&gt; {             try {                 logger.info(\"Deleting backup started. Backup properties: {}\", backupProperties);                 tasksManager.updateTaskState(taskId, Task.State.DELETING);                  backupLoadManager.deleteBackup(backupProperties, taskId);                 if (Thread.interrupted()) {                     throw new InterruptedException();                 }                  tasksManager.updateTaskState(taskId, Task.State.COMPLETED);                 logger.info(\"Deleting backup completed. Backup properties: {}\", backupProperties);             } catch (RuntimeException ex) {                 logger.error(\"Error occurred while deleting backup. Backup properties: {}\", backupProperties, ex);                 errorTasksManager.addErrorTask(taskId);             } catch (InterruptedException ex) {                 tasksManager.setInterrupted(taskId);                 logger.error(\"Task was interrupted. Task ID: {}\", taskId);             } finally {                 futures.remove(taskId);             }         });          futures.put(taskId, future);         return task;     }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0431\u044d\u043a\u0430\u043f\u0430 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442: \u0431\u044d\u043a\u0430\u043f \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0434\u0430\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043e \u0432\u0441\u0435\u0445 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043d \u0431\u044b\u043b \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d.<\/p>\n<p>  <\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">tasksStarterService.startDeleteTask(Task.RunType.USER, backupProperties);<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0431\u044d\u043a\u0430\u043f\u0430 \u0432 \u0432\u0438\u0434\u0435 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/y4\/ca\/yp\/y4cayp76w4v0tx8umvzcp6flzd4.png\" alt=\"\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0431\u044d\u043a\u0430\u043f\u0430\" title=\"\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0431\u044d\u043a\u0430\u043f\u0430\"><\/p>\n<\/div>\n<\/div>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<h3 id=\"otmena-taskov\">\u041e\u0442\u043c\u0435\u043d\u0430 \u0442\u0430\u0441\u043a\u043e\u0432<\/h3>\n<p>  <\/p>\n<p>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043e\u0442\u043c\u0435\u043d\u0430 \u0437\u0430\u0434\u0430\u0447\u0438? \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u044d\u0442\u043e \u043d\u0438\u0447\u0442\u043e \u0438\u043d\u043e\u0435, \u043a\u0430\u043a \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 \u0442\u0440\u0435\u0434\u0430. \u0412\u044b \u043c\u043e\u0433\u043b\u0438 \u0432\u0438\u0434\u0435\u0442\u044c, \u0447\u0442\u043e \u0432\u0435\u0441\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043e\u0434, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u0432 Future, \u043e\u0431\u0435\u0440\u043d\u0443\u0442 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e try-catch \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">try {     ... } catch (InterruptedException ex) {     ...     tasksManager.setInterrupted(taskId); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0410 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u0430\u0436\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430, \u043f\u043e\u0442\u043e\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u043c, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">if (Thread.interrupted()) {     throw new InterruptedException(); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u0438\u0434\u0442\u0438 \u0434\u0430\u043b\u044c\u0448\u0435, \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a\u0440\u0430\u0442\u043a\u0443\u044e \u0442\u0435\u043e\u0440\u0438\u044e \u043e \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f\u0445 \u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u0445 \u0442\u0440\u0435\u0434\u043e\u0432 JVM.<\/p>\n<p>  <\/p>\n<p>\u0422\u0440\u0435\u0434\u044b \u0432 JVM \u043c\u043e\u0433\u0443\u0442 \u0438\u043c\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f:<\/p>\n<p>  <\/p>\n<ol>\n<li>New<\/li>\n<li>Runnable<\/li>\n<li>Timed waiting<\/li>\n<li>Waiting<\/li>\n<li>Blocked<\/li>\n<li>Terminated<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u041d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f Waiting \u0438 Timed waiting. \u0422\u0440\u0435\u0434 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <em>Waiting<\/em> \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 <code>Object.wait()<\/code>, <code>Thread.join()<\/code> \u0438 \u043f\u0440\u043e\u0447\u0438\u043c\u0438. \u0422\u0440\u0435\u0434 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <em>Timed waiting<\/em> (\u0442.\u0435. \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0434\u043b\u0438\u0442\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u043a \u0432\u0440\u0435\u043c\u0435\u043d\u0438) \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 <code>Object.wait(timeout)<\/code>, <code>Thread.join(timeout)<\/code>, <code>Thread.sleep(sleeping)<\/code> \u0438 \u043f\u0440\u043e\u0447\u0438\u043c\u0438.<\/p>\n<p>  <\/p>\n<p>\u0421\u0430\u043c\u043e\u0435 \u0432\u0430\u0436\u043d\u043e\u0435 \u0437\u0434\u0435\u0441\u044c \u0442\u043e, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043f\u0440\u0435\u0440\u0432\u0430\u0442\u044c \u0442\u0440\u0435\u0434 <em>\u043f\u0435\u0440\u0435\u0434 \u0432\u0445\u043e\u0434\u043e\u043c \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435<\/em> Waiting \u0438\u043b\u0438 Timed waiting \u0438\u043b\u0438 \u0436\u0435 \u043a\u043e\u0433\u0434\u0430 \u0442\u0440\u0435\u0434 <em>\u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438<\/em>, \u0442\u043e \u0442\u0440\u0435\u0434 \u043f\u0440\u043e\u0441\u043d\u0435\u0442\u0441\u044f, \u0432\u044b\u0431\u0440\u043e\u0441\u0438\u0432 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 <strong>InterruptedException<\/strong>.<\/p>\n<p>  <\/p>\n<p>\u041d\u043e \u044d\u0442\u043e \u0435\u0449\u0435 \u043d\u0435 \u0432\u0441\u0435. \u0421\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u0444\u0430\u043a\u0442, \u0447\u0442\u043e \u0442\u0440\u0435\u0434 \u043a\u043e\u0433\u0434\u0430-\u043b\u0438\u0431\u043e \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u0442 \u0432 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435, \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0431\u044d\u043a\u0430\u043f\u0430. \u041a\u0430\u043a \u0436\u0435 \u0442\u043e\u0433\u0434\u0430 \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c \u0442\u0440\u0435\u0434\u0443 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d \u0431\u044b\u043b \u043f\u0440\u0435\u0440\u0432\u0430\u043d? <\/p>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u2014 \u044d\u0442\u043e \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0444\u043b\u0430\u0433\u0430 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u0442\u0440\u0435\u0434\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 <code>Thread.interrupted()<\/code> \u0438\u043b\u0438 <code>Thread.currentThread.isInterrupted()<\/code>. \u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <code>currentThread.isInterrupted(boolean ClearInterrupted)<\/code>, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f \u0432 \u043d\u0435\u0433\u043e <code>true<\/code>, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044f \u0442\u043e, \u0447\u0442\u043e \u0444\u043b\u0430\u0433 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043e\u0447\u0438\u0449\u0435\u043d, \u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u2014 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f <code>false<\/code>, \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u0444\u043b\u0430\u0433 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u0442\u0440\u043e\u043d\u0443\u0442\u044b\u043c. \u0412\u044b\u0431\u043e\u0440 \u043c\u0435\u0436\u0434\u0443 \u044d\u0442\u0438\u043c\u0438 \u0434\u0432\u0443\u043c\u044f \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0442 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438. \u041a\u043e\u0433\u0434\u0430 \u0431\u0440\u043e\u0441\u0430\u0435\u0442\u0441\u044f InterruptedException, \u0444\u043b\u0430\u0433 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u0442\u0430\u043a\u0436\u0435 \u043e\u0447\u0438\u0449\u0430\u0435\u0442\u0441\u044f \u2014 \u043e\u0431 \u044d\u0442\u043e\u043c \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u043c\u043d\u0438\u0442\u044c.<\/p>\n<p>  <\/p>\n<p>\u041d\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u0436\u0435 \u0431\u044b\u0442\u044c \u0441\u043f\u043e\u0441\u043e\u0431 \u043b\u0435\u0433\u0447\u0435 \u2014 \u0438 \u043e\u043d \u0435\u0441\u0442\u044c. \u0412 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0431\u043e\u0442\u044b \u0441 I\/O \u0441\u0442\u0440\u0438\u043c\u0430\u043c\u0438, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0438 \u0441 I\/O \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438. \u041d\u0430\u0448\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u043f\u0440\u043e\u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0437\u0430 \u0442\u0435\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 <code>read()<\/code> \u0438\u043b\u0438 <code>write(int b)<\/code> \u043d\u0430 I\/O \u0441\u0442\u0440\u0438\u043c\u0435 \u043f\u0440\u0438 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0438 \u0431\u044b\u043b\u0430 \u0432\u044b\u0431\u0440\u043e\u0448\u0435\u043d\u0430 \u043a\u0430\u043a\u0430\u044f-\u043d\u0438\u0431\u0443\u0434\u044c \u043e\u0448\u0438\u0431\u043a\u0430, \u0441\u043e\u043e\u0431\u0449\u0430\u044e\u0449\u0430\u044f \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 I\/O \u0432\u044b\u0437\u043e\u0432 \u0431\u044b\u043b \u043f\u0440\u0435\u0440\u0432\u0430\u043d. \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, Java \u0438\u043c\u0435\u0435\u0442 \u0442\u0430\u043a\u043e\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u2014 <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/io\/InterruptedIOException.html\">InterruptedIOException<\/a>. \u041e\u0434\u043d\u0430\u043a\u043e, \u043d\u0435 \u0432\u0441\u0435 read\/write \u043c\u0435\u0442\u043e\u0434\u044b \u0441\u0442\u0440\u0438\u043c\u043e\u0432 \u0441\u043b\u0435\u0434\u044f\u0442 \u0437\u0430 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f\u043c\u0438 \u0442\u0440\u0435\u0434\u0430, \u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0437\u0430 \u044d\u0442\u0438\u043c \u0441\u043b\u0435\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e <em>PipedInputStream<\/em>. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0442\u0435\u0445 \u043c\u0435\u0441\u0442\u0430\u0445, \u0433\u0434\u0435 \u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u0442\u0440\u0438\u043c \u043d\u0435 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442\u0441\u044f, \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434 read\/write \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043b\u043e\u0441\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 InterruptedIOException. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u043c\u043d\u0435 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0445\u0432\u0430\u0442\u0438\u043b\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u0430 read() \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u2014 \u043f\u0440\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0438 InputStream \u0438\u0437 \u043c\u0435\u0442\u043e\u0434\u0430 \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0438 \u0431\u044d\u043a\u0430\u043f\u0430. \u0418\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u0437\u043d\u0430\u0442\u044c \u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0438 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f, \u043d\u0435 \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u0432\u0435\u0437\u0434\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0444\u043b\u0430\u0433\u0430. \u041e\u0434\u043d\u0430\u043a\u043e, \u0432\u0430\u0436\u043d\u043e \u043b\u043e\u0432\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u043e\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043e\u0442 IOException \u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0435\u0433\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c. \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u043d\u0435 \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0431\u0435\u0437 \u043f\u043e\u043c\u043e\u0449\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0444\u043b\u0430\u0433\u0430 \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u0435\u0441\u0442\u0430\u0445, \u043d\u043e \u0443\u0436\u0435 \u0441\u0442\u0430\u043b\u043e \u043b\u0443\u0447\u0448\u0435.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0432\u0430\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u0444\u043b\u0430\u0433 \u0431\u044b\u043b \u043e\u0447\u0438\u0449\u0435\u043d, \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043d\u043e\u0432\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0444\u043b\u0430\u0433 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043b\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0438\u0437 \u043c\u0435\u0442\u043e\u0434\u0430 \u043c\u044b \u0441\u043c\u043e\u0433\u043b\u0438 \u0443\u0437\u043d\u0430\u0442\u044c \u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u0435\u0434\u0448\u0435\u043c \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0438.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u044f\u0441\u043d\u044e \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435, \u043f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u043e. \u041f\u0443\u0441\u0442\u044c \u043c\u044b \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0431\u044d\u043a\u0430\u043f \u043d\u0430 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 upload() \u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435. \u041f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0440\u0430\u0431\u043e\u0442\u0430 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u0438\u0437 \u043c\u0435\u0442\u043e\u0434\u0430. \u041f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u043f\u0440\u043e\u0441\u0442\u0430 \u2014 \u043e\u043d\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0438\u043b\u0438 \u0433\u0434\u0435-\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430, \u0438\u043b\u0438 \u044e\u0437\u0435\u0440 \u043e\u0442\u043c\u0435\u043d\u0438\u043b \u0437\u0430\u0434\u0430\u0447\u0443. \u0412\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043f\u0440\u0438\u0447\u0438\u043d\u044b, \u043c\u044b \u043e\u0431\u044f\u0437\u0430\u043d\u044b \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u0441\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c Future. \u041d\u043e \u0435\u0441\u043b\u0438 \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u043c \u0438\u0437 \u043c\u0435\u0442\u043e\u0434\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0444\u043b\u0430\u0433 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u0441\u043d\u043e\u0432\u0430, \u043c\u044b \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0443\u0437\u043d\u0430\u0435\u043c \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u0431\u043b\u043e\u043a\u0435 Future \u043e \u0441\u043b\u0443\u0447\u0438\u0432\u0448\u0435\u043c\u0441\u044f \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0438.<br \/>  \u042d\u0442\u043e\u0442 \u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">backupLoadManager.uploadBackup(processedBackupStream, backupProperties, taskId); &lt;- \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435, \u043c\u0435\u0442\u043e\u0434 \u043e\u0431\u044f\u0437\u0430\u043d \u0441\u043d\u043e\u0432\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0444\u043b\u0430\u0433 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f if (Thread.interrupted()) { \/\/ \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u043c\u0435\u0442\u043e\u0434\u0430 \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0441\u044f \u043b\u0438 \u0432\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430 \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435     throw new InterruptedException(); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u044d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u0430\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c <strong>InterruptedException<\/strong> \u0438\u043b\u0438 <strong>InterruptedIOException<\/strong> \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">try {     ... } catch (InterruptedException e) { \/\/ \u0438\u043b\u0438 InterruptedIOException     ...     \/\/ re-interrupt the thread     Thread.currentThread().interrupt(); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0425\u043e\u0440\u043e\u0448\u043e, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 \u043c\u044b \u0443\u043c\u0435\u0435\u043c, \u043d\u043e \u043a\u0442\u043e \u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u0442\u044c \u0442\u0440\u0435\u0434\u044b?<br \/>  \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0435\u0449\u0435 \u043e\u0434\u043d\u0443 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <em>CancelTask<\/em>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c ID \u0442\u0430\u0441\u043a\u0430 \u0434\u043b\u044f \u043e\u0442\u043c\u0435\u043d\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0432\u043e\u0442\u0447\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u0431\u0443\u0434\u0435\u0442 \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u0442\u044c \u0442\u0430\u0441\u043a\u0438. \u041f\u043e\u0447\u0435\u043c\u0443 \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f? \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e:<\/p>\n<p>  <\/p>\n<ol>\n<li>\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0440\u0432\u0430\u0442\u044c \u0442\u0440\u0435\u0434 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u0423 \u043d\u0430\u0441 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 Future \u0440\u0430\u0441\u043a\u0438\u0434\u0430\u043d\u044b \u043f\u043e \u0440\u0430\u0437\u043d\u044b\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043a\u043e\u0433\u0434\u0430 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043e\u0442\u043c\u0435\u043d\u0443 \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0438\u0437 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432, \u043d\u0443\u0436\u043d\u0430\u044f Future \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430. <\/li>\n<li>\u0422\u0430\u0441\u043a \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0442\u043c\u0435\u043d\u0435\u043d, \u0442\u0430\u043a \u043a\u0430\u043a Future \u0431\u044b\u043b\u0430 \u0443\u0442\u0435\u0440\u044f\u043d\u0430 \u0438\u0437-\u0437\u0430 \u043f\u0430\u0434\u0435\u043d\u0438\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430.<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u041a\u0440\u0430\u0442\u043a\u043e \u043e\u043f\u0438\u0448\u0443 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043e\u0442\u043c\u0435\u043d\u044b \u0432 \u0432\u043e\u0442\u0447\u0435\u0440\u0435:<br \/>  \u0412\u043e\u0442\u0447\u0435\u0440 \u0434\u043e\u0441\u0442\u0430\u0435\u0442 \u0432\u0441\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b <em>cancel_tasks<\/em> (\u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043b\u043e\u043a \u043d\u0435 \u0441\u0442\u0430\u0432\u0438\u0442\u0441\u044f), \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u0439 \u0438 \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e Future \u0438\u0437 \u0441\u0432\u043e\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438. \u0415\u0441\u043b\u0438 Future \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0430 \u2014 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0442\u0440\u0435\u0434 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 revert \u0442\u0430\u0441\u043a\u0430 \u0438 \u0437\u0430\u043f\u0440\u043e\u0441 \u0443\u0434\u0430\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u0415\u0441\u043b\u0438 \u0436\u0435 \u0442\u0430\u0439\u043c\u0430\u0443\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430 \u043e\u0442\u043c\u0435\u043d\u0443 \u0442\u0430\u0441\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d (\u0447\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0442\u043e, \u0447\u0442\u043e \u0441\u0435\u0440\u0432\u0435\u0440 \u0443\u043f\u0430\u043b \u0438 Future \u0431\u044b\u043b\u0438 \u043f\u043e\u0442\u0435\u0440\u044f\u043d\u044b) \u2014 \u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0434\u0430\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u0415\u0441\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0437\u0430\u043c\u0435\u0442\u044f\u0442 \u0442\u0430\u0439\u043c\u0430\u0443\u0442 \u0438 \u0443\u0434\u0430\u043b\u044f\u0442 \u0437\u0430\u043f\u0438\u0441\u044c \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u0442\u0440\u0430\u0448\u043d\u043e\u0433\u043e \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432 PostgreSQL \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u043e.<\/p>\n<p>  <\/p>\n<p><strong>\u041a\u043e\u0434 CancelTasksWatcher:<\/strong><\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">\/**  * This class scans for tasks to cancel and tries to cancel them.  *\/ @Component class CancelTasksWatcher {     private static final Logger logger = LoggerFactory.getLogger(CancelTasksWatcher.class);     private static final Duration cancelTimeout = Duration.ofMinutes(10);     private CancelTasksManager cancelTasksManager;     private TasksStarterService tasksStarterService;     private TasksManager tasksManager;      \/\/ spring setters...      \/**      * This watcher wakes up every time 10 seconds passed from the last completion, checks if there are any tasks to cancel and tries to      * cancel each task.      * &lt;p&gt;      * Since there are can be working more that one instance of the program, {@literal Future} instance of task can belong to different      * servers. We can't get access to {@literal Future} if it's not in memory of the server where task cancellation request was accepted.      * So the purpose of this watcher is to be able cancel tasks that works in the other instance of program. Each server has this watcher      * checking for available cancellation requests and if any, the watcher tries to cancel corresponding {@literal Future}.      * If cancellation is successful task will be also reverted.      * &lt;p&gt;      * If task cancellation request timeout exceeded, then it means a server that had requested {@literal Future} instances has been      * shutdown, so all {@literal Future} instances lost and task can't be canceled. In such case task cancellation request will be ignored.      *      * @see TasksStarterService#getFuture(Integer)      * @see TasksManager#revertTask(Task)      *\/     @Scheduled(fixedDelay = 10 * 1000)     @Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRES_NEW)     public void watchTasksToCancel() {         Iterable&lt;CancelTask&gt; cancelTasks = cancelTasksManager.findAll();          Iterable&lt;Task&gt; tasks = tasksManager.findAllById(StreamSupport.stream(cancelTasks.spliterator(), false)                 .map(CancelTask::getTaskId).collect(Collectors.toList()));         Map&lt;Integer, Task&gt; tasksAsMap = StreamSupport.stream(tasks.spliterator(), false)                 .collect(Collectors.toMap(Task::getId, Function.identity()));          List&lt;Integer&gt; taskIdsForDeleting = new ArrayList&lt;&gt;();          for (CancelTask cancelTask : cancelTasks) {             Integer taskId = cancelTask.getTaskId();              Task task = tasksAsMap.get(taskId);             if (task == null) {                 logger.error(\"Can't cancel task: no such entity with ID {}\", taskId);                 taskIdsForDeleting.add(taskId);                 continue;             }              \/\/ timeout exceeded, that is server shutdown and lost all Future instances, so task can't be canceled             if (LocalDateTime.now(ZoneOffset.UTC).isAfter(cancelTask.getPutTime().plus(cancelTimeout))) {                 logger.error(\"Can't cancel task: timeout exceed. Task ID: {}\", taskId);                 taskIdsForDeleting.add(taskId);                 continue;             }              tasksStarterService.getFuture(taskId).ifPresent(future -&gt; {                 logger.info(\"Canceling task with ID {}\", taskId);                  boolean canceled = future.cancel(true);                 if (canceled) {                     try {                         \/\/ give time to properly handle interrupt                         Thread.sleep(10000);                     } catch (InterruptedException e) {                         \/\/ should not happen                     }                     tasksManager.revertTask(task);                 }                  taskIdsForDeleting.add(taskId);                  logger.info(\"Task canceled: {}. Task ID: {}\", canceled, taskId);             });         }          cancelTasksManager.deleteByTaskIdIn(taskIdsForDeleting);     } }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<h4 id=\"obrabotka-oshibok\">\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a<\/h4>\n<p>  <\/p>\n<p>\u0412\u044b\u0448\u0435 \u0432\u044b \u043c\u043e\u0433\u043b\u0438 \u0432\u0438\u0434\u0435\u0442\u044c, \u0447\u0442\u043e \u0432\u0435\u0441\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043e\u0434, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u0432 Future, \u043e\u0431\u0435\u0440\u043d\u0443\u0442 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e try-catch \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">try {     ... } catch (RuntimeException e) {     ...     errorTasksManager.addErrorTask(taskId); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u0432\u0435\u0440\u043d\u0443\u0442\u044c <em>RuntimeException<\/em> \u043f\u0440\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u0438 \u0432\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0432 Future \u0431\u0443\u0434\u0435\u0442 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430, \u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u0430 \u043a\u0430\u043a \u043e\u0448\u0438\u0431\u043e\u0447\u043d\u0430\u044f \u0438 \u043f\u043e\u0437\u0436\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u0430. <\/p>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>addErrorTask(taskId)<\/code> \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0445\u0440\u0430\u043d\u0438\u0442 ID \u0442\u0430\u0441\u043a\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430.<br \/>  \u0427\u0442\u043e \u0436\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u0434\u0430\u043b\u044c\u0448\u0435? \u0414\u0430\u043b\u0435\u0435 \u0432 \u0440\u0430\u0431\u043e\u0442\u0443 \u0432\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0432\u043e\u0442\u0447\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u043e\u0441\u044b\u043f\u0430\u0442\u044c\u0441\u044f, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043e\u0448\u0438\u0431\u043e\u0447\u043d\u044b\u0445 \u0442\u0430\u0441\u043a\u043e\u0432 \u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0438\u0445, \u043e\u0442\u043a\u0430\u0442\u044b\u0432\u0430\u044f \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<p>\u041a\u0440\u0430\u0442\u043a\u043e \u043e\u043f\u0438\u0448\u0443 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u043e\u0442\u0447\u0435\u0440\u0430:<br \/>  \u0412\u043e\u0442\u0447\u0435\u0440 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u043f\u043e \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u043e\u0448\u0438\u0431\u043e\u0447\u043d\u044b\u0445 \u0442\u0430\u0441\u043a\u043e\u0432 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0440\u043e\u0431\u0443\u0436\u0434\u0435\u043d\u0438\u0438 \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043b\u043e\u043a \u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u0448\u0438\u0431\u043e\u0447\u043d\u044b\u0439 \u0442\u0430\u0441\u043a \u043d\u0435 \u0431\u044b\u043b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437, \u0432\u0435\u0434\u044c \u0443 \u043d\u0430\u0441 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432. \u041b\u043e\u043a \u2014 \u044d\u0442\u043e PostgreSQL <code>select for update<\/code>, \u043f\u0440\u0438\u0447\u0435\u043c \u043a select \u0437\u0430\u043f\u0440\u043e\u0441\u0443 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f <code>skip locked<\/code> \u0434\u043b\u044f \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430 \u0443\u0436\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043e\u0448\u0438\u0431\u043e\u0447\u043d\u044b\u0445 \u0442\u0430\u0441\u043a\u043e\u0432. \u0414\u0430\u043b\u0435\u0435, \u0437\u0430\u043f\u043e\u043b\u0443\u0447\u0438\u0432 \u0437\u0430\u0434\u0430\u0447\u0443, \u043e\u043d \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 <code>revertTask()<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u043f\u043e \u043e\u0442\u043c\u0435\u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u0430 \u0437\u0430\u0434\u0430\u0447\u0438.<\/p>\n<p>  <\/p>\n<p><strong>\u041a\u043e\u0434 ErrorTasksWatcher<\/strong>:<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">\/**  * This class scans for erroneous tasks and handles them depending on their state.  *\/ @Component class ErrorTasksWatcher {     private static final Logger logger = LoggerFactory.getLogger(ErrorTasksWatcher.class);      private static final Integer nRows = 10;      private TasksManager tasksManager;      private ErrorTasksManager errorTasksManager;      \/\/ spring setters...      \/**      * This watcher wakes up every time 1 minute passed from the last completion, checks backup states periodically and handles erroneous      * tasks if any.      * &lt;p&gt;      * The watcher handles at most N tasks as described by {@link #nRows} constant and skips already locked tasks.      * When retrieving error tasks from database pessimistic lock is set. It allows safely run more than one copy of program, as no other      * watcher can pick up already being handled error tasks.      * &lt;p&gt;      * If the server shutdowns while rows was locked, transaction will be rolled back and lock released, so these entities can be picked      * up by the other running server.      *\/     @Scheduled(fixedDelay = 60 * 1000)     @Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRES_NEW)     public void watchErrorTasks() {         for (ErrorTask errorTask : errorTasksManager.findFirstNAndLock(nRows)) {             if (!errorTask.isErrorHandled()) {                 Integer backupTaskId = errorTask.getTaskId();                  Optional&lt;Task&gt; optionalTask = tasksManager.findById(backupTaskId);                 if (!optionalTask.isPresent()) {                     logger.info(\"Can't handle erroneous task: no corresponding backup task entity. Backup task ID: {}\", backupTaskId);                     continue;                 }                  tasksManager.revertTask(optionalTask.get());                 errorTask.setErrorHandled(true);             }         }     } }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p><strong>\u041a\u043e\u0434 <code>revertTask(Task)<\/code>:<\/strong><\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">    \/**      * This function reverts erroneous task by its entity.      * &lt;p&gt;      * Use this function only after canceling related {@literal Future}.      * &lt;p&gt;      * If the task was of the type {@link Task.Type#CREATE_BACKUP} then related {@link BackupProperties} will be deleted.      *      * @param task the entity      *\/     public void revertTask(@NotNull Task task) {             Objects.requireNonNull(task);              Task.State state = task.getState();              switch (state) {                 case DOWNLOADING:                 case APPLYING_DEPROCESSORS:                 case RESTORING:                 case DELETING: {                     logger.info(\"Handling broken operation. Operation: {}. No extra actions required\", state.toString());                     break;                 }                 case CREATING:                 case APPLYING_PROCESSORS: {                     logger.info(\"Handling broken operation. Operation: {}. Delete backup properties...\", state.toString());                      Integer backupPropertiesID = task.getBackupPropertiesId();                      if (!backupPropertiesManager.existsById(backupPropertiesID)) {                         logger.error(\"Can't revert task: no related backup properties. Task info: {}\", task);                         return;                     }                      backupPropertiesManager.deleteById(backupPropertiesID);                     break;                 }                 case UPLOADING: {                     logger.info(\"Handling broken operation. Operation: {}. Deleting backup from storage...\", state);                      Integer backupPropertiesId = task.getBackupPropertiesId();                     Optional&lt;BackupProperties&gt; optionalBackupProperties = backupPropertiesManager.findById(backupPropertiesId);                     if (!optionalBackupProperties.isPresent()) {                         logger.error(\"Can't revert task: no related backup properties. Task info: {}\", task);                         return;                     }                      tasksStarterService.startDeleteTask(Task.RunType.INTERNAL, optionalBackupProperties.get());                     backupPropertiesManager.deleteById(backupPropertiesId);                     break;                 }                 default: {                     logger.error(\"Can't revert task: unknown state. Task info: {}\", task);                 }             }         }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438:<\/p>\n<p>  <\/p>\n<ol>\n<li>\u0422\u0430\u0441\u043a \u043d\u0430\u0445\u043e\u0434\u0438\u043b\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 <em>DOWNLOADING<\/em>, <em>APPLYING_DEPROCESSORS<\/em>, <em>RESTORING<\/em>, <em>DELETING<\/em> \u2014 \u0431\u044d\u043a\u0430\u043f \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u043b\u0441\u044f \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u044f\u043b\u0441\u044f. \u0422\u043e\u0433\u0434\u0430 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0434\u043b\u044f \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u044f.<\/li>\n<li>\u0422\u0430\u0441\u043a \u043d\u0430\u0445\u043e\u0434\u0438\u043b\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 <em>CREATING<\/em>, <em>APPLYING_PROCESSORS<\/em> \u2014 \u0431\u044d\u043a\u0430\u043f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0441\u044f, \u043d\u043e \u0435\u0449\u0435 \u043d\u0435 \u043d\u0430\u0447\u0430\u043b \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435. \u0422\u043e\u0433\u0434\u0430 \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0434\u0430\u043b\u0438\u043c \u0437\u0430\u043f\u0438\u0441\u044c BackupProperties \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043f\u043e\u043b\u043e\u043c\u0430\u043d\u043d\u044b\u0439 \u0431\u044d\u043a\u0430\u043f (\u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 BackupProperties \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0442\u0441\u044f \u0432 Web UI \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u044d\u043a\u0430\u043f\u0430\u043c\u0438).<\/li>\n<li>\u0422\u0430\u0441\u043a \u043d\u0430\u0445\u043e\u0434\u0438\u043b\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 <em>UPLOADING<\/em> \u2014 \u0431\u044d\u043a\u0430\u043f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0441\u044f \u0438 \u043d\u0430\u0447\u0430\u043b \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435. \u0422\u043e\u0433\u0434\u0430 \u043d\u0430\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c BackupProperties \u0438\u0437 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u043e \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0431\u044d\u043a\u0430\u043f \u0441 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0437\u0430\u0434\u0430\u0447\u0443 \u043f\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044e \u0431\u044d\u043a\u0430\u043f\u0430.<\/li>\n<\/ol>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e, \u044d\u0442\u043e \u0435\u0449\u0435 \u043d\u0435 \u0432\u0441\u0435. \u0427\u0442\u043e \u0436\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0432 \u0442\u0435\u0445 \u0442\u0440\u0435\u0434\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0432 \u0444\u043e\u043d\u0435? \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u0435\u0442\u043e\u0434 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0431\u044d\u043a\u0430\u043f\u0430, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u0432 \u0442\u0440\u0435\u0434\u0435 Future (\u043d\u0430\u0437\u043e\u0432\u0435\u043c \u0422\u0440\u0435\u0434 1), \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0442\u0440\u0435\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u0431\u044d\u043a\u0430\u043f \u0432 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0431\u044d\u043a\u0430\u043f\u0430 InputStream (\u043d\u0430\u0437\u043e\u0432\u0435\u043c \u0422\u0440\u0435\u0434 2). \u0427\u0442\u043e, \u0435\u0441\u043b\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u0422\u0440\u0435\u0434\u0435 2, \u0430 \u0422\u0440\u0435\u0434 1 \u0443\u0436\u0435 \u0434\u0430\u0432\u043d\u043e \u043d\u0430\u0447\u0430\u043b \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0431\u044d\u043a\u0430\u043f \u043d\u0430 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0422\u0440\u0435\u0434\u0430 2 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u0439\u043c\u0430\u043d\u043e?<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u043c\u044b \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043f\u0440\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0438 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f. \u0414\u0430\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u0442\u044c \u0442\u0440\u0435\u0434 Future (\u0432\u0441\u0435 \u0442\u043e\u0442 \u0436\u0435 \u0422\u0440\u0435\u0434 1) \u0438 \u043f\u043e\u043c\u0435\u0447\u0430\u0442\u044c \u0442\u0430\u0441\u043a \u043a\u0430\u043a \u043e\u0448\u0438\u0431\u043e\u0447\u043d\u044b\u0439:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">    public void onError(@NotNull Throwable t, @NotNull Integer taskId) {         logger.error(\"Exception caught. Task ID: {}\", taskId, t);          Optional&lt;Future&gt; optionalFuture = tasksStarterService.getFuture(taskId);         if (!optionalFuture.isPresent()) {             logger.error(\"Can't cancel the Future of task with ID {}: no such Future instance\", taskId);         } else {             boolean canceled = optionalFuture.get().cancel(true);             if (!canceled) {                 logger.error(\"Error canceling the Future of task with ID {}\", taskId);             } else {                 logger.info(\"Task canceled. Task ID: {}\", taskId);                 errorTasksManager.setError(taskId);             }         }     }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u043c\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0442\u0430\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u043b\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c, \u043c\u044b \u043f\u0440\u043e\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043b\u0438 \u0432 \u043c\u0435\u0442\u043e\u0434\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 ID \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0442\u0430\u0441\u043a\u0430, \u0432\u0435\u0434\u044c \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u0443\u044e Future \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0435\u0451 \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0438 ID \u0442\u0430\u0441\u043a\u0430 \u043d\u0430\u043c \u0432 \u044d\u0442\u043e\u043c \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442.<\/p>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432\u0430\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u0430 \u043a\u0430\u043a \u043e\u0448\u0438\u0431\u043e\u0447\u043d\u0430\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0442\u0440\u0435\u0434 \u0431\u044b\u043b \u043f\u0440\u0435\u0440\u0432\u0430\u043d \u0443\u0441\u043f\u0435\u0448\u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u0431\u044b\u043b\u0430 \u043f\u0440\u0435\u0440\u0432\u0430\u043d\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u0438 \u043d\u0430\u0447\u0430\u043b\u0441\u044f \u043e\u0442\u043a\u0430\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u0430 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043e\u0448\u0438\u0431\u043e\u0447\u043d\u043e\u0433\u043e \u0442\u0430\u0441\u043a\u0430 \u043e\u0442\u043a\u0430\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u043d\u0430\u0447\u043d\u0435\u0442\u0441\u044f \u0435\u0449\u0435 \u0440\u0430\u0437.<\/p>\n<p>  <\/p>\n<p><strong>\u041e \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f\u0445 \u0442\u0440\u0435\u0434\u043e\u0432, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0445 \u0432 \u0444\u043e\u043d\u0435:<\/strong><\/p>\n<p>  <\/p>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432\u044b \u043c\u043e\u0433\u043b\u0438 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u044f \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b \u043e \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0438 \u0442\u0440\u0435\u0434\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0432 \u0444\u043e\u043d\u0435. \u041e\u0448\u0438\u0431\u043a\u0438 \u0438\u0437 \u043d\u0438\u0445 \u043c\u044b \u043b\u043e\u0432\u0438\u0442\u044c \u0443\u043c\u0435\u0435\u043c \u2014 \u043d\u043e \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0440\u0435\u0434 Future.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u0432\u0441\u0435 \u0442\u0440\u0435\u0434\u044b \u0432 \u043c\u043e\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0432 \u0444\u043e\u043d\u0435, \u0442\u0430\u043a \u0438\u043b\u0438 \u0438\u043d\u0430\u0447\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441 I\/O \u0441\u0442\u0440\u0438\u043c\u0430\u043c\u0438, \u0438 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 \u0432 \u043d\u0438\u0445 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u2014 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u0437\u0430\u043f\u0438\u0441\u0438\/\u0447\u0442\u0435\u043d\u0438\u0438 \u0438\u0437 \u0437\u0430\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u0441\u0442\u0440\u0438\u043c\u0430. \u041d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u0447\u0442\u043e \u0441\u0442\u0440\u0438\u043c \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043a\u0440\u044b\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a. \u041e\u043d \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043a\u0440\u044b\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0434\u0432\u0443\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445:<\/p>\n<p>  <\/p>\n<ol>\n<li>\u0420\u0430\u0431\u043e\u0442\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0430\u0441\u044c, \u0432\u0441\u0435 \u0445\u043e\u0440\u043e\u0448\u043e. \u0421\u0442\u0440\u0438\u043c \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0440\u043e\u0432\u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043d\u0438\u043c \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0430\u0441\u044c \u2014 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043e.<\/li>\n<li>\u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u2014 \u0442\u043e\u0433\u0434\u0430 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u0442\u0440\u0435\u0434\u0430 Future \u0432\u0441\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u044e\u0442\u0441\u044f, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043b\u044e\u0431\u044b\u0435 \u0441\u0442\u0440\u0438\u043c\u044b. \u041b\u044e\u0431\u043e\u0439 \u043f\u043e\u0442\u043e\u043a, \u043f\u0438\u0448\u0443\u0449\u0438\u0439\/\u0447\u0438\u0442\u0430\u044e\u0449\u0438\u0439 \u0438\u0437 \u0442\u0430\u043a\u043e\u0433\u043e \u0441\u0442\u0440\u0438\u043c\u0430, \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u0441\u043e\u043e\u0431\u0449\u0430\u044e\u0449\u0435\u0435 \u043e \u0437\u0430\u043a\u0440\u044b\u0442\u043e\u043c \u0441\u0442\u0440\u0438\u043c\u0435 (\u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u044d\u0442\u043e \u0435\u0449\u0451 \u0446\u0435\u043b\u043e\u0435 \u043f\u0440\u0438\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u2014 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0442\u044c \u0432 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u0435\u0434\u0448\u0435\u043c IOException \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0439 \u0441\u0442\u0440\u0438\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0435\u0437\u0434\u0435 \u044d\u0442\u043e \u0438\u043b\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u0438\u043b\u0438 \u043f\u0440\u043e\u0447\u0438\u0435 \u043a\u043e\u0441\u0442\u044b\u043b\u0438).<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u0414\u0440\u0443\u0433\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431, \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0444\u043b\u0430\u0433\u0430 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u0442\u0430\u0441\u043a\u0430 \u0443 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 (\u0432\u0435\u0434\u044c \u043c\u044b \u043f\u0440\u043e\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c ID \u0442\u0430\u0441\u043a\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u043e \u0432\u0441\u0435 \u0432\u0430\u0436\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u043d\u0430\u0435\u043c, \u043d\u0430 \u043a\u0430\u043a\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c), \u043d\u043e \u043f\u043e\u043a\u0430 \u043c\u043d\u0435 \u044d\u0442\u043e \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e.<\/p>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u043e\u0442\u043c\u0435\u043d\u044b \u0437\u0430\u0434\u0430\u0447. \u041c\u043d\u043e\u0433\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u0434\u0435\u0442\u0430\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044f \u043e\u043f\u0443\u0441\u0442\u0438\u043b, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e, \u043d\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0439 \u0432\u044b\u0448\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432\u043f\u043e\u043b\u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0441\u0443\u0442\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438.<\/p>\n<p>  <\/p>\n<h3 id=\"plany-na-buduschee\">\u041f\u043b\u0430\u043d\u044b \u043d\u0430 \u0431\u0443\u0434\u0443\u0449\u0435\u0435<\/h3>\n<p>  <\/p>\n<ol>\n<li>\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c Web UI: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0432\u043d\u0435\u0435, \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0421\u0435\u0439\u0447\u0430\u0441 \u043e\u043d \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0440\u0430\u0439\u043d\u0435 \u0442\u043e\u043f\u043e\u0440\u043d\u043e, \u0445\u043e\u0442\u044c \u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u0432\u043e\u0438 \u043e\u0431\u044f\u0437\u0430\u043d\u043d\u043e\u0441\u0442\u0438<\/li>\n<li>\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u0440\u0443\u0433\u0438\u0445 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449<\/li>\n<li>\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u0440\u0443\u0433\u0438\u0445 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445<\/li>\n<li>\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0431\u044d\u043a\u0430\u043f\u043e\u0432<\/li>\n<li>\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0431\u044d\u043a\u0430\u043f\u043e\u0432<\/li>\n<\/ol>\n<p>  <\/p>\n<h3 id=\"zaklyuchenie\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>  <\/p>\n<p>\u0421\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435:<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/blinky-z\/DbBackupTool\"><strong>GitHub<\/strong><\/a><\/li>\n<li><a href=\"https:\/\/hub.docker.com\/r\/twite\/db-backup-tool\"><strong>Docker Hub<\/strong><\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u0432\u0441\u0435, \u0441\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435! \u0411\u0443\u0434\u0443 \u0440\u0430\u0434 \u0432\u0438\u0434\u0435\u0442\u044c \u0432\u0430\u0448\u0438 \u043e\u0442\u0437\u044b\u0432\u044b \u0438 \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u044f \u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u043e\u0432\u044b\u0435 \u043f\u0443\u043b \u0440\u0435\u043a\u0432\u0435\u0441\u0442\u044b \u043d\u0430 GitHub!  <\/p>\n<\/div>\n<p>               <script class=\"js-mediator-script\">!function(e){function t(t,n){if(!(n in e)){for(var r,a=e.document,i=a.scripts,o=i.length;o--;)if(-1!==i[o].src.indexOf(t)){r=i[o];break}if(!r){r=a.createElement(\"script\"),r.type=\"text\/javascript\",r.async=!0,r.defer=!0,r.src=t,r.charset=\"UTF-8\";var d=function(){var e=a.getElementsByTagName(\"script\")[0];e.parentNode.insertBefore(r,e)};\"[object Opera]\"==e.opera?a.addEventListener?a.addEventListener(\"DOMContentLoaded\",d,!1):e.attachEvent(\"onload\",d):d()}}}t(\"\/\/mediator.mail.ru\/script\/2820404\/\",\"_mediator\")}(window);<\/script>     <br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/459478\/\"> https:\/\/habr.com\/ru\/post\/459478\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html js-mediator-article\">\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u043d\u0438\u043a\u043e\u0433\u043e \u043d\u0435 \u0443\u0434\u0438\u0432\u0438\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u043c\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438, \u043e\u0434\u043d\u0430\u043a\u043e \u044f \u0434\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u0438\u0434\u0435\u0439. \u041c\u043e\u0435 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0435 Java \u043d\u0430\u0447\u0430\u043b\u043e\u0441\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0441 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u0435\u0441\u0442\u0430\u0445 \u044f \u0431\u0443\u0434\u0443 \u0441\u0438\u043b\u044c\u043d\u043e \u043d\u0435 \u043f\u0440\u0430\u0432 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434, \u043d\u043e \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u043a\u043e\u043c\u0443-\u043d\u0438\u0431\u0443\u0434\u044c \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d \u043e\u043f\u044b\u0442 \u043d\u043e\u0432\u0438\u0447\u043a\u0430 \u0432 \u0434\u0436\u0430\u0432\u0435. \u041f\u0440\u0438\u0432\u0435\u0434\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u0431\u044d\u043a\u0430\u043f\u0430\u043c\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0431\u044d\u043a\u0430\u043f\u0430<\/li>\n<li>\u041d\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0432\u0435\u0441\u044c \u0431\u044d\u043a\u0430\u043f \u0432 \u043f\u0430\u043c\u044f\u0442\u044c<\/li>\n<li>\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f\/\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u044d\u043a\u0430\u043f\u0430 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u043d\u044f\u0442\u044c<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0430 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0448\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0438 \u0438\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0435.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-291911","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/291911","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=291911"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/291911\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=291911"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=291911"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=291911"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}