当前位置: 首页 > 知识库问答 >
问题:

使用反应式数据库编写业务逻辑

阙阳夏
2023-03-14

我正在编写一个向Android手机发送通知的反应式api。发送通知的过程需要从手机访问令牌代码以将消息推送给它。为了实现这一点,我在服务器端创建了一个endpoint来接收来自手机的令牌。我的问题是保存令牌,然后在上面描述的过程中使用它。这是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
} 

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

共有2个答案

曾新
2023-03-14

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

CompletableFuture<Token> tokenFuture = tokenRepository.findByClientCode(notificationRequest.getClientCode()).toFuture();

Token token = tokenFuture.get(5, TimeUnit.SECONDS);

它等待5秒钟,或者抛出一个TimeoutException

茅和玉
2023-03-14

而不是响应性

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

你正在将你的mono包装在一个对象中,而这个对象没有被订阅,所以将其反转。

 类似资料:
  • 我们的业务逻辑代码主要在 controllers 目录中,新建一个 todo.py 文件, 核心代码如下 (完整代码参考这里),代码说明可以参考注释: # -*- coding: utf-8 -*- import flask from flask import request, redirect, flash, render_template, url_for from application.e

  • 在实现访问服务器和与本地数据库交互之后,是时候把事情整合起来了。逻辑步骤如下: 从数据库获取数据 检查是否存在对应星期的数据 如果有,返回UI并且渲染 如果没有,请求服务器获取数据 结果被保存在数据库中并且返回UI渲染 但是我们的commands不应该去处理所有这些逻辑。数据源应该是一个具体的实现,这样就可以被容易地修改,所以增加一些额外的代码,然后把command从数据访问中抽象出来听起来是个不

  • 如何为不支持流式处理的数据库提供反应式流 API?比如说dymodb。执行 get 调用时,dynamodb 将返回所有结果。因此,即使我将 get 调用包装在源中,如何处理来自下游阶段的背压?另外,如何实现写入 db 中的写入调用?我的水槽会是什么样子?任何关于此的指针都会有所帮助。

  • 问题内容: 最近,我被介绍了node.js以及一些很酷的包,例如express和jade。我有几个问题经常会敲门: 如果选择node.js构建下一个网站,我将使用JavaScript编写服务器端复杂的逻辑吗?但我认为您无法将JavaScript与Java或Python进行比较来编写服务器端代码,因为它们拥有如此众多的库。node.js是真的吗?还是我错过了什么? 我可以从node.js调用Java

  • 我在编译使用嵌入式Derby数据库的java程序时遇到了麻烦。我正在使用Netbeans,并使用了“clean and build”选项,该选项创建了一个dist文件夹。我将数据库添加到dist/resources文件夹中,我将derby连接指向的那个文件夹: 麻烦的是,有些人无法运行程序。对于有些人来说,这就像点击dist文件夹中的.jar文件一样简单。对其他人来说,它根本不会运行。另外,我已经

  • 这种方法对反应友好吗? 我有一个反应式控制器“save”方法调用myService。保存(请求)。 服务层需要: jdbc save(在另一个调度程序上,因为代码被阻塞), 我无法在一个管道中链接所有调用,或者我不知道如何实现这一点,因为我想尽快发送回(1)丢失的...... 相反,我触发(1)中的子运算。 这是我应该如何处理这件事,还是有一个聪明的方法可以在一个管道中做到这一点? 下面的代码来支