140 lines
6.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from requests.exceptions import ConnectTimeout, ReadTimeout
from tenacity import retry, stop_after_attempt
from tenacity.wait import wait_exponential
from src.constants import FETCH_JP_NAME
from src.environments import (CRM_AUTH_TIMEOUT,
CRM_FETCH_RECORD_MAX_RETRY_ATTEMPT,
CRM_FETCH_RECORD_RETRY_INTERVAL,
CRM_FETCH_RECORD_RETRY_MAX_INTERVAL,
CRM_FETCH_RECORD_RETRY_MIN_INTERVAL,
CRM_FETCH_RECORD_TIMEOUT,
CRM_GET_RECORD_COUNT_MAX_RETRY_ATTEMPT,
CRM_GET_RECORD_COUNT_RETRY_INTERVAL,
CRM_GET_RECORD_COUNT_RETRY_MAX_INTERVAL,
CRM_GET_RECORD_COUNT_RETRY_MIN_INTERVAL,
CRM_GET_RECORD_COUNT_TIMEOUT)
from src.error.exceptions import DataConvertException, SalesforceAPIException
from src.salesforce.salesforce_api import SalesForceCount, SalesForceData
from src.util.logger import logger_instance as logger
def fetch_crm_data(target_object, last_fetch_datetime):
# ① CRMデータ取得処理開始ログを出力する
logger.info(
f'I-FETCH-01 [{target_object.object_name}] のCRMからのデータ取得処理を開始します')
object_name = target_object.object_name
columns = ','.join(target_object.columns)
last_fetch_datetime_from = last_fetch_datetime.last_fetch_datetime_from
last_fetch_datetime_to = last_fetch_datetime.last_fetch_datetime_to
global count_contime_counter, count_readtime_counter, count_counter, data_contime_counter, data_readtime_counter, data_counter
count_contime_counter = 1
count_readtime_counter = 1
count_counter = 1
data_contime_counter = 1
data_readtime_counter = 1
data_counter = 1
try:
# ② 取得対象オブジェクトの取得期間内のレコード件数を取得する
logger.info(f'I-FETCH-02 [{object_name}] の件数取得を開始します')
record_count = fetch_sf_count_retry(
object_name, last_fetch_datetime_from, last_fetch_datetime_to)
logger.info(f'I-FETCH-03 [{object_name}] の件数:[{record_count}]')
except Exception as e:
raise SalesforceAPIException(
'E-FETCH-01', FETCH_JP_NAME, f'[{object_name}] の件数取得に失敗しました エラー内容:[{e}]')
try:
# ③ 取得対象オブジェクトのレコードを取得する
logger.info(f'I-FETCH-04 [{object_name}] のレコード取得を開始します')
record_generator = fetch_sf_data_retry(
columns, object_name, last_fetch_datetime_from, last_fetch_datetime_to)
except Exception as e:
raise SalesforceAPIException(
'E-FETCH-02', FETCH_JP_NAME, f'[{object_name}] のレコード取得に失敗しました エラー内容:[{e}]')
try:
# ④ 取得対象オブジェクトをJSONに変換
logger.info(f'I-FETCH-05 [{object_name}] のレコードをJSONに変換します')
sf_object_jsons = []
for record in record_generator:
sf_object_jsons.append(record)
except Exception as e:
raise DataConvertException(
'E-FETCH-03', FETCH_JP_NAME, f'[{object_name}] のレコードのJSON変換に失敗しました エラー内容:[{e}]')
# ⑤ CRMデータ取得処理終了ログを出力する
logger.info(f'I-FETCH-06 [{object_name}] のレコード取得が成功しました')
# ⑥ 次の処理へ移行する
return sf_object_jsons
@retry(wait=wait_exponential(multiplier=CRM_GET_RECORD_COUNT_RETRY_INTERVAL, min=CRM_GET_RECORD_COUNT_RETRY_MIN_INTERVAL, max=CRM_GET_RECORD_COUNT_RETRY_MAX_INTERVAL), stop=stop_after_attempt(CRM_GET_RECORD_COUNT_MAX_RETRY_ATTEMPT))
def fetch_sf_count_retry(object_name, last_update_datetime_from, last_update_datetime_to):
try:
global count_contime_counter, count_readtime_counter, count_counter
saleforce_count = SalesForceCount()
return saleforce_count.fetch_sf_count(object_name, last_update_datetime_from, last_update_datetime_to)
except ConnectTimeout as e:
if count_contime_counter < CRM_GET_RECORD_COUNT_MAX_RETRY_ATTEMPT:
count_contime_counter += 1
logger.warn(f'W-FETCH-01 CRMの接続処理がタイムアウトしため、リトライします[{CRM_AUTH_TIMEOUT}] エラー内容:[{e}]')
raise e
except ReadTimeout as e:
if count_readtime_counter < CRM_GET_RECORD_COUNT_MAX_RETRY_ATTEMPT:
count_readtime_counter += 1
logger.warn(
f'W-FETCH-02 [{object_name}] の件数取得処理がタイムアウトしたため、リトライします:[{CRM_GET_RECORD_COUNT_TIMEOUT}] エラー内容:[{e}]')
raise e
except Exception as e:
if count_counter < CRM_GET_RECORD_COUNT_MAX_RETRY_ATTEMPT:
count_counter += 1
logger.warn(
f'W-FETCH-03 [{object_name}] の件数取得に失敗したため、リトライします エラー内容:[{e}]')
raise e
@retry(wait=wait_exponential(multiplier=CRM_FETCH_RECORD_RETRY_INTERVAL, min=CRM_FETCH_RECORD_RETRY_MIN_INTERVAL, max=CRM_FETCH_RECORD_RETRY_MAX_INTERVAL), stop=stop_after_attempt(CRM_FETCH_RECORD_MAX_RETRY_ATTEMPT))
def fetch_sf_data_retry(columns, object_name, last_update_datetime_from, last_update_datetime_to):
try:
global data_contime_counter, data_readtime_counter, data_counter
saleforce_data = SalesForceData()
return saleforce_data.fetch_sf_data(columns, object_name, last_update_datetime_from, last_update_datetime_to)
except ConnectTimeout as e:
if data_contime_counter < CRM_FETCH_RECORD_MAX_RETRY_ATTEMPT:
data_contime_counter += 1
logger.warn(f'W-FETCH-04 CRMの接続処理がタイムアウトしため、リトライします[{CRM_AUTH_TIMEOUT}] エラー内容:[{e}]')
raise e
except ReadTimeout as e:
if data_readtime_counter < CRM_FETCH_RECORD_MAX_RETRY_ATTEMPT:
data_readtime_counter += 1
logger.warn(
f'W-FETCH-05 [{object_name}] のレコード取得処理がタイムアウトしたため、リトライします:[{CRM_FETCH_RECORD_TIMEOUT}] エラー内容:[{e}]')
raise e
except Exception as e:
if data_counter < CRM_FETCH_RECORD_MAX_RETRY_ATTEMPT:
data_counter += 1
logger.warn(
f'W-FETCH-06 [{object_name}] のレコード取得に失敗したため、リトライします エラー内容:[{e}]')
raise e