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

将spring-reactor集成到现有的Spring Framework 4 STOMP Over

孙博艺
2023-03-14
@Bean
public ThreadPoolTaskExecutor clientInboundChannelExecutor() {
    TaskExecutorRegistration reg = getClientInboundChannelRegistration().getOrCreateTaskExecRegistration();
    ThreadPoolTaskExecutor executor = reg.getTaskExecutor();
    executor.setThreadNamePrefix("clientInboundChannel-");
    return executor;
}

当我尝试在WebSocketConfig中重写此方法时,“来自ChannelRegistration类型的方法getOrCreateTaskExecRegistration()不可见”,因为在AbstractMessageBrokerConfiguration中它受到保护....

protected final ChannelRegistration getClientInboundChannelRegistration() {
    if (this.clientInboundChannelRegistration == null) {
        ChannelRegistration registration = new ChannelRegistration();
        configureClientInboundChannel(registration);
        this.clientInboundChannelRegistration = registration;
    }
    return this.clientInboundChannelRegistration;
}

我不完全理解WebSocketMessageBrokerConfigurationSupport层次结构或WebSocketMessageBrokerConfigurer接口。我只是玩弄重写我的定制工作所需的东西。

不确定它是否相关,但我不需要外部代理,因为我的应用程序目前不向所有连接的订阅者发送任何数据,而且不太可能最终发送数据。与守护进程类型的java websocket客户机的通信是点对点的,但是浏览器中的web ui websocket确实使用subscribe来获取实时数据,因此这是一个方便的设置(而不是spring integration direct channel),并且有关于如何设置的明确来源--但我不确定这是最有效的应用程序设计。spring-framework参考文档中描述的WebSocket消息传递体系结构上的STOMP是最全面的方法,因为这是我的第一个spring项目。

我应该如何将spring-reactor集成到我的标准spring framework 4 STOMP Over WebSocket消息传递架构中?

如果在clientInboundChannelExecutor和clientOutboundChannelExecutor中配置RingBufferAsyncTaskExecutor代替ThreadPoolTaskExecutor是正确的方法,那么应该如何执行呢?

共有1个答案

谭泉
2023-03-14

实际上RingBufferAsyncTaskExecutor不是ThreadPoolTaskExecutor,所以不能这样使用它。

您可以简单地从AbstractWebSocketMessageBrokerConfigurerimpl重写ClientInbound(出站)通道beans,只需使用@enableWebSocketMessageBroker:

@Configuration
@EnableWebSocketMessageBroker
@EnableReactor
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @autowired
    Environment reactorEnv;

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws").withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry configurer) {
        configurer.setApplicationDestinationPrefixes("/app");
        configurer.enableSimpleBroker("/topic", "/queue");
    }

    @Bean
    public AbstractSubscribableChannel clientInboundChannel() {
        ExecutorSubscribableChannel channel = new ExecutorSubscribableChannel(new RingBufferAsyncTaskExecutor(this.reactorEnv));
        ChannelRegistration reg = getClientOutboundChannelRegistration();
        channel.setInterceptors(reg.getInterceptors());
        return channel;
    }

}

请注意Spring集成中的WebSocket支持。

 类似资料:
  • 问题内容: 我有一个使用Spring Batch和Spring MVC的应用程序。我可以将Spring Batch Admin单独部署,并与我的应用程序使用的数据库一起使用,尽管我想将其集成到我自己的应用程序中,还可能会修改其中一些视图。 有没有简单的方法可以做到这一点,还是我必须将其分叉然后从那里去? 问题答案: 根据这个线程显然有一个简单的方法; 在以下位置为Batch Admin定义Disp

  • 我使用spring-batch和Spring-Boot完成了一个项目。 业务模式MySQL 和修改的application.properties: 这是副作用。除了java配置之外,我的应用程序还使用了applicationContext.xml。

  • 作为项目Reactor的用户,也想使用Spring集成,我想执行以下操作,这将以这样的方式工作: 一开始,我认为解决方案是执行以下错误代码: 当然,由于问题,它无法工作。我想知道如何一个接一个地执行操作(例如,在CockroachDB写入完成之前不要继续脉冲星写入,如果第一次操作失败,请停止这些消息的流)。 我正在考虑使用Spring集成事务支持,但我担心它在Retor中的使用。 我还看到有一种叫

  • 我们从项目一开始就没有使用过Flyway。我们正处于先进的发展状态。让我们在与詹金斯的项目中开始使用Flyway。 从留档,我了解到的是: 将开发模式(DDL和DML)的备份作为SQL脚本文件,提供一个像V1_0_1__initial.SQL这样的文件名。 使用“flyway clean”清理开发数据库。 开发数据库基线 “飞行路线基线 -基线版本 =1.0.0” 现在,执行"flyway迁移",

  • 我们从项目开始就没有使用过Flyway。我们正处于先进的发展状态。专家评论建议在我们的项目中使用Flyway。 问题是我们已经将部分服务(微服务)转移到了另一个测试环境中。 正确实现Flyway的最佳方式是什么?这些要求是: > 在开发环境中,无需更改已存在的架构。但是所有新脚本都应该使用Flyway来完成。 在测试环境中,不需要改变已经存在的模式。但是,当我们将项目从开发迁移到测试时,测试环境中

  • 问题内容: 区别在于消息来自Http端点而不是JMS队列。问题是由于某些原因而无法填充消息通道,或者Flux.from()不会拾取它。日志条目显示GenericMessage是从Http Integration流中创建的,并带有有效负载作为路径变量,但是没有入队/未发布到通道?我尝试过并且 没有任何区别,事件流为空。这是代码: UPDATE1: build.gradle 更新2 当和在一个文件中定