Уровень пакета
ПМ.бал
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. Как это решить.





Как указано в предупреждении, это связано с тем, что объект службы не является isolated (и не соответствует требованиям для isolated объекта, который должен быть выведен как один). Параллельные вызовы метода ресурса будут выполняться только в том случае, если и объект, и метод являются isolated. Если объект не isolated, все еще может быть небезопасный доступ к изменяемому состоянию.
См. безопасность параллелизма , в частности изолированные объекты.
Этот сервис не выводится как isolated, поскольку он имеет нечастное изменяемое поле (к которому также нет доступа в блокировках, он не соответствует условиям ввода/вывода передачи для объекта isolated и т. д.).
Вы можете явно пометить объявление службы, чтобы определить и исправить то, что делает ее неизолированной.
isolated service /fr on new http:Listener(9090) {
...
}
Как правило, вам придется либо
PM изолированный объект и pmVariable поле final илиpmVariable приватным полем и использовать блокировки при доступе к нему и внести соответствующие изменения (чтобы убедиться, что объект является изолированным корнем)
Я попробовал ваше первое предложение
make PM an isolated object and pmVariable a final field. Это работает. Спасибо.