Не могу задание по расписанию ErpConfigContext - PullRequest
1 голос
/ 26 апреля 2019

Я пытаюсь запланировать работу с помощью Quartz и Cant Schedule. ErpConfigContext, когда я делаю запрос, работает нормально.

Но в запланированном задании это возвращает ошибку.

//Запрос работает

protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    new ODataScheduledFetch().execute();
}

// Класс заданий не работает. Открытый класс JobProductPricing реализует задание {

@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
    // TODO Auto-generated method stub

    new ODataScheduledFetch().execute();

}

}

ODataScheduledFetch (). Execute (), подумайтеи вызывать этот метод, и при выполнении query.execute (new ErpConfigContext ());вернуть ошибку только для задания по расписанию

private boolean tryRequestERP(ODataQuery query,ODataQueryResult[] queryResult) {
    boolean boReturn=false;
    try {
        //queryResult 
        queryResult[0]  = query.execute(new ErpConfigContext());
        boReturn = true;
    }catch(Exception e) {
        String error = e.toString();
        System.out.println(error);
        boReturn = false;

    }

    return boReturn;
}

И получил эту ошибку:

[com.sap.cloud.sdk.cloudplatform.connectivity.exception.DestinationAccessException: не удалось получить ConnectivityConfiguration: noRequestContext доступен.Правильно ли вы настроили RequestContextServletFilter или обернули свою логику в RequestContextExecutor при выполнении фоновых задач, которые не запускаются запросом?]

в этом При создании исключения ErpConfigContext

есть ответ, который я не получаю ...

"РЕДАКТИРОВАТЬ: обратите внимание, что при запуске кодав фоновом задании (не инициируемом запросом) вы должны обернуть свой код с помощью RequestContextExecutor :: execute.

"

1 Ответ

1 голос
/ 27 апреля 2019

Глядя на ваш пример кода, я предполагаю, что вы не используете Spring Boot, который является предметом связанного вопроса.

Что вам нужно сделать, это превратить ваш запланированный вызов в RequestContextExecutor::execute звонок.Для вашего примера это выглядело бы так:

@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
    new RequestContextExecutor().execute(() -> {
        new ODataScheduledFetch().execute();
    });
}

В зависимости от того, что вы делаете внутри вашего ODataScheduledFetch::execute вызова, вам может понадобиться использовать JwtBasedRequestContextExecutor (только для CloudFoundry).


Для фона немного:

Все *Accessor классы (например, TenantAccessor, DestinationAccessor) полагаются натак называемый RequestContext, который будет доступен в текущей теме / запросе.Такой RequestContext создается RequestContextExecutor, как описано выше.

Чтобы упростить вашу жизнь в обычном сценарии использования (при получении запросов), мы автоматически загружаем RequestContextServletFilter, который упаковывает все входящие запросы для вас.

Вот почему ваш код работает в запросе, но не запланирован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...