我和一位同事讨论了单例会话bean中的并发管理问题.根据我的理解,在阅读Oracle文档后,如果@ConcurrencyManagement省略注释,则默认为容器管理的并发.在文档中,它说明了有关容器管理的单例会话bean的以下内容:
javax.ejb.Lock注释和javax.ejb.LockType类型用于指定单例的业务方法或@Timeout方法的访问级别.
和
如果单例类中不存在@Lock批注,则默认锁定类型@Lock(LockType.WRITE)将应用于所有业务和超时方法.
现在,如果您使用bean注释bean @ConcurrencyManagement(ConcurrencyManagementType.BEAN),那么您有责任确保使用synchronized关键字和其他标准Java并发功能在所有客户端之间同步bean的状态.文章甚至说:
允许使用bean管理的并发创建单例的开发人员使用Java编程语言同步原语(例如同步和volatile)来防止并发访问期间的错误.
我没有在容器管理并发部分的任何地方看到这一点,这让我相信如果你想自己同步事物,你需要用它来注释类@ConcurrencyManagement(ConcurrencyManagementType.BEAN).
我的同事做了一个评论,说"当你在我的豆子上看到这个注释时,你们做了一些奇怪的东西",这开始了这个讨论.
他的豆子都没有任何@ConcurrencyManagement注释,但他在synchronized整个班级中都使用了关键词.我是否正确地说他正在使用的任何更细粒度的同步都是毫无意义的,因为他的所有商业方法都有隐含的@Lock(LockType.WRITE)注释?这意味着如果客户端调用他的一个方法,那么没有其他客户端可以调用bean的任何方法,因此方法中的显式同步将是无用的.
例如,对于在其中一个业务方法中myLock使用的某些锁synchronized (myLock),由于这些方法本身有效地同步,因此不存在对该锁的争用.
如果我错了,请纠正我,但看起来他的方法基本上是这样的:
public synchronized void myMethod() {
// do stuff
synchronized (lock) {
// modify mutable state
}
}
public synchronized void myOtherMethod() {
// do other stuff
synchronized (lock) {
// modify mutable state
}
}
Run Code Online (Sandbox Code Playgroud)
假设lock在这个单例会话bean中创建它只是为了保护bean中的可变状态,它似乎在使用容器管理的并发时不起任何作用.
提前感谢您对此有任何见解!
有人可以向我解释如何在 Linux(特别是 Ubuntu)中继承目录权限吗?
例如,如果我有以下目录结构怎么办:
folder_A
folder_B
Run Code Online (Sandbox Code Playgroud)
folder_A 的权限是否总是覆盖 folder_B 的权限?如果folder_A 的权限比folder_B 的权限更严格,反之亦然,这有什么区别吗?
我的猜测是,如果 folder_B 具有更多限制性权限,它将覆盖 folder_A,但如果 folder_A 具有更多限制性权限,那么它将覆盖其子项。
我目前正在使用 Maven 的 Apache CXF 代码生成插件(版本 3.1.1)从我们的客户端提供的 WSDL 生成源代码。我指定了 wsdl2java 目标,并且我想为多个服务生成代码。我知道您可以<serviceName>在<wsdlOption>标签下指定 a ,但是当我尝试放置多个<serviceName>,或者甚至<wsdlOption>使用<wsdl>具有不同的相同值创建另一个时<serviceName>,它似乎忽略其中一个,而只为一项服务生成类。
我发现解决此问题的唯一方法是创建另一个相同的<execution>块并更改<serviceName>. 我做错了什么,或者这是唯一的方法吗?这是一个的整体设置<execution>(出于隐私考虑,路径和服务名称已更改):
<execution>
<id>generate-sources-a</id>
<phase>generate-sources</phase>
<configuration>
<encoding>UTF-8</encoding>
<defaultOptions>
<bindingFiles>
<bindingFile>binding.xjb</bindingFile>
</bindingFiles>
</defaultOptions>
<sourceRoot>${project.build.directory}/generated-sources</sourceRoot>
<wsdlRoot>${project.build.directory}/wsdl</wsdlRoot>
<includes>
<include>Path/To/WSDL/MyWSDL.wsdl</include>
</includes>
<wsdlOptions>
<wsdlOption>
<wsdl>${project.build.directory}/wsdl/Path/To/WSDL/MyWSDL.wsdl</wsdl>
<serviceName>ServiceA</serviceName>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals>
<goal>wsdl2java</goal>
</goals>
</execution>
Run Code Online (Sandbox Code Playgroud)
我试过这两个:
<wsdlOptions>
<wsdlOption>
<wsdl>${project.build.directory}/wsdl/Path/To/WSDL/MyWSDL.wsdl</wsdl>
<serviceName>ServiceA</serviceName>
<serviceName>ServiceB</serviceName>
</wsdlOption>
</wsdlOptions>
Run Code Online (Sandbox Code Playgroud)
...和这个(在http://cxf.apache.org/docs/maven-cxf-codegen-plugin-wsdl-to-java.html 的示例 4 中使用):
<wsdlOptions>
<wsdlOption>
<wsdl>${project.build.directory}/wsdl/Path/To/WSDL/MyWSDL.wsdl</wsdl>
<serviceName>ServiceA</serviceName>
</wsdlOption>
<wsdlOption>
<wsdl>${project.build.directory}/wsdl/Path/To/WSDL/MyWSDL.wsdl</wsdl> …Run Code Online (Sandbox Code Playgroud)