小编Eva*_*urd的帖子

管理Singleton会话Bean中的并发访问

我和一位同事讨论了单例会话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中的可变状态,它似乎在使用容器管理的并发时不起任何作用.

提前感谢您对此有任何见解!

concurrency singleton multithreading ejb java-ee

7
推荐指数
1
解决办法
2069
查看次数

Linux目录权限继承

有人可以向我解释如何在 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 具有更多限制性权限,那么它将覆盖其子项。

linux directory ubuntu file-permissions folder-permissions

5
推荐指数
2
解决办法
8194
查看次数

如何在一次执行下使用适用于 Maven 的 Apache CXF 代码生成插件为多个服务生成源

我目前正在使用 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)

java wsdl2java pom.xml maven cxf-codegen-plugin

5
推荐指数
1
解决办法
1456
查看次数