gpt4 book ai didi

java - Spring中的全局资源对象

转载 作者:行者123 更新时间:2023-12-01 10:29:06 25 4
gpt4 key购买 nike

我刚刚开始接触 Spring(和 Java),尽管进行了大量研究,但我似乎甚至无法表达我想要做的事情的术语。我只是解释一下这个任务,希望有人能给我指出正确的 Spring 术语。

我正在编写一个 Spring-WS 应用程序,它将充当两个 API 之间的中间件。它接收 SOAP 请求,执行一些业务逻辑,调用外部 XML API,然后返回 SOAP 响应。不过,外部 API 很奇怪。我必须在各种情况下(自上次请求以来超过 X 小时、自上次发现以来超过 Y 个请求等)执行“服务发现”(进行一些 API 调用来确定有效端点 - XML 请求中的参数) .)。

我的想法是,我可以有一个类/bean/任何东西(不确定最好的术语),可以在后台处理所有这些服务发现内容。然后,请求处理程序可以查询此“事物”以获取有效端点,而无需执行自己的发现并减慢请求处理速度。 (服务发现很少需要重新执行,因此对每个请求都执行一次会产生影响。)

我以为我已经找到了单例 bean 的答案,但每个资源都说这些不应该有状态,并发性将成为一个问题——这两者都扼杀了这个想法。

我如何创建一个“东西”的实例,它可以:

1)按照定义的时间间隔唤醒并运行一个方法(即检查 X 小时后是否需要执行服务发现,如果需要则执行)。

2) 提供类似于 getter 方法的东西,可以返回一些字符串。

3) 在 #2 中提供一种在后台执行方法而不延迟返回的方法(基本上检测实例属性超出值并执行——或者我想,发出一个请求执行——一个实例方法)。

我有多线程编程经验,并且使用线程和互斥体没有问题。我只是不确定这是否是 Spring 的正确方法。

最佳答案

由于多线程问题,单例理想情况下不应该有状态。然而,听起来您所描述的本质上是一个定期查询,它返回一个描述发现机制结果的对象,并且您正在实现一个缓存。这是我的建议:

  • 创建一个不可变(值)对象 MyEndpointDiscoveryResults保存发现结果(例如端点地址或与 SOAP 使用者相关的任何其他信息)。
  • 创建一个单例 Spring bean MyEndpointDiscoveryService .
  • 在发现服务上,保存 AtomicReference<MyEndpointDiscoveryResults> (或者甚至只是一个简单的 volatile 变量)。这将确保所有线程都能看到更新的结果,同时将它们限制为包含不可变对象(immutable对象)的单个原子更新字段,从而限制了并发交互的范围。
  • 使用@Scheduled或运行适当的发现协议(protocol)的另一种机制。当有更新时,构造整个结果对象,然后将其保存到更新的字段中。

关于java - Spring中的全局资源对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35192409/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com