DWR 推送技术,只能推送一次数据。

Ghost_520 2009-05-13 10:39:04

不知道为什么, 我使用 DWR 服务器推送技术的时候, 只能推送数据一次, 但是 ScriptSession 可以获得,就是不能推送到客户端, 有谁知道原因吗? 贴出一些关键代码:

web.xml

<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>activeReverseAjaxEnabled</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>initApplicationScopeCreatorsAtStartup</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>maxWaitAfterWrite</param-name>
<param-value>100</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
<servlet>


dwr.xml

<!-- Reverse Ajax DWR 推技术 -->
<create creator="new" javascript="ChatManager">
<param name="class" value="com.hdkj.sgcc.chat.ChatManager"/>
</create>
<convert converter="bean" match="com.hdkj.sgcc.chat.Message" />


ChatManager.java

public void sendMessage(String sendId,String receiverId,String title,String content
,HttpServletRequest request){
try {
// 获得接收者的 ScriptSession
ScriptSession session = this.getScriptSession(this.getSessionId(receiverId), request);

// 没有该用户的 ScriptSession , 表示该用户没有上线, 则不进行操作
if(session == null){

}else{
Message message = new Message();
message.setSendId(sendId);
message.setSender(this.getUserName(sendId));
message.setReceiverId(receiverId);
message.setReceiverName(this.getUserName(receiverId));
message.setTitle(title);
message.setContent(content);

messages.add(message);

// 拼凑 javascript 脚本
ScriptBuffer script = new ScriptBuffer();
script.appendScript("receiveMessages(").appendData(messages).appendScript(");");

System.out.println(session); // 可以获得 session

// 将数据推送到客户端的 javascript 函数中。

// 此处, 推送到客户端的时候只能推送一次, 大约过了 1分钟后就不能再次推送出去了。
session.addScript(script);
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
...全文
1366 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
yunyouyou 2009-05-14
  • 打赏
  • 举报
回复
学习
Ghost_520 2009-05-14
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 jack420124 的回复:]
引用 7 楼 Ghost_520 的回复:
引用 1 楼 jack420124 的回复:
你没理解dwr 推技术的实质性东西,
推是点到面.如果点到点就没什么意义了


我想你是属于抽象派的那种人, 说话都是那么抽象的, 那按照你这么说发即时消息是点到面的啦? 如果你用 qq 跟某一个人发消息,那消息是发到一个人手上,还是一群人手上呢?

Dwr 推送可以发到一个人,也可以发到一群的,谢谢。


可能看你的问题,太快了,没看仔细吧.
[/Quote]

呵呵, 没别的意思, 忘高人指教下。
网络科技 2009-05-13
  • 打赏
  • 举报
回复
推技术,不错,有空也学下
Ghost_520 2009-05-13
  • 打赏
  • 举报
回复

嗯, 那我先按照你说的方法改写下程序, 有啥不懂的就问下您, 谢谢哈。
shuai45 2009-05-13
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 Ghost_520 的回复:]


但是问题不是这样的, 我上面说的意思是,如果页面刷新,可以正常发送到指定的用户,就是第一次发送后,大约过了 1分钟的话, 就不能发送了, 只能发送一

次。 你说的这个解决办法我以前看到过, 是对旧版本 DWR 刷新丢失 session 做的处理吧!
[/Quote]
呵呵,恩。
不过 要知道 发送一次后 如果没问题,无论几分钟都可以发送。之所以有时间差 因为js 的sessionI的缓存问题的存在。
也许前两个或者三个可以发送,但以后就不行了。
不知道是不是你想要的问题,至少你说的问题 也是我后来用这样的方法解决的问题。
Ghost_520 2009-05-13
  • 打赏
  • 举报
回复


但是问题不是这样的, 我上面说的意思是,如果页面刷新,可以正常发送到指定的用户,就是第一次发送后,大约过了 1分钟的话, 就不能发送了, 只能发送一

次。 你说的这个解决办法我以前看到过, 是对旧版本 DWR 刷新丢失 session 做的处理吧!
shuai45 2009-05-13
  • 打赏
  • 举报
回复
流程:
1、页面产生javascript的sessionId---将当前页面的用户ID和javascript的sessionId一同放入hashmap。
2、刷新页面 又有新的javascript的sessionId。
3、通过主键key 就是用户ID找到其对应的value值,将其value值替换成新生成的javascript的sessionId。
就是这样,这个dwr推 中的一个bug,目前新版本可以解决这个问题。
只能自己写个方法
shuai45 2009-05-13
  • 打赏
  • 举报
回复
给你个思路吧,
一个页面会产生一个 javascript的sessionId ,产生后将其放到 hashmap中。同时hashmap的key值应该是 当前的userId
如果 key----value
userId ----- javascript的sessionId

当当前页面刷新的时候又会产生一个javascript的sessionId ,OK 去hashmap中当前userId,也就是hashmap中的key值,
再将其value值替换成 新查声的javascript的sessionId 即可。
不知道我说LZ 能明白吗
Ghost_520 2009-05-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 shuai45 的回复:]
... ...这样判断 等于没写一样。。。 。。。
[/Quote]

哈哈, 我菜,忘大侠指教。。
shuai45 2009-05-13
  • 打赏
  • 举报
回复
... ...这样判断 等于没写一样。。。 。。。
Ghost_520 2009-05-13
  • 打赏
  • 举报
回复
我是这样来进行逻辑判断的。


.....

public static List<User> users = new ArrayList<User>();

....

ScriptSession session = this.getScriptSession(this.getSessionId(userId), request);

// session 集合中没有该用户的 ScriptSession ,则添加新的 ScriptSession
if(session == null){
// 将所有用户存储到集合列表中,标示他们的是用户 ID 和 Session ID
User user = new User(userId , request.getSession().getId(),this.getUserName(userId));
users.add(user);

WebContextFactory.get().getScriptSession().setAttribute("userId", request.getSession().getId());
}else{
// 如果存在该用户的 ScriptSession,
// 则清除已有连接, 标识当前连接用户(登录或刷新页面时,进行必要的清理).
session.invalidate();
session = null;

WebContextFactory.get().getScriptSession().setAttribute("userId", request.getSession().getId());
}
Ghost_520 2009-05-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jack420124 的回复:]
你没理解dwr 推技术的实质性东西,
推是点到面.如果点到点就没什么意义了
[/Quote]

我想你是属于抽象派的那种人, 说话都是那么抽象的, 那按照你这么说发即时消息是点到面的啦? 如果你用 qq 跟某一个人发消息,那消息是发到一个人手上,还是一群人手上呢?

Dwr 推送可以发到一个人,也可以发到一群的,谢谢。
shuai45 2009-05-13
  • 打赏
  • 举报
回复
HashMap<String, Collection<ScriptSession>> hashMap = new HashMap<String, Collection<ScriptSession>>();
private static Collection<ScriptSession> sessions = new HashSet<ScriptSession>();

... ...//逻辑判断
sessions.removeAll(map);
hashMap.remove(userId);

最后将session集合 和 hashMap 中的相应数据同时清掉 才行。
shuai45 2009-05-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 Ghost_520 的回复:]
引用 3 楼 shuai45 的回复:
哦,这个属于DWR的BUG,但是也不算。
要知道它是通过javascript的sessionId 对页面进行数据推送的。就是说 你刷新一下页面,就会产生新的sessionId。
虽然是同一个页面,但会产生不同的id。所以,你第一次推送可以成功,因为id没变,但以后都不会成功。

可以 将javascript的sessionId 放到hashmap中,进行管理,避免产生这样的错误。


我是将 sessionId 放在 List 中进行管理和区分的…
[/Quote]

我可以确定的说 是在sessionID上出了问题,你自己看一下程序。最好不要放在list中,因为那样很不好区分。
在页面产生新的id的时候将 集合中存在的id清掉。
Ghost_520 2009-05-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 shuai45 的回复:]
哦,这个属于DWR的BUG,但是也不算。
要知道它是通过javascript的sessionId 对页面进行数据推送的。就是说 你刷新一下页面,就会产生新的sessionId。
虽然是同一个页面,但会产生不同的id。所以,你第一次推送可以成功,因为id没变,但以后都不会成功。

可以 将javascript的sessionId 放到hashmap中,进行管理,避免产生这样的错误。
[/Quote]

我是将 sessionId 放在 List 中进行管理和区分的。
shuai45 2009-05-13
  • 打赏
  • 举报
回复
哦,这个属于DWR的BUG,但是也不算。
要知道它是通过javascript的sessionId 对页面进行数据推送的。就是说 你刷新一下页面,就会产生新的sessionId。
虽然是同一个页面,但会产生不同的id。所以,你第一次推送可以成功,因为id没变,但以后都不会成功。

可以 将javascript的sessionId 放到hashmap中,进行管理,避免产生这样的错误。
jack420124 2009-05-13
  • 打赏
  • 举报
回复
不过我说的点到点是两个终端不同,这是有意义的.
如果点到点都指的同个终端,那你更新client 还不如不用dwr 推技术,
直接用你返回的数据去更新终端
jack420124 2009-05-13
  • 打赏
  • 举报
回复
你没理解dwr 推技术的实质性东西,
推是点到面.如果点到点就没什么意义了
pathuang68 2009-05-13
  • 打赏
  • 举报
回复
学习
fanyuanwaifdl 2009-05-13
  • 打赏
  • 举报
回复
up
加载更多回复(1)

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧