问题描述
CometD 3.1.4 java 实现使用缓冲区来跟踪传入的消息,该缓冲区的默认大小为 2MB。从断开连接重新启动时,可能会出现峰值并且您可能会超出限制。
图书馆有什么行为?字节丢失,如果收到来自服务器端的后续通知,它们可以被处理吗?
解决方法
客户端缓冲限制可以按照 here 的说明进行配置。
但是,我建议您检查您的逻辑,因为通常不建议向客户端发送 MiB 的消息,因为客户端可能需要很长时间来处理它们。 此外,如果消息很少但包含大量数据,您可能需要进行设置,以便客户端获取带有下载 URI 的 CometD 消息,以便在侧下载,而不是在 CometD 消息中发送数据。
话虽如此,您可以编写一个 server-side extension 以例如丢弃旧消息,以便在重新连接时不会发送 MiB 数据。
message acknowledgment 扩展保证了服务器到客户端的传送,因此——只要你不超过客户端接收缓冲区——你就可以保证排队的消息被传送到客户端。
您可能需要特定于您的应用程序的组合。 您可能需要一个 server-side listener 来控制消息队列的大小、保证传递的确认扩展以及更大的客户端缓冲区。
默认情况下 CometD 不会这样做,因为每个人都想要不同的解决方案:有些人希望会话失败,有些人希望丢弃所有消息,有些人只想保留最后 N 条,等等。
CometD 为您提供了实现逻辑所需的钩子。