当前位置: 首页 > 知识库问答 >
问题:

“非托管”实用程序类的并发访问和缩放

权弘新
2023-03-14

如果我有一个有状态类,它需要像无状态类这样的实用程序来对其执行操作。这些有状态类保存在容器(有状态)类的列表中。这就是我对纯Java所做的:

class Container {
    List<Stateful> sfList;
}

class Stateful {

    List<String> list;

    void someMethod() {
        list.add("SF");
        Stateless.foo(this);
}

class Stateless {
    public static void foo(Stateful sf) {
        sf.getList().add("SL");
    }
}

main里面是这样的过程:

Stateful sf = new Stateful();
sfList.add(sf);
sf.someMethod();

现在有了JavaEE CDI,我会做:

class StatefulBean {

    List<String> list;

    @Inject
    StatelessBean slsb;

    void someMethod() {
        list.add("SF");
        slsb.add(this);
}

@Stateless
class StatelessBean {
    public void add(StatefulBean sfsb) {
        sfsb.add("SL");
    }
}

在这种情况下,所有StatefulBean都可以访问无状态Bean的共享池,而不会出现并发问题,并且可以根据请求进行适当的扩展。

然而,由于Stateful不是托管bean,我无法将其注入,因此我使用了实用程序类。此外,我正在使用构造函数创建有状态的,所以我不能向其中注入无状态bean(我将使用它获得一个NPE)。

我的问题是:

  • 无状态注入方法(只要可行)和实用类方法之间是否存在并发性和可伸缩性差异
  • 如何使EE注入方法起作用

共有1个答案

卞俊贤
2023-03-14

无状态注入方法(如果它能工作)和实用程序类方法之间是否存在并发和可伸缩性差异?

是的,有,主要是围绕管理的丢失。在每次调用方法时实例化Stat的方式,不涉及池。这将导致您创建比您可能需要的更多的实例。

另一个损失是在可扩展性方面。当容器将在分布式环境中管理有状态bean的钝化和激活时,手动方法将确保您管理自己的激活和钝化。

因为静态不是托管bean...

不准确的根据CDI规范,任何满足所列条件的java类(在您的例子中,默认的无参数构造函数)都是托管bean。这意味着您可以将无状态bean注入到无状态中,容器会满足您的要求。要允许这种级别的管理,需要在bean中设置bean发现模式=all。xml。

即使使用(显然不必要的)循环引用,正常Java并发规则也适用:只要您正在操作的状态不是静态的或在静态类中,您就是线程安全的。每个对该静态方法的线程调用仍然在单独的堆栈上运行,因此没有问题。

如何使EE注入方法起作用?如果需要按需实例化无状态(或任何其他bean),请使用CDI实例以编程方式获取所需任何类的托管实例。现在,您可以将类似的内容添加到容器中

@Inject @Dependent Instance<Stateful> stateful;

    @PostConstruct
     public void createStateless(){
         //instantiate sfList;
         sfList.add(stateful.get()); //execute as many times as you need
     }
 类似资料:
  • 我用的是Spring Boot和JPA。就在这里 我有一个类似的域。而且注释似乎不建议使用,所以我使用代替。 我的类如下所示 类看起来像这样 使用这个类的看起来像这样 但当我开始应用程序我得到这个错误: 到底是什么问题?

  • 我部署了一个Neo4j非托管扩展。可以使用REST客户端调用非托管扩展并成功返回结果。问题是,当我尝试从另一个java类调用/调用非托管扩展时,它会继续抛出未经授权的401。 我使用Spring RestTemboard来调用非托管扩展。 我的代码: 完全错误:

  • 当我运行我的应用程序时,我收到一个错误。 应用程序结构 结构 pom.xml RestartApplication.java MvcConfig WebSecurityConfig 身份验证控制器(显示欢迎页面) 博客控制器 主控制器 注册控制器 邮政 角色 用户 后存储库 用户报告 我试图使用@EnableJpaRepositories和@EntityScan修复它,但这无济于事。在我的MySQ

  • 问题内容: 我正在JavaFX中为大型Java项目构建GUI。这个项目有许多不同的工作线程在后台执行一些繁重的计算,我试图在GUI中可视化这些工作线程的进度。所谓进步,是指不仅是裸露的百分比,而且是Task类中未包含的其他变量,例如: 当前文件 当前错误计数 到目前为止读取的字节数 … 由于这些进度变量的变化非常快,并且由于必须从JavaFX线程(Platform.runLater())执行GUI

  • 本文向大家介绍详解C# 托管资源和非托管资源,包括了详解C# 托管资源和非托管资源的使用技巧和注意事项,需要的朋友参考一下 托管资源指的是.NET可以自动进行回收的资源,主要是指托管堆上分配的内存资源。托管资源的回收工作是不需要人工干预的,有.NET运行库在合适调用垃圾回收器进行回收。 非托管资源指的是.NET不知道如何回收的资源,最常见的一类非托管资源是包装操作系统资源的对象,例如文件,窗口,网

  • 这个 sqlalchemy.sql.visitors 模块由类和函数组成,它们通常用于 穿越 核心SQL表达式结构。不像 Python ast 其中的模块提供了一个系统,通过该系统,程序可以对SQL表达式的每个组件进行操作。它的共同目的是定位各种元素,例如 Table 或 BindParameter 对象,以及改变结构的状态,例如用其他子句替换某些FROM子句。 注解 这个 sqlalchemy.