`
shendixiong
  • 浏览: 393068 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

openfire 服务端消息回执添加和响应

阅读更多

      openfire本身有很多比较好的实现框架,如asmack和smack。具体的大家可以上网搜索。因为openfire本身对长连接的支持不是很好,而且相对来说,长连接也挺消耗资源的,但是,又要必须做到及时响应。

   这就存在了一些特殊的账户要存在在服务器中。这些账户能实现自动添加好友,自动响应消息和消息回执响应,而消息回执的响应和请求在smack端有很好的封装,而我服务端也按照其xml请求和响应,如下:

PacketExtension packetExtension2 = new PacketExtension(DeliveryReceipt.ELEMENT,DeliveryReceipt.NAMESPACE);
// 将消息id返回给发送信息用户 表明已经接收到
packetExtension2.getElement().addAttribute("id", message.getID());
// 回执请求设置
responseMessage.addExtension(packetExtension2);
XMPPServer.getInstance().getRoutingTable().routePacket(message.getFrom(), responseMessage, true);

 

而消息回执的响应相对来说复杂一点,如下:

private static Message packMessageProperty(Message requestMessage , Map<String, String> propertyValue){
		
		String key = null;
		String value = null;
		for (Map.Entry<String, String> entry: propertyValue.entrySet()) {
			key = entry.getKey();
			value = entry.getValue();
		}
		Message sendMessage = new Message();
		sendMessage.setFrom(requestMessage.getTo());
		sendMessage.setTo(requestMessage.getFrom());
		sendMessage.setType(org.xmpp.packet.Message.Type.chat);
		// 封装property数据
		PacketExtension packetExtension = new PacketExtension("properties","http://www.jivesoftware.com/xmlns/xmpp/properties");
		Element root = packetExtension.getElement();
		Element propertyElement = root.addElement("property");
		Element nameElement = propertyElement.addElement("name");
		Element valueElement = propertyElement.addElement("value");
		nameElement.setText(key);
		valueElement.addAttribute("type", "string");
		valueElement.setText(value);
		sendMessage.addExtension(packetExtension);
		return sendMessage;
	}

设置消息回执主要原因有以下几条:

 1.查看消息是否发送成功,方便再次发送

 2.统计openfire消息的送达率

 3.弥补openfire丢包的风险等

分享到:
评论
8 楼 yun9157 2015-07-29  
楼主在么? 能否留一个联系方式,我现在需要做消息回执这一块。需要向你讨教一下
7 楼 shendixiong 2015-07-10  
efei 写道
不知楼主用openfire的时候是否存在丢包的问题,就是由于手机客户端网络异常断线等非正常掉线,这个时候发的消息就丢了,不知道有什么好的解决方法?谢谢。

已解决了!
1.手机客户端可以通过ping的形式来保持服务器的连接
2.通过插件的形式,监控消息发送.发送形式时,如果用户在线,保存一条离线消息,只有等用户接收到信息后才删除离线消息(你可以查看openfire回执)
3.在用户待机后,重新打开openfire,提供一个接口给手机客服端,用于判断该用户是否正常登录
6 楼 shendixiong 2015-07-10  
jxufecs2008 写道
楼主,你好,这个消息回执请求和响应怎么添加到openfire中?以插件的形式吗?


是的!通过插件的形式
5 楼 jxufecs2008 2015-06-05  
楼主,你好,这个消息回执请求和响应怎么添加到openfire中?以插件的形式吗?
4 楼 shendixiong 2014-07-10  
efei 写道
shendixiong 写道
efei 写道
不知楼主用openfire的时候是否存在丢包的问题,就是由于手机客户端网络异常断线等非正常掉线,这个时候发的消息就丢了,不知道有什么好的解决方法?谢谢。


    您好,会出现丢包的情况!
      (1).就是手机终端长时间搁置不动,会百分百出现。这种情况可以通过ping来解决!(这种情况,出现概率很高)
      (2).可以在openfire管理界面中的(Client Connections )设置会话超时时间
      (3).就是改源码


多谢多谢,目前我们采用的方法比较土,是拦截所有的消息,通过判断是否有回执来确定消息是否发送成功,没有发送成功的消息,采用离线消息处理,简单测试了下,目前能解决问题,不知道用户量上来后是否会带来其他问题,等后续再测试看看。


  这种方式是可行的,也不用改动它的源码!我解决的方法跟你类似
3 楼 efei 2014-05-13  
shendixiong 写道
efei 写道
不知楼主用openfire的时候是否存在丢包的问题,就是由于手机客户端网络异常断线等非正常掉线,这个时候发的消息就丢了,不知道有什么好的解决方法?谢谢。


    您好,会出现丢包的情况!
      (1).就是手机终端长时间搁置不动,会百分百出现。这种情况可以通过ping来解决!(这种情况,出现概率很高)
      (2).可以在openfire管理界面中的(Client Connections )设置会话超时时间
      (3).就是改源码


多谢多谢,目前我们采用的方法比较土,是拦截所有的消息,通过判断是否有回执来确定消息是否发送成功,没有发送成功的消息,采用离线消息处理,简单测试了下,目前能解决问题,不知道用户量上来后是否会带来其他问题,等后续再测试看看。
2 楼 shendixiong 2014-05-09  
efei 写道
不知楼主用openfire的时候是否存在丢包的问题,就是由于手机客户端网络异常断线等非正常掉线,这个时候发的消息就丢了,不知道有什么好的解决方法?谢谢。


    您好,会出现丢包的情况!
      (1).就是手机终端长时间搁置不动,会百分百出现。这种情况可以通过ping来解决!(这种情况,出现概率很高)
      (2).可以在openfire管理界面中的(Client Connections )设置会话超时时间
      (3).就是改源码
1 楼 efei 2014-05-06  
不知楼主用openfire的时候是否存在丢包的问题,就是由于手机客户端网络异常断线等非正常掉线,这个时候发的消息就丢了,不知道有什么好的解决方法?谢谢。

相关推荐

Global site tag (gtag.js) - Google Analytics