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

向微服务发送异步消息

太叔志文
2023-03-14

我有一个BE服务a,它正在使用假客户端向microservice B发送Rest JSON消息:

@FeignClient(name = "mail-service")
@LoadBalancerClient(name = "mail-service", configuration = LoadBalancerConfiguration.class)
public interface EmailClient {

    @RequestMapping(method = RequestMethod.POST, value = "/engine/emails/register")
    void setUserRegistration(CreateUserDTO createUserDTO);
}

终点:

@RestController
@RequestMapping("/emails")
public class EmailController {

    @RequestMapping(method = RequestMethod.POST, value = "/register", consumes = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<?> register(@Valid @RequestBody CreateUserDTO createUserDTO) {

        emailRestService.processCreateUserMessage(createUserDTO);
        // Implementation of service to send mail to AWS SES
        return new ResponseEntity<>(HttpStatus.OK);
    }
}

Rest Endpoint正在向AWS Ses邮件或其他邮件提供商发送邮件。

问题是来自飞格的第一个呼叫可能需要5秒或更长时间。我需要使其异步,以便FE客户端不要等待邮件发送。

我如何可以使从飞度异步发出的Rest调用到超文本传输协议响应OK没有等待时间可以预期?是否有一些更好的解决方案来实现这一点?

共有1个答案

壤驷涛
2023-03-14

好了,Faign不允许非阻塞IO,这是一项正在进行的工作。

但是您可以实现EmailRestServiceasync。考虑以下代码(我不知道processCreateUserMessage是否也负责发送电子邮件,但如果需要,建议的解决方案应该可以扩展到该功能):

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

//...

@Service
public class EmailRestServiceImpl implements EmailRestService {
  //...
  
  @Async
  public void processCreateUserMessage(CreateUserDTO createUserDTO) {
    // Implementation of service to send mail to AWS SES
    // ...
  }

}

请注意@Async注释定义。

要启用Spring异步处理,您需要在主配置或特定配置中定义@EnableAsync注释:

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;

@Configuration
@EnableAsync
public class AsyncConfiguration {

}

无需更改您的Controller,尽管如果您愿意,您可以返回更方便的HTTP状态代码:

@RestController
@RequestMapping("/emails")
public class EmailController {

    @RequestMapping(method = RequestMethod.POST, value = "/register", consumes = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<?> register(@Valid @RequestBody CreateUserDTO createUserDTO) {
        // Will be executed asynchronously and return immediately
        emailRestService.processCreateUserMessage(createUserDTO);
        return new ResponseEntity<>(HttpStatus.ACCEPTED);
    }
}
 类似资料:
  • 主要内容:1 invokeOneway单向发送,1.1 invokeOnewayImpl单向调用,2 sendMessageSync同步发送,2.1 invokeSync同步调用,3 sendMessageAsync异步发送消息,3.1 invokeAsync异步调用,3.2 onExceptionImpl异常处理,4 NettyClientHandler处理服务端消息,4.1 processResponseCommand处理响应,基于RocketMQ release-4.9.3,深入的介绍了P

  • 我正在计划开发一个基于微服务的架构应用程序,当我阅读Ronnie Mitra的书《微服务架构》时,我决定使用Kafka进行内部通信;马特·麦克拉蒂;迈克·阿蒙森;伊拉克利·纳达雷什维利说: 让微服务直接与消息代理(如RabbitMQ等)交互很少是个好主意。如果两个微服务通过消息队列通道直接通信,那么它们共享一个数据空间(通道),我们已经详细讨论了两个微服务共享一个数据空间的弊病。相反,我们可以做的

  • 我想向一个包含参与者的服务器发出一个异步请求。假设我有两个演员: 和 我的问题是: 1) getSessionIdFromServer()向服务器发出同步请求。我认为异步请求会好得多,对吗?所以它将返回Future[String]而不是一个普通的字符串。 2)我如何使异步:通过使用AsyncHttpClient(如果我没记错的话)或将其同步体包装到Future { } 中? 3)我应该使用阻塞{}

  • 我正在将SpringWebSocket 4.2.4与sockjs和stomp一起使用,并试图在异步任务中从服务器向所有订阅者发送消息,但运气不佳 我的班级是: 但是订阅者没有得到消息 有什么帮助吗?我做错了什么:( *编辑* 我的消息代理: 当我订阅时: 谢谢 **编辑2:** 谢谢你帮我解决这个问题:)

  • 我有一个简单的netty连接池和一个简单的HTTPendpoint来使用该池向ServerSocket发送TCP消息。相关代码看起来是这样的,客户端(NettyConnectionPoolClientApplication)是: 和服务器(ServerSocketRunner) 虚拟通道池处理程序和虚拟客户端处理程序只是打印出发生的事件,因此它们不相关。当服务器和客户端启动并且我向测试endpoi

  • 我在尝试更新 mongodb 中的数据时遇到以下异常。请帮我解决这个问题。 当我查看日志时,我会看到很多错误消息,就像下面的一条,其中驱动程序在连接到mongo时出现套接字错误。该站点仍在运行,不会在每个请求中都发生此错误,也不会在一个需要更长时间的操作中发生此错误。 我使用的版本是C#驱动程序:“2.10.2”和Azure Cosmos版本:3.6”。 向服务器发送消息时发生异常。--- 导致问