1

我正在尝试使用 Quartz 和 Cant Schedule ErpConfigContext 安排工作,当我提出请求时,工作正常。

但是在预定的工作中,这会返回一个错误。

//请求工作

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

    new ODataScheduledFetch().execute();
}

//Job 类不工作 public class JobProductPricing 实现 Job {

@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:没有可用的 RequestContext。在执行不是由请求触发的后台任务时,您是否正确配置了 RequestContextServletFilter 或将逻辑包装在 RequestContextExecutor 中?]

在此创建 ErpConfigContext 引发异常

有一个我没有得到的答案...

" 编辑:请注意,在后台作业(不是由请求触发)中运行代码时,您必须使用 RequestContextExecutor::execute 包装代码。

"

4

1 回答 1

1

查看您的代码示例,我假设您没有使用 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这样的 aRequestContext是由RequestContextExecutor上述创建的。

为了使您在通常的用例(即接收请求)中的生活更轻松,我们会自动加载RequestContextServletFilter为您包装所有传入请求的 。

这就是您的代码在请求中工作但未计划的原因。

于 2019-04-27T08:39:30.503 回答