对我的node.js服务器的一个AJAX请求有时可能需要两分多钟.我发现当服务器耗时超过两分钟时,客户端会重新发送AJAX请求.这导致服务器因为开始第二个昂贵的过程而陷入更加困难.
为了解决这个问题,我在服务器上实现了一个长轮询解决方案.客户端对服务器上的检查功能进行ajax调用,该功能仅检查进程是否完成并每五秒重新检查一次,并在完成后返回客户端.
但是,我仍然有两分钟问题的变化.两分钟后,第二次检查AJAX仍在通话.然后两个检查都在运行,似乎只有新的检查会与客户端进行通信.
解决这个问题的最佳方法是什么?
我正在使用jQuery AJAX调用,Chrome浏览器上的node.js服务器
更新:从node.js文档,"所有传入连接的默认超时为2分钟".我仍然对编写长时间运行的服务器请求的最佳实践建议感兴趣,其中客户端在服务器完成之前不需要知道任何事情.
我正在开发一个实现longpolling的应用程序,因为我希望用户在收到通知后立即收到通知.我有这个部分工作,但我还需要使用javascript函数扩展它,每20秒向服务器发送一次'heartbeat'.
我的问题:如何在不完全中断代码20秒的情况下执行此操作(以便其他javascript在计数时仍然执行)并且是否有某种方法可以使用第二个连接?因为当心跳发送给用户时,我不希望我的longpolling被中断.
有任何想法吗?
我正在寻找一个简单的框架,用于为我的GWT应用程序实现Comet.我看了似乎不活跃的gwt-rocket,然后是没有活动的gwt-comet,然后是大气-gwt-comet,它被移动到大气项目中,最后 - 试图从大气中实际下载gwt样本和它一起工作.:|
我将atmosphere-gwt-server和atmosphere-gwt-client模块(版本0.8.6)添加到我的项目中,并尝试使现有的大气样本工作.我一直在获得连接终止的异常,而且没有消息.似乎这个例子没有发布任何内容,也没有说明如何做.
我找不到任何使用此框架的好JavaDoc或文档,也找不到任何其他有效的推荐框架.此外,我无法理解这个大气框架使用哪种Comet方法 - 长轮询或流式传输?对于我的应用程序,似乎长轮询就足够了,我不想进入我在流式传输方法上阅读的许多问题/不兼容性.
有人可以推荐一个简单的解决方案?样品?文档?
谢谢
我有一个页面,我已经实现了一个长轮询功能来检查记录的时间戳,所以如果数据已被编辑它将更新.
<script type="text/javascript">
var poll_url = 'http://mysite.com/poll/;
var my_ts = <?php $_SESSION['template_timestamp']; ?>;
(function poll(){
$.ajax({
url: poll_url,
type: 'post',
success: function(data){
if ((data.ts > 0) {
// check if expired
if (data.ts > my_ts) {
// it has expired, so reload the page
$("#dialog-message").html('Record has been edited.');
// show popup
$("#dialog-message").dialog({
modal: true,
buttons: {
Reload: function() {
$(this).dialog("close");
$('#pleaseWait').show();
window.location.href = '/records/overview';
}
}
});
}
} else {
// is still null
console.log('error');
}
},
dataType: "json", …Run Code Online (Sandbox Code Playgroud) 我正在尝试在Tornado中实现与远程Tornado服务器交互的长拉客户端。
发生的事情是两件事之一:
这是我使用的客户端:
from tornado import ioloop
from tornado import httpclient
print "\nNon-Blocking AsyncHTTPClient"
import tornado.ioloop
def async_call(response):
if response.error:
response.rethrow()
print "AsyncHTTPClient Response"
ioloop.IOLoop.instance().stop()
http_client = httpclient.AsyncHTTPClient()
http_client.fetch("http://localhost:9999/text/", async_call)
ioloop.IOLoop.instance().start()
Run Code Online (Sandbox Code Playgroud)
这是编写长轮询/ comet客户端的正确方法吗?
对于那些愿意在Tornado中提供一个示例异步服务器的人,我也将不胜感激,因为可能是我在错误地编写了彗星的Tornado服务器……对于整个长轮询过程来说,我有点陌生。
我想开始创建一个在手机(任何类型的智能手机)上打开的网站.该网站将具有控制您已在计算机上打开的网站的功能.(2011年的大众新世纪甲壳虫有这个功能,我可以在台式电脑上打开的网站上通过智能手机滚动)
我们有一个关于horsevideos的流媒体网站,如果他们可以通过智能电视观看流媒体并通过iphone/android/wp进行控制,这对我们的客户来说将是一个很棒的功能.
此外,来自瑞士的wilmaa.com为智能手机提供了一个遥控器,可以在我的智能电视/网络浏览器网站上导航.
因为我需要一个起点来了解它是如何工作的我正在检查谷歌,也许外面已经有任何遥控器,但不幸的是我找不到任何东西.
也许Stack Overflow可以帮助我提出一些如何实现这一点的起点.
我正在尝试使用$ http在我的应用程序中为长轮询编写一个angularJS服务.
这是我的代码:
app.factory('Poller', function($http, $timeout){
var poll = function(http, tick){
http.then(function(r){
$timeout(poll, tick);
return r.data;
});
};
return{
poll: poll
};
});
Run Code Online (Sandbox Code Playgroud)
基本的想法是每当我需要在$ http调用上进行轮询时注入此服务.我在控制器中使用它:
app.controller('myCtrl', function($scope, $http, Poller){
$scope.polledVar = Poller.poll($http.get('api/getVar'), 1000);
});
Run Code Online (Sandbox Code Playgroud)
使用此代码时,我收到以下错误:
TypeError: Cannot call method 'then' of undefined
Run Code Online (Sandbox Code Playgroud) 在使用SignalR开发服务器客户端推送机制时,我遇到了最大的并发连接问题.即每个浏览器进程仅支持大约6个到同一域的并发连接.
我目前正在跟踪哪些用户与哪些连接相关联,并且在用户有三个打开的连接后,我想强制来自同一用户的其他连接使用长轮询进行传输而不是Web套接字.通过这种方式,我希望避免完全耗尽连接的问题.
我总是可以在客户端上执行此操作,服务器提供非SignalR机制,以通知客户端是否已用完Web套接字连接,然后客户端可以在打开SignalR连接时指定长轮询,但这似乎效率低下.我真的想在连接打开时适当地设置传输.
类似于集线器类中的以下内容.
/// <summary>
/// Chooses the correct transport depending on a users connections
/// </summary>
public override Task OnConnected()
{
if(CanOpenWebSocketsConnection(Context.User.Identity.Name))
{
Connection.Transport = Connections.WebSockets;
}
else
{
Connection.Transport = Connections.LongPolling;
}
return base.OnConnected();
}
Run Code Online (Sandbox Code Playgroud) 我需要在非JEE7兼容服务器上安装应用程序.我正在使用Spring + Stomp + SocksJs进行实时通知.
我的代码看起来像这样:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry ser) {
ser.addEndpoint("/notifications").withSockJS()
}
}
}
Run Code Online (Sandbox Code Playgroud)
在客户端:
function setSocket(broker, callbackFn) {
var socket = {};
socket.cliente = new SockJS(path + broker);
socket.stomp = Stomp.over(socket.cliente);
socket.stomp.connect({}, function () {
socket.stomp.subscribe("/topic" + broker, callbackFn);
});
}
Run Code Online (Sandbox Code Playgroud)
有没有办法手动设置使用的传输类型并避免使用websockets?
目前,我有一个AWS SQS作为我的AWS Lambda函数的触发器。
我想实施长时间轮询以降低成本,因为我已经用完了每月免费套餐的70%,其中大部分来自空收据。
我尝试通过将queue属性更改为ReceiveMessageWaitTimeSeconds来设置长轮询20 seconds:
但是,这似乎并没有减少空接收的数量,在2:00-3:00之间的11/19更改了设置。

根据AWS文档,WaitTimeSeconds优先级高于队列属性ReceiveMessageWaitTimeSeconds
通过以下两种方式之一将ReceiveMessage请求的WaitTimeSeconds参数设置为0时,将发生短轮询:
- ReceiveMessage调用将WaitTimeSeconds设置为0。
- ReceiveMessage调用未设置WaitTimeSeconds,但是队列属性ReceiveMessageWaitTimeSeconds设置为0。
注意
对于ReceiveMessage操作的WaitTimeSeconds参数,在1到20之间设置的值优先于为队列属性ReceiveMessageWaitTimeSeconds设置的任何值。
由于AWS Lambda正在接收SQS请求,因此我认为WaitTimeSeconds无法对其进行配置。
为什么我的长轮询配置在这种情况下不起作用?我是误解了什么,还是配置错误?
谢谢!
long-polling ×10
ajax ×3
comet ×2
java ×2
javascript ×2
jquery ×2
amazon-sqs ×1
angularjs ×1
asp.net ×1
asp.net-mvc ×1
aws-lambda ×1
c# ×1
gwt ×1
heartbeat ×1
multitasking ×1
node.js ×1
python ×1
server-push ×1
signalr ×1
sockjs ×1
spring ×1
tornado ×1
websocket ×1