Kotlin协程允许通过返回Deferred值来执行非阻塞代码.这对于在使用阻塞方法(例如来自库)时制作非阻塞代码非常有用.
Spring 5允许使用Mono和Flux进入框架.我看到的最大兴趣是能够序列化这两种类型的实例,并在有人调用控制器端点时将其作为响应发送回来.
Spring 5的一个重点是对Kotlin(路由器,bean声明......)有一个特定的支持,但是我找不到关于Kotlin协同程序和Spring 5反应类型之间可能的相互作用的信息.
有没有办法结合这些功能的优势?
Deferred成Mono/ Flux?Deferred响应类型的Spring控制器方法?如果不是,在哪种情况下,如果我们有Spring 5反应类型,协程是否有意义?
在我的应用程序中,我调用 4 个不同的 api(全部位于不同的主机上)。我希望为每个主机和其他参数(例如保持活动状态等)都有一个单独的连接池。我可以使用单个 WebClient 实现此目的还是需要 4 个不同的 WebClient 实例来实现此目的?
另外,为每个主机拥有单独的连接池是否有意义?如果没有,我可以使用单个 WebClient 来实现此目的吗?
我们在其中一个应用服务器上看到了一个有趣(但非常严重)的问题:在某个时间点,运行我们的Web应用程序的JVM的CPU使用率开始上升并持续上升,直到应用程序最终减速到爬行.解决此问题的唯一方法是重新启动应用程序服务器软件.
这让我想到一个简单的问题; 我们可以做些什么来解决这个问题?
我考虑过使用VisualVM(或其他一些JVM监控工具),但他们能做的最好 - 在这种特殊情况下 - 给我一个线程转储,它仍然不会告诉我是什么占用了所有的CPU时间(除非我我错过了什么.
示例项目位于:https://github.com/codependent/spring5-playground
我想将从JMS队列接收的消息桥接到一个Reactive Controller,它将消息作为事件流发布.
我不希望重播消息,也就是说,如果消息到达且没有任何订阅者,我不希望以后在任何子载体时发送它们,所以我使用的是EmitterProcessor:
@Component
public class AlertEmitterProcessor {
private Logger logger = LoggerFactory.getLogger(getClass());
private EmitterProcessor<Alert> processor;
public AlertEmitterProcessor(){
processor = EmitterProcessor.<Alert>create();
processor.connect();
}
public EmitterProcessor<Alert> getProcessor() {
return processor;
}
public void onNext(Alert alert){
logger.info("onNext [{}]", alert);
processor.onNext(alert);
}
public void onComplete(){
logger.info("onComplete");
processor.onComplete();
}
public void onError(Throwable t){
logger.error("onError", t);
processor.onError(t);
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的MessageListener:
@Component
public class AlertMessageListener implements MessageListener{
private Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private AlertEmitterProcessor alertProcessor;
@Autowired
private MappingJackson2HttpMessageConverter jacksonMessageConverter;
@Override …Run Code Online (Sandbox Code Playgroud) spring spring-mvc reactive-programming project-reactor spring-webflux
我正在使用Spring Reactor 3.1.0.M3并且有一个用例,我需要从多个来源合并Mono.我发现如果其中一个Monos是一个空Mono,zip会失败而不会出错.
例:
Mono<String> m1 = Mono.just("A");
Mono<String> m2 = Mono.just("B");
Mono<String> m3 = Mono.empty();
Mono<String> combined = Mono.zip(strings -> {
StringBuffer sb = new StringBuffer();
for (Object string : strings) {
sb.append((String) string);
}
return sb.toString();
}, m1, m2, m3);
System.out.println("Combined " + combined.block());
Run Code Online (Sandbox Code Playgroud)
添加m3时,响应中的组合子被跳过为空.当我删除m3时,它都按预期工作,并返回"AB".有没有办法通过检测空Mono来处理这个问题?另外,有没有办法让组合器方法知道对象的类型而不必抛出?
我有一个网络服务,它返回学生和注册课程的详细信息。
{
"name": "student-name",
"classes": [
{
"className": "reactor-101",
"day": "Tuesday"
},
{
"className": "reactor-102",
"day": "Friday"
}
]
}
Run Code Online (Sandbox Code Playgroud)
该类的 DTO 如下:
public class Student {
private String name;
private Flux<StudentClass> classes;
@Data
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_DEFAULT)
public static class StudentClass {
private String className;
private String day;
}
}
Run Code Online (Sandbox Code Playgroud)
获取学生的主要 REST 控制器逻辑如下:
Flux<StudentClass> studentClassFlux = studentClassRepository.getStudentClass(studentName);
return Mono.just(new Student(studentName, studentClassFlux));
Run Code Online (Sandbox Code Playgroud)
问题是,在进行 REST 调用后,我得到以下输出:
{
"name": "student-name",
"classes": {
"prefetch": 32,
"scanAvailable": true
}
}
Run Code Online (Sandbox Code Playgroud)
我可以通过阻止通量请求以完成所需的输出,然后将输出转换为列表来实现所需的输出。
List<StudentClass> studentClassList = studentClassRepository.getStudentClass(studentName)..toStream().collect(Collectors.toList());
return …Run Code Online (Sandbox Code Playgroud) 在将我的 Spring Boot 应用程序更新到最新的构建快照时,我发现默认情况下没有启用任何执行器端点。如果我指定在 中启用application.properties它们,它们就会出现。
1) 这种行为是有意为之吗?我试图寻找一个问题来解释它,但找不到一个。有人可以将我链接到问题/文档吗?
2)有没有办法启用所有执行器端点?我经常发现自己在开发过程中使用它们,而不想在我的属性文件中维护它们的列表。
谁能告诉我使用Spring Boot 2和WebFlux时如何配置2个端口(用于HTTP和HTTPS)?任何提示表示赞赏!
我刚刚查看了所有 spring 5 文档,但没有发现任何与 WebClient 支持开箱即用的基于摘要的身份验证相关的内容。是否有任何解决方法可以使用 webClient 并仍然调用基于摘要的安全 API?
如何将http呼叫重定向到httpsin spring-cloud-gateway. 我已按照此链接中的说明在我的网关项目中配置了 https 。
现在 HTTPS 网址工作正常,但此外我需要将所有http调用重定向到https. 我试过这个
但这对我不起作用,因为我没有使用默认http端口 8080,而且我的应用程序正在 Spring Security 上运行。
以下代码显示了如何重定向http到https,但我需要相同的Netty服务器配置,因为spring-cloud-gateway仅支持 netty ..
@Configuration
public class RedirectToHttpsConfig {
@Value("${server.port}")
private Integer httpsPort;
@Value("${server.http.port}")
private Integer httpPort;
/* ################ THIS WILL WORK FINE ################
################ IF YOU HAVE TOMCAT ################
################ AS EMBEDDED SERVER ################
*/
@Bean
public TomcatServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new …Run Code Online (Sandbox Code Playgroud) spring ×4
java ×2
spring-boot ×2
coroutine ×1
cpu-usage ×1
jvm ×1
kotlin ×1
spring-mvc ×1
tcserver ×1