Арендатор знает о фоновой задаче с RequestContextExecutor? - PullRequest
0 голосов
/ 28 декабря 2018

Я разрабатываю Java-приложение на SAP SCP Neo, которое использует S / 4 SDK для абстракции платформы.Я изо всех сил пытаюсь создать фоновую задачу, которая будет известна арендатору.Это означает, что при использовании методов абстракции платформы S / 4SDK, таких как com.sap.cloud.sdk.cloudplatform.tenant.TenantAccessor или DestinationAccessor для доступа к информации об арендаторе или для получения пункта назначения, эти методы должны возвращать информацию об арендаторе, как если быих можно было бы вызвать из типичного веб-запроса, специфичного для арендатора.

При вызове методов доступа S / 4SDK я обернул их вызываемым объектом и выполнил его с RequestContextExecutor.Это работает нормально, но, поскольку я не вижу способа предоставить арендатора, мне неясно, как решить мою проблему.Я видел, что прослушиватель по умолчанию используется в S / 4 SDK, поэтому я предполагаю, что он работает в контексте учетной записи поставщика.Ниже приведен пример для получения пункта назначения.

Destination getDestination(String destinationName) {

    // Request Context is present when action is triggered by a web request
    if (RequestContextAccessor.getCurrentRequest().isPresent()){
         return DestinationAccessor.getDestination(destinatioName);
    }

    // Use RequestContextExecutor if we are called from a background task 
    Callable<Destination> callable = new Callable<Destination>() {

        @Override
        public Destination call() {
            return DestinationAccessor.getDestination(destinatioName);
        }
     };

    // TODO this defaults the contexts to the provider account.
    return new RequestContextExecutor().execute(callable);
}

Мотивация:

  • Мы хотели бы написать некую логику один раз, и она будет работать независимо, если она вызывается веб-запросом.к приложению Java или вызвано фоновой задачей Java.

1 Ответ

0 голосов
/ 28 декабря 2018

При использовании RequestContextExecutor в SAP CP Neo, это будет зависеть от арендатора поставщика, как вы правильно заметили.

В настоящее время S / 4 SDK не предлагает универсального способа выполнения кода от имени другого арендатора.Это в основном связано с тем, что информация об арендаторах по-разному представлена ​​в средах SAP CP.Например, в Cloud Foundry арендатор кодируется как часть поля «zid» в веб-токене JSON.Поэтому сложно запускать код от имени разных арендаторов.Таким образом, в SAP CP Cloud Foundry у вас фактически не было бы этого запасного варианта для арендатора поставщика.

Тем не менее, для SAP CP Neo, я ожидаю, что вы сможете использовать следующий подход для запускаCallable на основе контекста другого арендатора.Затем это должно позволить вам получить текущего арендатора, как и предполагалось, в контексте соответствующего Callable.

ScpNeoTenant currentTenant = (ScpNeoTenant)TenantAccessor.getCurrentTenant();
TenantContext currentTenantContext = currentTenant.getTenantContext();

currentTenantContext.execute("anotherTenantId", new Callable<MyResult>() {
    @Override
    public MyResult call() {
        return new RequestContextExecutor().execute(new Callable<MyResult>() {
            @Override
            public MyResult call() {
                Tenant tenant = TenantAccessor.getCurrentTenant();
                // ...
                return myResult;
            }
        });
    }
});

Я еще не проверял это, поэтому, пожалуйста, дайте мне знать, если это работает!

...