我刚刚进入Spring(和Java),尽管进行了大量研究,但我似乎甚至无法表达我正在尝试做的事情。我只是解释一下这个任务,希望有人可以指出我正确的春季术语。
我正在编写一个Spring-WS应用程序,它将充当两个API之间的中间件。它接收SOAP请求,执行一些业务逻辑,调用外部XML API,并返回SOAP响应。但外部API很奇怪。我必须在各种情况下执行“服务发现”(进行一些API调用以确定有效的端点 - XML请求中的参数)(自上次请求以来超过X小时,超过自上次发现以来的Y请求等) )。
我的想法是,我可以有一个类/ bean /无论什么(不确定最好的术语)可以在后台处理所有这些服务发现的东西。然后,请求处理程序可以查询此“事物”以获取有效端点,而无需执行自己的发现并减慢请求处理速度。 (服务发现只需要很少重新执行,因此对每个请求都有效。)
我以为我已经找到了单例bean的答案,但是每个资源都说那些不应该有状态和并发将是一个问题 - 这两个都会扼杀这个想法。
如何创建可以的“某事”实例:
1)以定义的间隔唤醒并运行一个方法(即检查是否需要在X小时后执行服务发现,如果是的话)。
2)提供类似getter方法的东西,可以返回一些字符串。
3)在#2中提供一种在后台执行方法而不延迟return
的方法(基本上检测到实例属性超过了值并执行 - 或者我想,发出执行请求 - 实例方法)。
我有多线程编程经验,使用线程和互斥锁没有问题。我只是不确定这是春天的正确方法。
答案 0 :(得分:1)
MyEndpointDiscoveryResults
来保存发现结果(例如,端点地址或与SOAP使用者相关的任何其他信息)。MyEndpointDiscoveryService
。AtomicReference<MyEndpointDiscoveryResults>
(甚至只是一个普通的易变变量)。这将确保所有线程都看到更新的结果,同时将它们限制为包含不可变对象的单个原子更新字段,这限制了并发交互的范围。@Scheduled
或其他机制运行适当的发现协议。如果有更新,请构造整个结果对象,然后将其保存到更新的字段中。