Asp.net mvc 在Jetty/ASP.NET中实现CometD的确认扩展

Asp.net mvc 在Jetty/ASP.NET中实现CometD的确认扩展,asp.net-mvc,jetty,cometd,Asp.net Mvc,Jetty,Cometd,我们使用Cometd2来实现一个中央数据提供者和几个使用数据的后端之间的连接。到目前为止,当其中一个后端出现短暂故障时,同时发布的所有消息都将丢失。现在我们听说了CometD的“确认扩展”。它应该创建一个服务器端消息列表,并在其中一个客户端报告要恢复联机时传递这些消息。以下是一些问题: 1) 这是否也适用于多个客户 2) 文件(http://cometd.org/documentation/2.x/cometd-ext/ack)说明:“请注意,如果断开连接的浏览器断开连接的时间超过maxInte

我们使用Cometd2来实现一个中央数据提供者和几个使用数据的后端之间的连接。到目前为止,当其中一个后端出现短暂故障时,同时发布的所有消息都将丢失。现在我们听说了CometD的“确认扩展”。它应该创建一个服务器端消息列表,并在其中一个客户端报告要恢复联机时传递这些消息。以下是一些问题:

1) 这是否也适用于多个客户

2) 文件(http://cometd.org/documentation/2.x/cometd-ext/ack)说明:“请注意,如果断开连接的浏览器断开连接的时间超过maxInterval(默认为10秒),则客户端将超时,未确认的队列将被丢弃。”->这是否意味着如果我的客户端未在maxInterval内恢复,消息还是丢失了

因此,, 2.1)最大间隔是多少?将其设置为高值会产生哪些后果

2.2)我们需要一个安全机制,用于至少几分钟的故障。这可能吗?还有其他选择吗

3) 真的只需要在客户端和Comed服务器中添加这两个扩展吗?服务器使用Jetty,客户端使用.NET Oyatel。有人有过这样的经历吗

我很抱歉问了这么多问题,但不幸的是,Comed项目并没有很好的文档记录。我真的很感激你的回答

干杯, 克里斯

1) 这是否也适用于多个客户机

是的。为每个客户端分配一个消息队列(请参阅AcknowledgedMessageClientExtension)

2) 这是否意味着如果我的客户端没有在maxInterval内恢复,消息仍然会丢失

是的。当客户端在maxInterval毫秒内无法到达服务器时,服务器将丢弃与该客户端关联的所有状态

2.1)最大间隔是多少?将其设置为高值会产生哪些后果

maxInterval是的servlet参数。它在内部被视为长值,因此它的最大值是long.MAX_值

配置示例:

<init-param>
    <!-- The max period of time, in milliseconds, that the server will wait for
         a new long poll from a client before that client is considered invalid
         and is removed -->
    <param-name>maxInterval</param-name>
    <param-value>10000</param-value>
</init-param>
我不知道你在Oyatel上会怎么做。在Javascript中,只需(dojo.require或脚本include for jQuery)即可

当带有AckExtension的客户端连接到服务器时,将记录一条类似于以下内容的消息(从我的Jetty控制台日志):


另一个注意事项,因为它可能不明显:ack扩展将只提供服务器到客户端的交付保证,而不是客户端到服务器。也就是说,当您将消息从客户端发布到服务器时,它可能无法到达服务器并将丢失

消息发送到服务器后,ack扩展将确保当时连接的所有收件人都将收到消息(只要在maxInterval毫秒内无法访问)

如果侦听“/meta/unsuccessful”上的通知并重新发送消息(失败的原始消息作为message.request传递给处理程序),则实现客户端重试相对简单

1) 这是否也适用于多个客户机

是的。为每个客户端分配一个消息队列(请参阅AcknowledgedMessageClientExtension)

2) 这是否意味着如果我的客户端没有在maxInterval内恢复,消息仍然会丢失

是的。当客户端在maxInterval毫秒内无法到达服务器时,服务器将丢弃与该客户端关联的所有状态

2.1)最大间隔是多少?将其设置为高值会产生哪些后果

maxInterval是的servlet参数。它在内部被视为长值,因此它的最大值是long.MAX_值

配置示例:

<init-param>
    <!-- The max period of time, in milliseconds, that the server will wait for
         a new long poll from a client before that client is considered invalid
         and is removed -->
    <param-name>maxInterval</param-name>
    <param-value>10000</param-value>
</init-param>
我不知道你在Oyatel上会怎么做。在Javascript中,只需(dojo.require或脚本include for jQuery)即可

当带有AckExtension的客户端连接到服务器时,将记录一条类似于以下内容的消息(从我的Jetty控制台日志):


另一个注意事项,因为它可能不明显:ack扩展将只提供服务器到客户端的交付保证,而不是客户端到服务器。也就是说,当您将消息从客户端发布到服务器时,它可能无法到达服务器并将丢失

消息发送到服务器后,ack扩展将确保当时连接的所有收件人都将收到消息(只要在maxInterval毫秒内无法访问)

如果侦听“/meta/unsuccessful”上的通知并重新发送消息(失败的原始消息作为message.request传递给处理程序),则实现客户端重试相对简单

[qtp959713667-32] INFO  org.cometd.server.ext.AcknowledgedMessagesExtension  - Enabled message acknowledgement for client 51vkuhps5qgsuaxhehzfg6yw92