繁体   English   中英

无状态EJB使用EJB Schedule保持状态

[英]Stateless EJB keeping state using EJB Schedule

我在EJB Stateless上使用JBoss AS 7和Schedule方法。 我的问题是,即使EJB也是无状态的,它也保持其状态,这给我带来了麻烦。 这是示例:

计时器:

@Stateless
public class TestTimer {

    @Inject HelloWorldService helloWorld;

    @SuppressWarnings("unused")
    @Schedule(second="*/10", minute="*", hour="*", info="MyTimer")
    private void execute() {
        System.out.println(helloWorld.sayHello());
        System.out.println(this.toString() + " "+ helloWorld.toString());
    }
}

注入的HelloWorldService:

public class HelloWorldService {

    public String sayHello() {
        return "Hello World!";
    }
}

我期望这行System.out.println(this.toString() + " "+ helloWorld.toString()); 每次计时器运行时都会打印一个不同的时间,因为每次都将是一个新的TestTimer实例,但是我错了:

16:43:50,003 INFO  [stdout] (EJB default - 3) foo.service.TestTimer@4a56936f foo.service.HelloWorldService@79e98289
16:44:40,022 INFO  [stdout] (EJB default - 1) foo.service.TestTimer@4a56936f foo.service.HelloWorldService@79e98289

我是在做错什么,这是预期的行为,还是什么?

EJB规范没有声明无状态bean在每次调用后会丢弃其状态。 它指出应用程序开发人员一定不能依赖Bean 保持其状态。 有一个细微但非常重要的区别。 同一bean实例可以多次使用。 这不会否定无国籍状态。

重要的是每个计时器都有一个查找,您可能会得到一个不同的Bean实例。
,但“可能”表示您仍可能获得相同的实例,因为它是从一个豆池中获得的
容器为您管理。
使用相同的计时器对象没有错,
只要它提供适当的功能。
这意味着作为开发人员,您不能对Bean的状态做任何假设,并且是否可以在重新查找Bean时恢复它的状态。

无状态bean可以根据需要多次使用。 它们并非每次都是必要的。 您可以在http://docs.oracle.com/javaee/6/tutorial/doc/giplj.html上查看EJB LifeCycle。

这是预期的行为(根据Java EE规范),实际上比这要复杂一些。

应用服务器正在管理一个无会话会话bean池,并使用该池中的实例来处理客户端请求。 如果服务器上有一些负载,则池中将使用几个bean,每个bean都有自己的状态。 因此,在测试中,有时会打印出相同的字符串值,有时会打印出另一个字符串值。

您不应将属性用于业务逻辑。 但是,出于技术目的使用属性(例如,保留对数据库的引用)有时是个好主意。

容器有一个无状态会话bean池。 它在容器内部以处理活动实例的数量(据我所知)。对于您而言,似乎计时器调用了同一实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM