In certain cases the http requests fails (== full import stops, need to start again):
- max database connections (unprocessable html content is delivered, Zammad expected json - full import stops because of not parseable JSON) - tmp. network issues (e. g. https issue or connection reset - full import stops because of exception) Try failing http request 3 times (with some sleep between) to ignore OTRS and network related issue.
This commit is contained in:
parent
ed6cca8021
commit
f7ba0a2865
2 changed files with 57 additions and 28 deletions
|
@ -1,11 +1,16 @@
|
||||||
module Import
|
module Import
|
||||||
module OTRS
|
module OTRS
|
||||||
|
|
||||||
|
# @!attribute [rw] retry_sleep
|
||||||
|
# @return [Number] the sleep time between the request retries
|
||||||
module Requester
|
module Requester
|
||||||
extend Import::Helper
|
extend Import::Helper
|
||||||
|
|
||||||
# rubocop:disable Style/ModuleFunction
|
# rubocop:disable Style/ModuleFunction
|
||||||
extend self
|
extend self
|
||||||
|
|
||||||
|
attr_accessor :retry_sleep
|
||||||
|
|
||||||
# Loads entries of the given object.
|
# Loads entries of the given object.
|
||||||
#
|
#
|
||||||
# @param object [String] the name of OTRS object
|
# @param object [String] the name of OTRS object
|
||||||
|
@ -68,8 +73,17 @@ module Import
|
||||||
private
|
private
|
||||||
|
|
||||||
def request_result(params)
|
def request_result(params)
|
||||||
|
tries ||= 1
|
||||||
response = request_json(params)
|
response = request_json(params)
|
||||||
response['Result']
|
response['Result']
|
||||||
|
rescue
|
||||||
|
# stop after 3 tries
|
||||||
|
raise if tries == 3
|
||||||
|
|
||||||
|
# try again
|
||||||
|
tries += 1
|
||||||
|
sleep tries * (retry_sleep || 15)
|
||||||
|
retry
|
||||||
end
|
end
|
||||||
|
|
||||||
def request_json(params)
|
def request_json(params)
|
||||||
|
|
|
@ -1,39 +1,54 @@
|
||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
RSpec.describe Import::OTRS::Requester do
|
RSpec.describe Import::OTRS::Requester do
|
||||||
it 'responds to load' do
|
|
||||||
expect(described_class).to respond_to('load')
|
context '.list' do
|
||||||
|
it 'responds to list' do
|
||||||
|
expect(described_class).to respond_to(:list)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'responds to list' do
|
context '.load' do
|
||||||
expect(described_class).to respond_to('list')
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'responds to connection_test' do
|
it 'responds to load' do
|
||||||
expect(described_class).to respond_to('connection_test')
|
expect(described_class).to respond_to(:load)
|
||||||
end
|
|
||||||
|
|
||||||
context 'caching request results' do
|
|
||||||
|
|
||||||
let(:response) {
|
|
||||||
response = double()
|
|
||||||
response_body = double()
|
|
||||||
expect(response_body).to receive(:to_s).at_least(:once).and_return('{"Result": {}}')
|
|
||||||
expect(response).to receive('success?').at_least(:once).and_return(true)
|
|
||||||
expect(response).to receive('body').at_least(:once).and_return(response_body)
|
|
||||||
response
|
|
||||||
}
|
|
||||||
|
|
||||||
it 'is active if no args are given' do
|
|
||||||
expect(UserAgent).to receive(:post).and_return(response)
|
|
||||||
described_class.load('Ticket')
|
|
||||||
described_class.load('Ticket')
|
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'is not active if args are given' do
|
context 'caching request results' do
|
||||||
expect(UserAgent).to receive(:post).twice.and_return(response)
|
|
||||||
described_class.load('Ticket', offset: 10)
|
let(:response) {
|
||||||
described_class.load('Ticket', offset: 20)
|
response = double()
|
||||||
|
response_body = double()
|
||||||
|
expect(response_body).to receive(:to_s).at_least(:once).and_return('{"Result": {}}')
|
||||||
|
expect(response).to receive('success?').at_least(:once).and_return(true)
|
||||||
|
expect(response).to receive('body').at_least(:once).and_return(response_body)
|
||||||
|
response
|
||||||
|
}
|
||||||
|
|
||||||
|
it 'is active if no args are given' do
|
||||||
|
expect(UserAgent).to receive(:post).and_return(response)
|
||||||
|
described_class.load('Ticket')
|
||||||
|
described_class.load('Ticket')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'is not active if args are given' do
|
||||||
|
expect(UserAgent).to receive(:post).twice.and_return(response)
|
||||||
|
described_class.load('Ticket', offset: 10)
|
||||||
|
described_class.load('Ticket', offset: 20)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context '.connection_test' do
|
||||||
|
it 'responds to connection_test' do
|
||||||
|
expect(described_class).to respond_to(:connection_test)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'retries request 3 times on errors' do
|
||||||
|
expect(UserAgent).to receive(:post).and_raise(Errno::ECONNRESET).exactly(3).times
|
||||||
|
# disable sleep time to speed up tests
|
||||||
|
described_class.retry_sleep = 0
|
||||||
|
expect { described_class.list }.to raise_error(Errno::ECONNRESET)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue