gpt4 book ai didi

grails - 有状态与无状态服务 Grails

转载 作者:行者123 更新时间:2023-12-04 23:50:26 27 4
gpt4 key购买 nike

当我掉进 grails 服务的兔子洞时,我目前正在将业务逻辑从 Controller 方法转移到服务。我的服务中有以下方法:

Job closeJobOpportunity(Job op, Employee res) {
op.chosenOne = res
op.requisitionCanceledDate = new Date()
if(!op.chosenOne || !op.hrEffectiveDate){
return null
}
else if(StringUtils.isEmpty(op.chosenOne.id)){
return null
}
return op
}

我开始考虑这种方法可能导致同步问题的不同方式(因为 grails 使服务成为单例),并注意到 grails 文档提到只要您 就应该将业务逻辑放入服务中。不存储状态 .

冒着听起来无知或消息灵通的风险,有人可以简单地提供 Grails 中有状态和无状态服务之间的区别吗?上面的方法是有状态的吗?那么它是否应该被 Controller 中的 try catch 包围?

最佳答案

Grails 服务(或与此相关的类的任何其他实例)中的有状态和无状态之间的区别取决于该实例本身是否具有任何状态。

首先,很难说您的示例中的 Service 是否是无状态的,但是您在该特定方法中的交互并不表明您正在对服务本身进行任何有状态的操作。这会让我相信该服务将是无状态的。

让我给你一个有状态服务的例子,并解释为什么它是有状态的。

class MyStatefulService {
Long someNumber
String someString

void doSomething(Long addMe) {
someNumber += addMe
}

void updateSomething(String newValue) {
someString = newValue
}
}

如您所见,上述服务有两个属性。如果此服务创建为单例,则对其的所有调用都将使用相同的单个实例。正如您所看到的,服务上的两个方法会影响服务的属性或状态。这意味着,在当前形式中,您无法确保在特定线程执行服务的一个或多个方法时状态不会改变。使其不可靠,以目前的形式。虽然这是一个非常简单的示例,但它确实演示了使服务有状态的原因。

服务拥有属性是可以的,而且通常是这样。它们可以是对其他服务甚至配置值的引用。关键概念是确保它们不会改变状态(总是有异常(exception),但它们是边缘情况)。

完全有可能将服务重写为有状态、同步等,以避免多线程访问和修改状态的陷阱,但这不是您应该做的事情。无状态服务更简单、更干净、更易于测试、更易于调试且更轻量级。

简而言之,让您的服务无状态并省去麻烦。

关于grails - 有状态与无状态服务 Grails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23687411/

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