求一个思路的实现

[img]http://dl.iteye.com/upload/attachment/0074/4781/3d258b50-bffd-3605-840a-b0dd3f2525cb.jpg[/img]

多个用户请求一个servlet的sleep方法,然后都在这里不断循环,不让起返回,保持一段时间的http连接。

李四向张2发送数据,请求这个servlet的的update方法、要求张二的线程退出。
这个该如何实现?

8个回答

可以使用java.util里面的exchange对象来多线程交换数据。

创建一个单例,然后属性map,key为用户ID,value业务数据。
一、用户1、2、3请求上来,往map里面放数据,这个时候请求不返回(注意超时时间控制,而且每个用户最多保持2个http长连接,这个是Http规范)。
二、当用户4上来,带上命令要求停止2用户,这个时候用户4和用户2的两个线程用exchange交换,相当于唤醒线程。

smallbee12345
smallbee12345 我说的最多两个http长连接是规范,即使用户再刷新好了,底层会报错出来。exchange如下:java.util.concurrent Class Exchanger<V> java.lang.Object java.util.concurrent.Exchanger<V> Type Parameters: V - The type of objects that may be exchanged
大约 8 年之前 回复
iteye_17041
iteye_17041 谢谢你。“每个用户最多保持2个http长连接”,这点我也想到了。如果用户不断刷新就会产生很多长连接,太消耗资源。但还没有找到更好的思路。在java.util里面没有找到exchange。
大约 8 年之前 回复

sleep睡多长时间 循环的条件是神马 最好有伪代码

weixin_42631626
weixin_42631626 两种方法: 1. 公共变量,互斥访问,李四写标志位,张2读,读到后退出 2. 对象锁,张二线程调用对象锁wait,其他线程如李四调用对象锁notify使其继续运行后退出 btw,不要轻易用循环等待,耗CPU资源的玩意
大约 8 年之前 回复

多个用户请求一个servlet的sleep方法,然后都在这里不断循环,不让起返回,保持一段时间的http连接。 这样做可能会导致你服务器连接用尽 别人都在等待连接,导致服务器无响应

李四向张2发送数据,请求这个servlet的的update方法、要求张二的线程退出。
这个该如何实现? 这个意义何在?

web开发是基于请求/响应模式,你这种设计根本无意义。

jinnianshilongnian
jinnianshilongnian 你还可以考虑 如内嵌flex 走socket 不过这就麻烦了。 因为你图上的解决方案 通过线程sleep,因此其实可以通过客户端轮询 这样不需要长连接
大约 8 年之前 回复
iteye_17041
iteye_17041 我是打算实现一个长连接,使用服务器推送技术。其中使用了观察者模式,但用得不好,写了心跳维护。但还需要解决很多问题。其中一个用户只能存在长连接,如果有数据更新,如果只返回某个线程的数据,而不是改变标志位,全部返回了。其中性能还是主要解决的问题。
大约 8 年之前 回复
jinnianshilongnian
jinnianshilongnian 那就直接长连接 而不是通过线程sleep 你要看清问题。
大约 8 年之前 回复
weixin_42631626
weixin_42631626 很有意义:降低消息抵达的等待时间;减少HTTP的数量,降低带宽消耗
大约 8 年之前 回复
witcheryne
witcheryne 支持 @jinnianshilongnian 的观点. 从思路上就有问题。 用server push来做... 如果按照 @xchd 的思路, 还需要处理如下事情: 1. 如何确保在 sleep 的时候 客户端的浏览器没有关闭. 这里需要维护一个心跳检测。 2. 一般HTTP请求都有超时时间的设置。这个需要考虑. 如果这些都考虑到了, 不如直接选用 pushlet 来解决这个事情. http://witcheryne.iteye.com/blog/520588
大约 8 年之前 回复
jinnianshilongnian
jinnianshilongnian 尽量不动用线程的sleep, 比如使用客户端轮询(实时性要求不是那么高可以考虑 而且上边你选择了sleep 估计实时性要求不是那么高 轮询吧) 或服务器长连接阻塞
大约 8 年之前 回复
jinnianshilongnian
jinnianshilongnian 1、不要用Thread.sleep 暂停线程 这样可能导致服务器阻塞 2、如果实时性要求非常高 考虑长连接/内嵌flash走socket 否则可以客户端轮询 3、自定义一套会话机制 每个用户过来 增加会话 4、李四查找张2的会话 并添加过期属性 5、如果是长连接 会话实现观察者设计模式 主动触发客户端 5、如果是轮询 则定期轮询会话状态 有过期自动退出
大约 8 年之前 回复
smallbee12345
smallbee12345 他的场景估计要求实时性比较高的 所以用了长连接
大约 8 年之前 回复
jinnianshilongnian
jinnianshilongnian 要么轮询 要么长连接
大约 8 年之前 回复
smallbee12345
smallbee12345 为什么没有意义,在特殊网络情况下,这个时候就是一种服务器推送模式,用户4可以向用户2发送数据。
大约 8 年之前 回复

这是个什么样的使用场景啊,真令人感兴趣。。。

iteye_17041
iteye_17041 是一个sns的应用
大约 8 年之前 回复

把数据持久化到数据库里,通过数据库来做业务交互

smallbee12345
smallbee12345 这样就异步了
大约 8 年之前 回复

http连接时间较长的情况下会抛出异常的,不知道这块怎么解决?

iteye_17041
iteye_17041 我在服务端也设置了如果没有其他请求等待3分钟返回一次数据。
大约 8 年之前 回复
smallbee12345
smallbee12345 客户端超时时间设置
大约 8 年之前 回复

两种方法:
1. 公共变量,互斥访问,李四写标志位,张2读,读到后退出
2. 对象锁,张二线程调用对象锁wait,其他线程如李四调用对象锁notify使其继续运行后退出

btw,不要轻易用循环等待,耗CPU资源的玩意

smallbee12345
smallbee12345 和我一个意思
大约 8 年之前 回复

1.多个用户请求一个servlet的sleep方法,然后都在这里不断循环,不让起返回,保持一段时间的http连接。

暂时我没想到好的办法,首先可以排除轮询的方式,可以采用状态机的模式去做。如:保存数据。

2.李四向张2发送数据
轮询的方式貌似不可以,可以采用“长连接”的方式 websocket,可以采用服务器端push的模式去做。

3.请求这个servlet的的update方法、要求张二的线程退出。
可以考虑观察者模式,在push的通知执行update方法。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐