英文:
Getting Concurrency Issue in Implementation
问题
抱歉,您提到的代码部分不需要翻译。要解决"concurrent calls will not be made to this method since the service is not an 'isolated' service"警告,您需要将服务标记为“isolated”。
在您的服务定义中,例如,在service /fr on new http:Listener(9090)
之前,您可以添加isolated
修饰符,如下所示:
isolated service /fr on new http:Listener(9090) {
// ...
}
这样,您的服务将被标记为“isolated”,并且可以处理并发调用,从而解决了该警告。
英文:
Package Level
PM.bal
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;
}
}
Service level
newImpl.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;
}
}
in service.bal
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);
}
}
I have some abstract methods for a use case which may have multiple different types of implementation for those methods. I want to given an basic implementation in a ballerina package level. That will be my default algorithm. When some one wants to give some additional support with a new algorithm implementation in service level. He/She should be able to do it by including my interface and implement those methods.
With this implementation, I got concurrent calls will not be made to this method since the service is not an 'isolated' service
warning. How to resolve this.
答案1
得分: 1
根据警告显示的信息,这是因为服务对象不是“隔离的”(也不符合将“隔离”对象推断为隔离对象的要求)。只有在对象和方法都是“隔离的”时,才会对资源方法进行并发调用。如果对象不是“隔离的”,仍可能存在对可变状态的不安全访问。
此服务未被推断为“隔离的”,因为它具有非私有的可变字段(该字段也未在锁中访问,不满足“隔离”对象的传递条件等)。
您可以显式标记服务声明以确定并修复导致其不隔离的原因。
隔离服务 /fr 使用新的 http:Listener(9090) {
...
}
通常,您需要要么
- 将
PM
标记为隔离对象并将pmVariable
标记为final
字段,或者 - 将
pmVariable
标记为私有字段,并在访问时使用锁,并引入相关更改(以确保该对象是隔离根)。
英文:
As indicated by the warning, this is because the service object is not isolated
(nor does it meet the requirements for an isolated
object to be inferred as one). Concurrent calls will be made to a resource method only if both the object and the method are isolated
. If the object is not isolated
, there can still be unsafe access of mutable state.
See concurrency safety, specifically isolated objects.
This service is not inferred as isolated
since it has a non-private mutable field (which is also not accessed within locks, does not meet transfer in/out conditions for an isolated
object, etc.).
You can explicitly mark the service declaration to identify and fix what's causing it to be non-isolated.
isolated service /fr on new http:Listener(9090) {
...
}
Generally, you would either have to
- make
PM
an isolated object andpmVariable
afinal
field or - make
pmVariable
a private field and use locks when accessing it and introduce related changes (to ensure that the object is an isolated root)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论