sockettimeoutexception是网络请求超时异常,在网络状况不佳,且设置了RequestTimeOut、ReadTimeOut时会爆出该错误。
此时应该给出网络连接超时的提示,并给出用户重试的交互,或建立自动重新连接的线程。
注意文件传输时,万万不可设置连接最大超时,否则极易导致文件下载中断等问题!
搭建spark集群时,集群启动后,刚开始在节点上jps查看进程会显示master与worker, 日志为:
Spark assembly has been built with Hive, including Datanucleus jars on classpath。
Spark Command: /usr/lib/java/jdk1.7.0_71/bin/java -cp ::/usr/local/spark/spark-1.0.0-bin-hadoop1/conf:/usr/local/spark/spark-1.0.0-bin-hadoop1/lib/spark-assembly-1.0.0-hadoop1.0.4.jar:/usr/local/spark/spark-1.0.0-bin-hadoop1/lib/datanucleus-rdbms-3.2.1.jar:/usr/local/spark/spark-1.0.0-bin-hadoop1/lib/datanucleus-api-jdo-3.2.1.jar:/usr/local/spark/spark-1.0.0-bin-hadoop1/lib/datanucleus-core-3.2.2.jar:/usr/local/hadoop/hadoop-1.2.1/conf -XX:MaxPermSize=128m -Dspark.akka.logLifecycleEvents=true -Xms512m -Xmx512m org.apache.spark.deploy.master.Master --ip 192.168.81.128 --port 7077 --webui-port 8080。
========================================。
14/12/03 11:34:55 INFO spark.SecurityManager: Changing view acls to: root。
14/12/03 11:34:55 INFO spark.SecurityManager: SecurityManager: authentication disabled; ui acls disabled; users with view permissions: Set(root)。
14/12/03 11:35:44 INFO slf4j.Slf4jLogger: Slf4jLogger started。
14/12/03 11:35:48 INFO Remoting: Starting remoting。
Exception in thread "main" java.util.concurrent.TimeoutException: Futures timed out after [10000 milliseconds]。
at scala.concurrent.impl.Promise$DefaultPromise.ready(Promise.scala:219)。
at scala.concurrent.impl.Promise$DefaultPromise.result(Promise.scala:223)。
at scala.concurrent.Await$$anonfun$result$1.apply(package.scala:107)。
at scala.concurrent.BlockContext$DefaultBlockContext$.blockOn(BlockContext.scala:53)。
at scala.concurrent.Await$.result(package.scala:107)。
at akka.remote.Remoting.start(Remoting.scala:173)。
at akka.remote.RemoteActorRefProvider.init(RemoteActorRefProvider.scala:184)。
at akka.actor.ActorSystemImpl._start$lzycompute(ActorSystem.scala:579)。
at akka.actor.ActorSystemImpl._start(ActorSystem.scala:577)。
at akka.actor.ActorSystemImpl.start(ActorSystem.scala:588)。
at akka.actor.ActorSystem$.apply(ActorSystem.scala:111)。
at akka.actor.ActorSystem$.apply(ActorSystem.scala:104)。
at org.apache.spark.util.AkkaUtils$.createActorSystem(AkkaUtils.scala:104)。
at org.apache.spark.deploy.master.Master$.startSystemAndActor(Master.scala:785)。
at org.apache.spark.deploy.master.Master$.main(Master.scala:765)。
at org.apache.spark.deploy.master.Master.main(Master.scala)。
1、SocketTimeoutException一般是服务器响应超时,即服务器已经收到了请求但是没有给客户端进行有效的返回;而ConnectTimeoutException指服务器请求超时,指在请求的时候无法客户端无法连接上服务端:
请求超时和响应超时的意义可通过下面的例子理解:
当一笔交易,如果请求失败,那可以允许用户再次提交。如果是响应失败,那就说明用户提交成功了,应该防止用户再次提交 。
2、在代码里可以对应的设置请求超时和响应超时的最大时间:
//请求超时 httpclient.getParams().setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,reqTimeout);。
//响应超时 httpclient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, resTimeout);。
在开发Android程序的时候,无论使用URLConnection还是HttpClient操作,经常遇到Timeout现象,这个时候如果检查了网络是正常的,手动浏览器访问目标web地址也可以正常浏览的话,估摸着下面的情况对你有用。
本人遇到的情况就是,在一些2.X系统手机上访问URL正常,但是在4.x系统手机上就报错:
03-07 13:17:06.132: E/ConnectionManager(25522): android.os.NetworkOnMainThreadException。
或者一些Timeout的异常
通过查阅相关资料,发现,自从Android 2.3之后,系统增加了一个类:StrictMode。这个类对网络的访问方式进行了一定的改变。
Android的官方文档给出了这个类设置的目的:
StrictMode是一个系统提供的开发工具,用以检测在开发过程中因为偶然的事故从而造成的系统潜在的问题,进而提示开发者对其进行修复。
StrictMode通常用于捕获磁盘访问或者网络访问中与主进程之间交互产生的问题,因为在主进程中,UI操作和一些动作的执行是最经常用到的,它们之间会产生一定的冲突问题。将磁盘访问和网络访问从主线程中剥离可以使磁盘或者网络的访问更加流畅,提升响应度和用户体验。
显然,大多数初学者在进行网络开发时,会选择将访问网络的代码直接放到主进程中,由于和主进程的首要工作——UI交互——相矛盾,因此,必须设置一定的检测机制,以保证系统运行的流畅,所有的异常都可以被检测。
Android文档建议增加这两条命令:
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()。
.detectDiskReads()。
.detectDiskWrites()。
.detectNetwork() // or .detectAll() for all detectable problems。
.penaltyLog()
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()。
.detectLeakedSqlLiteObjects() //探测SQLite数据库操作。
.penaltyLog() //打印logcat。
.penaltyDeath()。
.build());
即使这样子的话,在4.x系统手机上还是会报错,但是不会中断程序执行;
其实本人的程序是一个webview做的android app壳, js通过webview跟native交互,让native做一些代理访问操作,html5部分会去做存储展示操作,也就说js做的一些存储操作和native做的网络访问有可能在并发执行,StrictMode只不过更好地检测出来而已。