【问题标题】:Write business logic with reactive database使用响应式数据库编写业务逻辑
【发布时间】:2018-09-11 14:48:37
【问题描述】:

我正在编写一个向安卓手机发送通知的反应式 API。 发送通知的过程需要从手机访问令牌代码以将消息推送给它。为此,我在服务器端创建了一个端点以从手机接收令牌。 我的问题是保存令牌,然后在上述过程中使用它。 这是 TokenController、TokenService、TokenRepository 和 Token POJO:

@RestController
@RequestMapping("/api")
public class TokenController {

    @Autowired
    private TokenService tokenService;

    @CrossOrigin
    @RequestMapping(value = "/token",
            method = RequestMethod.POST,
            consumes = MediaType.APPLICATION_JSON_VALUE,
            produces = MediaType.APPLICATION_JSON_VALUE)
    public @ResponseBody ResponseEntity<?> newToken(@RequestBody Token token) {
        return ResponseEntity.ok(tokenService.save(token));
    }
} 

//--------------------------------------------------------------- 

@Service
public class TokenServiceImpl implements TokenService {

    @Autowired
    private TokenRepository tokenRepository;

    @Override
    public Mono<Token> save(Token token) {
        return tokenRepository.save(token);
    }
}

//--------------------------------------------------------------- 

@Repository
public interface TokenRepository extends ReactiveCrudRepository<Token, Long> { }

//---------------------------------------------------------------

@Data
@Document(collection = "token")
public class Token {

    @Id
    private Long _id;

    private Long clientCode;

    private String tokenKey; // VALUE THAT IS NEEDED ON NOTIFICATION
} 

为了发送通知,我有一个需要访问数据库并查找令牌的通知控制器。阅读反应式方法我无法理解如何在通知服务中使用 TokenRepository 读取 dababase,并使用类似“findById”的方法来检索令牌。如何使用返回的 Mono 对象并获取属性“tokenKey”?

【问题讨论】:

    标签: spring mongodb reactive-programming spring-webflux


    【解决方案1】:

    您应该使用Mono&lt;ResponseEntity&lt;Token&gt;&gt; 而不是ResponseEntity&lt;Mono&lt;Token&gt;&gt; 试试这个

     public @ResponseBody Mono<ResponseEntity<Token>> newToken(@RequestBody Token token) {
            return tokenService.save(token)
                   .map(t -> ResponseEntity.ok(t));
        }
    

    你将你的单声道包装在一个没有被订阅的对象中,所以反过来。

    【讨论】:

      【解决方案2】:

      我发现我可以将未来的结果存储在 CompletableFuture 中,然后在完成时存储 Token 对象。 这是一个例子:

      CompletableFuture<Token> tokenFuture = tokenRepository.findByClientCode(notificationRequest.getClientCode()).toFuture();
      
      Token token = tokenFuture.get(5, TimeUnit.SECONDS);
      

      等待 5 秒或抛出 TimeoutException

      【讨论】:

      • 这似乎与 webflux 试图促进的整个反应流程背道而驰。
      • @JamesRalston 我对响应式概念有点陌生,我仍在等待更好的方法来解决这个问题
      • 我会选择上述答案。这是正确的方法。我
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-10
      • 2015-11-10
      相关资源
      最近更新 更多