删除 ExecControl 以升级到 Ratpack v1.1.1?
Removing ExecControl to upgrade to Ratpack v1.1.1?
我正在学习 Ratpack 并利用多种资源进行工作。我有以下界面和 class 在 Ratpack v0.9.18 中工作但在 v1.1.1 中失败,因为删除了 ExecControl 界面。
//file: src/main/groovy/app/UserService.groovy
package app
import ratpack.exec.Promise
interface UserService {
Promise<Void> save (User user)
Promise<List<User>> getUsers ()
}
//file: src/main/groovy/app/DefaultUserService.groovy
package app
import ratpack.exec.ExecControl
import ratpack.exec.Promise
class DefaultUserService implements UserService {
private final List storage = []
@Override
Promise<Void> save (User user) {
storage << user
ExecControl.current ().promiseOf (null)
}
@Override
Promise<List<User>> getUsers () {
ExecControl.current ().promiseOf (storage)
}
}
我认为用 ExecControl 更改行:
Promise.of (storage)
可以,但会导致
MissingMethodException: No signature of method: static ratpack.exec.Promise.of() is applicable for argument types: (java.util.ArrayList).
Promise.of () 方法需要 ratpack.exec.Upstream 类型。
如何修改上述 DefaultUserService class 以与 Ratpack v1.1.1 一起使用?
Promise.of(Upstream)
http://ratpack.io/manual/current/api/ratpack/exec/Promise.html#of-ratpack.exec.Upstream- is a way to signal the result of some process to downstream consumers. You can signal whether or not something completed successfully via Downstream#error(Throwable)
or Downstream#success(value)
http://ratpack.io/manual/current/api/ratpack/exec/Downstream.html
您还可以通过 Promise.value(value)
从已知值创建 Promise
除了 Promise
Ratpack 还提供 ratpack.exec.Operation
,它类似于 Promise<Void>
,因为它代表没有 return 类型的异步工作。
我整理了一个示例来演示创建异步工作表示的各种方法。
@Grab('io.ratpack:ratpack-groovy:1.1.1')
import ratpack.exec.Operation
import ratpack.exec.Promise
import ratpack.handling.Context
import ratpack.jackson.Jackson
import static ratpack.groovy.Groovy.ratpack
class User { String name }
class UserService {
private final List<User> storage = []
Operation save(User user) {
storage << user
Operation.noop()
}
Promise<List<User>> getUsers() {
Promise.of { downstream -> downstream.success(storage) }
// or
// Promise.value(storage)
}
}
ratpack {
bindings {
bindInstance new UserService()
}
handlers {
get { Context ctx, UserService userService ->
userService.getUsers()
.map(Jackson.&json)
.then(ctx.&render)
}
get('add/:name') { UserService userService ->
userService.save(new User(name: pathTokens.get('name')))
.then { render 'User saved' }
}
}
}
以下是我针对此执行的一些示例 curl 命令:
$ curl localhost:5050
[]
$ curl localhost:5050/add/dan
User saved
$ curl localhost:5050/
[{"name":"dan"}]
$ curl localhost:5050/add/luke
User saved
$ curl localhost:5050/
[{"name":"dan"},{"name":"luke"}]
我正在学习 Ratpack 并利用多种资源进行工作。我有以下界面和 class 在 Ratpack v0.9.18 中工作但在 v1.1.1 中失败,因为删除了 ExecControl 界面。
//file: src/main/groovy/app/UserService.groovy
package app
import ratpack.exec.Promise
interface UserService {
Promise<Void> save (User user)
Promise<List<User>> getUsers ()
}
//file: src/main/groovy/app/DefaultUserService.groovy
package app
import ratpack.exec.ExecControl
import ratpack.exec.Promise
class DefaultUserService implements UserService {
private final List storage = []
@Override
Promise<Void> save (User user) {
storage << user
ExecControl.current ().promiseOf (null)
}
@Override
Promise<List<User>> getUsers () {
ExecControl.current ().promiseOf (storage)
}
}
我认为用 ExecControl 更改行:
Promise.of (storage)
可以,但会导致
MissingMethodException: No signature of method: static ratpack.exec.Promise.of() is applicable for argument types: (java.util.ArrayList).
Promise.of () 方法需要 ratpack.exec.Upstream 类型。
如何修改上述 DefaultUserService class 以与 Ratpack v1.1.1 一起使用?
Promise.of(Upstream)
http://ratpack.io/manual/current/api/ratpack/exec/Promise.html#of-ratpack.exec.Upstream- is a way to signal the result of some process to downstream consumers. You can signal whether or not something completed successfully via Downstream#error(Throwable)
or Downstream#success(value)
http://ratpack.io/manual/current/api/ratpack/exec/Downstream.html
您还可以通过 Promise.value(value)
Promise
除了 Promise
Ratpack 还提供 ratpack.exec.Operation
,它类似于 Promise<Void>
,因为它代表没有 return 类型的异步工作。
我整理了一个示例来演示创建异步工作表示的各种方法。
@Grab('io.ratpack:ratpack-groovy:1.1.1')
import ratpack.exec.Operation
import ratpack.exec.Promise
import ratpack.handling.Context
import ratpack.jackson.Jackson
import static ratpack.groovy.Groovy.ratpack
class User { String name }
class UserService {
private final List<User> storage = []
Operation save(User user) {
storage << user
Operation.noop()
}
Promise<List<User>> getUsers() {
Promise.of { downstream -> downstream.success(storage) }
// or
// Promise.value(storage)
}
}
ratpack {
bindings {
bindInstance new UserService()
}
handlers {
get { Context ctx, UserService userService ->
userService.getUsers()
.map(Jackson.&json)
.then(ctx.&render)
}
get('add/:name') { UserService userService ->
userService.save(new User(name: pathTokens.get('name')))
.then { render 'User saved' }
}
}
}
以下是我针对此执行的一些示例 curl 命令:
$ curl localhost:5050
[]
$ curl localhost:5050/add/dan
User saved
$ curl localhost:5050/
[{"name":"dan"}]
$ curl localhost:5050/add/luke
User saved
$ curl localhost:5050/
[{"name":"dan"},{"name":"luke"}]