Получение проблемы параллелизма в реализации

Уровень пакета

ПМ.бал

public type PM object {

    public isolated function methodA(json config) returns error|http:Response;
    public isolated function methodB(json config) returns error|http:Response;
    public isolated function methodC(json config) returns sql:Client|error;
};

DefaultImplPM.bal

public class DefaultImplPM {
    *PM;
   
    public isolated function methodC(json config) returns sql:Client|error {
        return  new mysql:Client("dbConfig.host", "dbConfig.username", "dbConfig.password", "dbConfig.database");
    }

    public isolated function methodA(json config) returns error|http:Response {
        http:Response response = new;
        response.setJsonPayload("Default methodA is not implemented yet");
        return response;
    }

    public isolated function methodB( json config) returns error|http:Response {
        http:Response response = new;
        response.setJsonPayload("Default methodB is not implemented yet");
        return response;
    }
}

Уровень обслуживания

новыйImpl.bal

import package as pkg;
public class NewImplPM {
    *pkg:PM;
   
    public isolated function methodC(json config) returns sql:Client|error {
        return  new mysql:Client("dbConfig.host", "dbConfig.username", "dbConfig.password", "dbConfig.database");
    }

    public isolated function methodA(json config) returns error|http:Response {
        http:Response response = new;
        response.setJsonPayload("new methodA is not implemented yet");
        return response;
    }

    public isolated function methodB(json config) returns error|http:Response {
        http:Response response = new;
        response.setJsonPayload("new methodB is not implemented yet");
        return response;
    }
}

на вооружении.бал

import package as pkg;

service /fr on new http:Listener(9090) {

    pkg:PM pmVariable;
    public function init() {
        self.pmVariable = new DefaultImplPM();
    }


    resource isolated function post methodD(string c) returns error|http:Response {
        return self.pmVariable.methodA(c);   
    }

    resource isolated function post methodE(string c) returns error|http:Response {
        return self.pmVariable.methodB(c);
    }
}

У меня есть несколько абстрактных методов для варианта использования, которые могут иметь несколько разных типов реализации для этих методов. Я хочу дать базовую реализацию на уровне пакета балерины. Это будет мой алгоритм по умолчанию. Когда кто-то хочет оказать дополнительную поддержку с реализацией нового алгоритма на уровне обслуживания. Он/она должен иметь возможность сделать это, включив мой интерфейс и реализовав эти методы.

С этой реализацией я получил предупреждение concurrent calls will not be made to this method since the service is not an 'isolated' service. Как это решить.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как указано в предупреждении, это связано с тем, что объект службы не является isolated (и не соответствует требованиям для isolated объекта, который должен быть выведен как один). Параллельные вызовы метода ресурса будут выполняться только в том случае, если и объект, и метод являются isolated. Если объект не isolated, все еще может быть небезопасный доступ к изменяемому состоянию.

См. безопасность параллелизма , в частности изолированные объекты.

Этот сервис не выводится как isolated, поскольку он имеет нечастное изменяемое поле (к которому также нет доступа в блокировках, он не соответствует условиям ввода/вывода передачи для объекта isolated и т. д.).

Вы можете явно пометить объявление службы, чтобы определить и исправить то, что делает ее неизолированной.

isolated service /fr on new http:Listener(9090) {
    ...
}

Как правило, вам придется либо

  1. сделать PM изолированный объект и pmVariable поле final или
  2. сделать pmVariable приватным полем и использовать блокировки при доступе к нему и внести соответствующие изменения (чтобы убедиться, что объект является изолированным корнем)

Я попробовал ваше первое предложение make PM an isolated object and pmVariable a final field. Это работает. Спасибо.

Thenusan Santhirakumar 14.06.2023 10:30

Другие вопросы по теме