我正在尝试向不可靠的服务器实现请求.请求是一个很好的,但我的perl脚本不能100%成功完成.问题是服务器偶尔会死锁(我们试图找出原因)并且请求永远不会成功.由于服务器认为它是活动的,它会使套接字连接保持打开状态,因此LWP :: UserAgent的超时值对我们来说没有任何好处.对请求强制执行绝对超时的最佳方法是什么?
仅供参考,这不是DNS问题.死锁与大量同时访问Postgres数据库的更新有关.出于测试目的,我们基本上在服务器响应处理程序中放置了while(1){}行.
目前,代码如下所示:
my $ua = LWP::UserAgent->new;
ua->timeout(5); $ua->cookie_jar({});
my $req = HTTP::Request->new(POST => "http://$host:$port/auth/login");
$req->content_type('application/x-www-form-urlencoded');
$req->content("login[user]=$username&login[password]=$password");
# This line never returns
$res = $ua->request($req);
Run Code Online (Sandbox Code Playgroud)
我尝试使用信号来触发超时,但这似乎不起作用.
eval {
local $SIG{ALRM} = sub { die "alarm\n" };
alarm(1);
$res = $ua->request($req);
alarm(0);
};
# This never runs
print "here\n";
Run Code Online (Sandbox Code Playgroud)
我将要使用的最终答案是有人离线提出的,但我会在这里提到它.出于某种原因,SigAction有效,而$ SIG(ALRM)却没有.仍然不确定为什么,但这已经过测试可行.这是两个工作版本:
# Takes a LWP::UserAgent, and a HTTP::Request, returns a HTTP::Request
sub ua_request_with_timeout {
my $ua = $_[0];
my $req = $_[1];
# Get whatever timeout is set for …Run Code Online (Sandbox Code Playgroud) 我们有几个长时间运行的后端进程需要比默认的30秒更长的时间.
我们的NHibernate版本是2.0.1.4000,Spring.NET是1.2.0.20313.NHibernate通过Spring.NET以这种方式配置:
<object id="SessionFactory" type="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate20">
<property name="DbProvider" ref="DbProvider"/>
<property name="MappingAssemblies">
<list>
<value>SomeKindOfAnItem</value>
</list>
</property>
<property name="HibernateProperties">
<dictionary>
<entry key="expiration" value="120"/>
<entry key="adonet.batch_size" value="10"/>
<entry key="cache.provider_class" value="NHibernate.Caches.SysCache.SysCacheProvider, NHibernate.Caches.SysCache"/>
<entry key="cache.use_query_cache" value="true"/>
<entry key="connection.driver_class" value="NHibernate.Driver.SqlClientDriver"/>
<entry key="connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/>
<entry key="dialect" value="NHibernate.Dialect.MsSql2005Dialect"/>
<entry key="current_session_context_class" value="Spring.Data.NHibernate.SpringSessionContext, Spring.Data.NHibernate20"/>
<entry key="show_sql" value="false"/>
</dictionary>
</property>
</object>
Run Code Online (Sandbox Code Playgroud)
为了解决这个问题,我试图在Web.config中将NHibernate command_timeout设置为60.这是来自Web.config:
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="command_timeout">60</property>
</session-factory>
</hibernate-configuration>
Run Code Online (Sandbox Code Playgroud)
不幸的是,这不起作用,命令在30秒后超时.
我构建了一个控制台应用程序,就像Web应用程序一样调用DAO.我在其配置文件中具有完全相同的NHibernate配置设置.IDbCommand在60秒后超时,而不是30,使用配置文件中的设置成功.
我尝试调试应用程序并检查从网站调用DAO程序集时是否设置了commandTimeout.它是.
这是来自Visual Studio观看:
((NHibernate.Driver.DriverBase)(((NHibernate.Connection.DriverConnectionProvider)((NHibernate.Impl.SessionFactoryImpl)session.SessionFactory).ConnectionProvider).Driver)).commandTimeout:60
会话创建如下:
ISession session = SessionFactoryUtils.GetSession(HibernateTemplate.SessionFactory, true);
Run Code Online (Sandbox Code Playgroud)
我的问题是:如果命令超时字段从我的Web.config成功设置为60,为什么它会在30秒后超时?我可以尝试任何想法吗?
我遇到了30分钟后测试超时的问题.关于设置无限超时的任何想法?我已经尝试了Timeout(0),但它在30分钟后仍然会超时.
我在Visual Studio 2008中运行这些单元测试.
我正在尝试构建一个代理服务器来处理对内部站点的请求(隐藏原点),但同时检查数据包并异步后处理它们.
例如,假设所有对http://www.foo.com的 SOAP调用都将转到http://192.168.1.1,同时存储在数据库中进行后期分析.内部服务器是一个黑盒子,所以更改它的内容超出了这个问题的范围.
无论如何,我已经配置了ARR,使用反向代理,使用通配符制作URL重写过滤器,所有工作都完美无瑕.然后,我尝试添加一个用C#编写的托管HttpModule,并挂钩到Application_BeginRequest和Application_EndRequest.我能够在最终请求(应用程序池处于集成模式)中访问请求标头,响应标头,甚至能够通过在Response.Filter上设置过滤器来读取输出流中的响应内容,该过滤器将所有写入缓存在附加内存流中.
问题是,当我尝试读取(在模块BeginRequest处理程序内)来自请求的输入流时,ARR会停留一段时间并抛出一个
HTTP错误502.3 - 错误网关操作超时处理程序ApplicationRequestRoutingHandler错误代码0x80072ee2
所以它超时了.
查看失败的请求跟踪我看到:
MODULE_SET_RESPONSE_ERROR_STATUS警告ModuleName ="ApplicationRequestRouting",Notification ="EXECUTE_REQUEST_HANDLER",HttpStatus ="502",HttpReason ="Bad Gateway",HttpSubStatus ="3",ErrorCode ="2147954402",ConfigExceptionInfo =""SET_RESPONSE_ERROR_DESCRIPTION警告ErrorDescription ="操作时间到"
现在网上的任何类似帖子都没有帮助,因为这不是超时错误(代理有120秒设置,页面答案不到100毫秒),以及我评论试图读取FORM数据的处理程序代码的那一刻或者InputStream数据,一切都可以作为魅力.
即使我在读取后将输入流的位置设置为0,我仍然会有超时.如果我在EndRequest上读取输入流,它将获得0个字节,即使它是POST请求.(这显然是错的)
ARR是否有一个错误,我尝试在尝试重新路由之前尝试读取输入流?
使用的东西:Windows Server 2008 R2 IIS 7.5 ARR v2 .Net Framework 3.5模块
想法?谢谢/ Cosmin
我遇到了一个问题,HttpWebRequest在执行POST时不会尊重超过100秒的超时值.但是,如果请求是GET,则会遵循高于100秒的超时值.在.GetResponse()调用时抛出超时异常.我正在设置我能够发现的所有超时值,但似乎我错过了一个,或者框架中有一个错误.
这是一个针对.NET Framework 3.5的C#应用程序,使用Visual Studio 2008构建.Web服务器是IIS 6.0,连接超时设置为默认的120秒,启用了保持活动...再次GET请求尊重超时值I指定,如果<= 100秒,POST请求将遵守超时.
这是我的代码:
int timeout = 200000; // 200 seconds
HttpWebRequest proxyRequest = (HttpWebRequest)WebRequest.Create(serverUrl);
proxyRequest.Accept = clientRequest.AcceptTypes.ToDelimitedString(", ");
proxyRequest.Method = "POST"
proxyRequest.UserAgent = clientRequest.UserAgent;
proxyRequest.Timeout = timeout;
proxyRequest.ReadWriteTimeout = timeout;
proxyRequest.KeepAlive = false;
proxyRequest.AllowAutoRedirect = false;
proxyRequest.ServicePoint.Expect100Continue = false;
proxyRequest.ServicePoint.MaxIdleTime = timeout;
proxyRequest.ServicePoint.ConnectionLeaseTimeout = -1;
try
{
// add post data
request.ContentType = "application/x-www-form-urlencoded";
byte[] postData = Encoding.UTF8.GetBytes("somedata=7&moredata=asdf");
// set some post data
request.ContentLength = postData.Length;
using (Stream stream = request.GetRequestStream())
{
stream.Write(postData, 0, …Run Code Online (Sandbox Code Playgroud) 是否可以为std :: cin设置超时?例如,std :: cin在10秒内没有收到任何数据 - 它会抛出异常或返回错误.
编辑:
那计时器Boost library呢?据我所知,它是便携式库.是否有可能要求Boost库的计时器在预定义的时间段后抛出异常?我想它可以解决这个问题.
我试图打电话给一个非常重的过程.它的平均工作时间估计为9-10分钟.
当我执行该过程时,我将超时设置为一个非常庞大的数字:99999999.
2分钟后,我收到以下错误:
java.net.SocketTimeoutException:读取超时
我试图把它弄得更糟,我把超时设置为3000,并且在预期的3秒后我得到了同样的错误.
你知道为什么socket.setSoTimeout(99999999)把它设置为最大120000吗?
可能有人问过,但是在使用python 2.7时我找不到任何关于subprocess.call超时的信息
我收到客户遇到的许多错误的报告
Symfony的\分量\调试\异常\ FatalErrorException
最大执行时间超过30秒
我,我自己,无法在我的本地机器上或生产服务器上复制它.这个网址遍布整个网站,因此,我猜它是全球性的,就像一个造成这种情况的中间件.
我使用Sentry.io来收集数据,但异常跟踪只有1个条目指向Symfony基本代码中的某个代码,最常见的是:
第73行的vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php
第45行的vendor/symfony/finder/Iterator/DateRangeFilterIterator.php
第69行的vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php
显然,似乎存在与文件系统相关的东西,但由于没有跟踪,我无法看到在站点代码中查找错误的位置.我猜它是某种无限循环或泄漏,但没有任何痕迹可以看,并没有一致的方法来重现问题.
我应该如何寻找问题并进行调试?
我可以设置任何设置,还是可以使用/启用的工具?
我正在使用QuickCheck来测试自动生成的属性(类似于QuickSpec),但是我遇到的一个常见问题是耗尽内存,这可能是由于幼稚的递归生成器或非常大的函数输出(例如,一个失败是由指数引起的) Peano数的函数,会生成巨大的嵌套结构)。
我想知道是否有一种方法可以放弃评估(如果达到)(驻留)内存限制。似乎我们可以为超时执行此操作,但是内存似乎比较棘手。这样,如果我们使用过多的内存,则可以放弃该测试(就像==>先决条件失败了一样)。
通过查看weigh包的来源,我可以看到如何衡量整个程序的内存使用情况。这是可行的,但针对一个特定的表达式(也许通过获取一个线程使用的内存或其他东西)来衡量它会更好(更健壮)。
就我的目的而言,将表达式完全标准化就足够了,因为我不必担心递归结构(我可以将其应用于测试结果,实际上是布尔值)。
timeout ×10
c# ×2
.net ×1
c++ ×1
debugging ×1
exception ×1
haskell ×1
http-post ×1
httpmodule ×1
iis-7 ×1
java ×1
laravel ×1
lwp ×1
memory ×1
nhibernate ×1
perl ×1
php ×1
python ×1
python-2.7 ×1
quickcheck ×1
signals ×1
sockets ×1
stdin ×1
subprocess ×1
symfony ×1
unit-testing ×1