【问题标题】:How to do many simultaneous jsoup sessions (Spring boot project and concurrancy)如何同时进行多个 jsoup 会话(Spring Boot 项目和并发)
【发布时间】:2015-06-08 15:43:32
【问题描述】:

也许这是一个非常基本的 Java 问题。如果是的话请见谅。

我有这个 Spring Boot 项目,对于每个注册用户,它需要自动(在后台)定期连接到网站并下载许多文档和/或检查更改。

“下载/检查”系统是外部开发的。每个方法都是静态的。

当我想要同时执行多个操作时,我是否认为这是一个问题? 即使它通过参数有所有具体的连接参数?

考虑到这一点,我几乎删除了每个方法上的静态注释。现在我需要为每次执行创建一个新实例。

当我开始将它添加到我的 Spring boot 项目时,我意识到有很多服务可以同时连接到 Web 服务,而我什至不关心并发性。

AFAIK,每个服务都是一个单例。对?因此,每个连接都没有新实例。对吧?

我的问题是:如果我碰巧有 100 个用户......我应该如何集成 jsoup 代码?

  1. 我应该从服务创建一个新实例吗?
  2. 我应该将其转换为服务本身,然后将其@Autowire 转换为触发流程的服务吗?
  3. 将其设为静态会更好吗? (这个我不这么认为,但也许我错了)
  4. 还有其他选择吗?

如果可能,请说明我应该遵循您的建议的原因。

感谢大家的帮助。

【问题讨论】:

    标签: java spring performance concurrency spring-boot


    【解决方案1】:

    首先我想说,如果你的类没有保持任何状态,那么如果一切都是静态的,这实际上是一件好事,因为这让你更接近函数式编程。如果您将所有内容作为参数传递给方法并且在类(不是方法)中没有任何状态,那么所有内容都保存在堆栈中,线程之间不共享。长话短说:线程安全。

    如果您在类中维护任何类型的状态(无论是服务还是组件),那么您必须确保它们以线程安全的方式执行。最简单的方法之一是将特定 bean 的 @Scope 更改为原型或例如请求,因为您将其作为 Web 应用程序运行。

    【讨论】:

    • 当主静态方法 (1) 被调用时,它会创建一个 Map 并调用其他一些静态方法(2、3 等),将该映射作为参数传递。这些方法(2、3 等)返回一些其他对象,而不是那个映射。例如,有时该映射会在方法 2 中更新,这些更改稍后会在方法 3 中使用。如果同时执行多次,使用它仍然安全吗?我说清楚了吗?
    • 在这种情况下,您正在更改类本身的状态。因此,您应该注意隔离呼叫。通过使静态的所有内容都变为非静态并使用原型 Scope 或通过同步调用以使其线程安全。
    • 只是为了确定:即使地图是在方法1的主体中创建的,也需要使用原型Scope或同步?
    • 正如我在您上次评论中所理解的,方法 2 是更改地图,然后是的。
    猜你喜欢
    • 2016-09-29
    • 1970-01-01
    • 2017-02-02
    • 2022-01-25
    • 2018-05-21
    • 1970-01-01
    • 2021-03-06
    • 2010-12-15
    • 1970-01-01
    相关资源
    最近更新 更多