RSocket适用于生成的数据,但不适用于Spring Reactive MongoDB

时间:2019-01-01 05:17:12

标签: java mongodb spring-boot spring-data rsocket

解决方案摘要:

即使在SpringBoot相关的教程中,在当前的大多数RSocket示例中,服务器端接受器也只是被构造为新对象(例如下面的新MqttMessageService())。如果您直接在acceptor类中生成示例内容,但是当接受者依赖于容器中的其他bean时,可能会导致以下与依赖项注入相关的混乱。

原始问题:

当尝试通过Rsocket的Java服务器使用Spring Data Reactive Mongodb存储库流式处理数据库条目时,出现NullPointerException。

问题在于调试期间所有组件都单独工作:我可以通过同一Mongodb存储库获取请求的数据,还可以使用Rsocket在同一服务器和客户端之间流式传输随机生成的数据。

所以我要么缺少一些真正的基础知识,要么将Reactive Mongodb和Rsocket一起使用可能会出现问题。

这是原始的服务器端Rsocket配置

@Configuration
public class RsocketConfig {

    @PostConstruct
    public void startServer() {
        RSocketFactory.receive()
                .acceptor((setup, sendingSocket) -> Mono.just(new MqttMessageService()))
                .transport(TcpServerTransport.create(8802))
                .start()
                .block()
                .onClose()
    }
}

这是具有正确DI的有效的服务器端Rsocket配置

@Configuration
public class RsocketConfig {

    @Autowired
    MqttMessageService messageService;

    @PostConstruct
    public void startServer() {
        RSocketFactory.receive()
                .acceptor((setup, sendingSocket) -> Mono.just(messageService))
                .transport(TcpServerTransport.create(8802))
                .start()
                .block()
                .onClose()
    }
}

这是服务器端AbstractRSocket实现,其中在返回service.findAll()处引发NullPointerException。

@Service
public class MqttMessageService extends AbstractRSocket {



    @Autowired 
    private MqttMessageEntityService service;

    @Override
    public Flux<Payload> requestStream(Payload payload) {
        return service.findAll()
            .map(mqttMessageEntity -> DefaultPayload.create(mqttMessageEntity.toString()));

    }
}

这是反应式存储库和相关服务。注入到服务器的AbstractRSocket实现中时,该服务返回null,但注入到其他类中时,该服务运行良好:

@Service
public class MqttMessageEntityService {

    @Autowired
    private MqttMessageEntityRepository repository;

    public Flux<MqttMessageEntity> findAll() {
        return repository.findAll();
    }

}

public interface MqttMessageEntityRepository extends ReactiveMongoRepository<MqttMessageEntity, String> {

}

这是与测试内容完美配合的客户端代码:

@Configuration
public class RsocketConfig {

    @PostConstruct
    public void testRsocket() {

        RSocket rSocketClient = RSocketFactory
                .connect()
                .transport(TcpClientTransport.create(8802))
                .start()
                .block();

        rSocketClient
                .requestStream(DefaultPayload.create(""))
                .blockLast();
    }        
}

我在这里的知识水平可能有点高,并且该主题上的资源非常有限,因此,我很感谢提出解决方案的所有提示:)

1 个答案:

答案 0 :(得分:2)

关于

for(let i = 0; i<finalOut.length; i++) {
    a[i] = {...a[i].total_disposition_code, ...a[i]};
    delete a[i].total_disposition_code;
}

您是否正在使用使服务器保持活动状态?如果是这样,在onClose()之后添加另一个块。

messageEntityService是否为null?因为这看起来像唯一可能导致错误的原因,如果不是主题变量topic和模块。尤其是如果其他代码有效-从RSocket端我看不到任何会引起问题的东西。