Java @EJB中的异步私有方法

Java @EJB中的异步私有方法,java,jakarta-ee,glassfish,ejb,ejb-3.1,Java,Jakarta Ee,Glassfish,Ejb,Ejb 3.1,我的EJB单例中有一个异步方法,它是从同一类中的另一个方法调用的。我已经知道我不能直接调用异步方法,我必须获得一个EJB代理。问题是,我不希望异步方法在类外可见;但当我将其设置为私有时,它不会异步执行。(我使用的是Glassfish v3。) 不要说任何关于所需访问级别的内容。那么这应该被认为是Glassfish中的一个bug吗?方法注释不能在私有方法中使用。当Glassfish编译EJB时,它基本上会将注释转换为一段代码,该代码将在代理中围绕您的代码。如果您的方法是私有的,它将绕过创建的代理G

我的EJB单例中有一个异步方法,它是从同一类中的另一个方法调用的。我已经知道我不能直接调用异步方法,我必须获得一个EJB代理。问题是,我不希望异步方法在类外可见;但当我将其设置为私有时,它不会异步执行。(我使用的是Glassfish v3。)


不要说任何关于所需访问级别的内容。那么这应该被认为是Glassfish中的一个bug吗?

方法注释不能在私有方法中使用。当Glassfish编译EJB时,它基本上会将注释转换为一段代码,该代码将在代理中围绕您的代码。如果您的方法是私有的,它将绕过创建的代理Glassfish。。。因此,在您的案例中,我建议使用异步方法创建一个新的EJB,并将其注入当前EJB中,这是一个非常有趣的反馈。我能看出你所做的事情的价值。尝试将bean标记为
@LocalBean
,并将
@Asynchronous
方法注释为
受保护的

由于
@LocalBean
支持基本上是通过对bean类进行子类化(动态或静态)来实现的,因此容器实际上不可能重写
private
方法。但我可以肯定地看到您的用例。如果
protected
方法不起作用,我们可能可以将其作为对EJB.next的增强


仍然可以访问同一个包中的其他bean,但它至少不那么公开。我经常希望Java有一个“仅子类”的作用域。我几乎从未使用过受保护的
,我想,“太好了,现在我包中的每个人都可以访问它了。”

好吧,但为什么?您的意思是代理对象将只具有公共方法的代理。这实际上是JavaEE规范所要求的,还是仅仅是一个Glassfish实现的细节?它只是一个Glassfish实现,但是看看waht Javadoc说的“用于将一个方法标记为异步方法,或者将一个类或接口的所有业务方法指定为异步的”业务方法是其他人可以使用的方法。私有方法不进来。EE规范要求只能使用公共方法。否则,容器将无法为私有方法创建代理,除非AOP/WIVING。您试图调用私有方法这一事实意味着您没有正确地调用业务方法,您只是调用本地方法。将其标记为protected并不能真正实现我想要的,但感谢您的建议。对于下一版本的EJB来说,这可能是一个很好的补充;如果做不到这一点,如果文档只是简单地解释了这种事情是行不通的,那就太好了。我同意“仅子类作用域”的观点。