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

Flux.create()不生成事件

斜浩穰
2023-03-14

我试图使用Flux.create生成异步服务器发送事件。当我的客户端连接时,请求最终超时,并且没有收到任何事件。我硬编码了一个由Flux发送的事件。创建只是为了查看数据流,但客户端仍然没有收到任何数据。

@GetMapping(path = "/stream", headers = "Accept=*/*", consumes = MediaType.ALL_VALUE, produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<ServerSentEvent<PricingDTO>> getEventStream() {

  final Flux<ServerSentEvent<PricingDTO>> flux = Flux.<ServerSentEvent<PricingDTO>>create(emitter -> {
    final PricingDTO pricing = new PricingDTO();
    pricing.setId(99L);
    emitter.next(ServerSentEvent.builder(pricing).build());
  });

  return flux;
}

客户端(Angular)代码:

const eventSource = new EventSource(url);
eventSource.onmessage = (event) => {
  console.debug('Received event: ' + event);
  const json = JSON.parse(event.data);
  // Should be PricingDTO record here
};

eventSource.onerror = (error) => {
  if (eventSource.readyState === EventSource.CLOSED) {
    console.log('The stream has been closed by the server.');
    eventSource.close();
  } else {
    console.log('Error here: ' + error);
  }
};

我从来没有看到一个事件来自事件源。最终请求超时,我看到错误:< code > net::ERR _ EMPTY _ RESPONSE

我是使用WebFlux的新手,我怀疑在返回Flux结果之前,我在FluxStream上缺少一些初始化。我已经调试并确实看到我的Web服务正在接收请求并返回Flux对象。任何想法为什么我没有收到我的活动?

共有1个答案

法景明
2023-03-14

您的webflux代码似乎很好。我用下面的简化示例测试了这一点(没有自定义类)。

@SpringBootApplication
@RestController
public class App {

    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }

    @GetMapping(path = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<String> getEventStream() {
        return Flux.create(emitter -> emitter.next("hi").next("hi2"));
    }
}

当连接到chrome中的蒸汽时,您可以看到事件来得正好:

data:hi

data:hi2

问题要么在于接受头过滤器,要么在于客户端。当然,您可以通过在浏览器中连接到流(或者更好的是,通过测试)来验证这一点

 类似资料:
  • 在VS2012中。我只是设置预构建事件如下。 它工作良好的第一次和创建目录。在那之后。当我建造时,它总是显示出错误: 错误1错误MSB3073:命令“md”c:\fit\tecch\programmer365\projects\sdr\debug\strings“:vcend”退出,代码为%1。C:\Program Files(x86)\MSBuild\microsoft.cpp\v4.0\v11

  • 我试图建立APK,以张贴我的请求在离子在游戏商店。但是当涉及到下面的命令时,我得到了错误: PS c:\projetos\xxx>jarsigner-verbose-sigalg sha1withrsa-digestalg sha1-keystore android.keystore platforms/android/app/build/outputs/apk/release/app-relea

  • 我正在使用Flink CEP,我需要处理甚至不生成警报的事件。请问我该怎么做? 我正在使用rabbitMq中的事件,并定义了一些模式。现在我需要做的是将另一个队列中接收到的所有事件发送到一个远程API。我是Flink的新手,所以我遵循了文档中的示例。当我在将接收到的事件与定义的模式进行匹配后尝试发送它们时,我只会得到与模式匹配的结果。例如,我想做的就是在我的事件中将一个属性设置为true,然后将它

  • 我试图执行一个集成测试,我的类与@Transactional注释不能自动连接到一个测试类与NoSuchBean定义异常。我把它注释出来,检查了一份装载豆子的列表,我的服务就在那里,只是没有注射。 组织。springframework。豆。工厂BeanCreationException:创建名为“com”的bean时出错。icsynergy。西姆。服务DBIntegrationServiceTest

  • 在1.7.10中是否有一个事件用于当一个块生成时,所以我可以在它上面放置一些东西。还是我一定要在这一代人中做到这一点? 我已经上网了,但我找不到 事件之类的。

  • 我正在学习LiquiBase。我正在尝试从changelog生成SQL。出于某种原因,它生成的唯一SQL是对表的锁定。 我期待drop、create和update表的SQL,但没有看到任何东西。 LiquiBase:3.4.1版 数据库:MS SQL Server