这次是在第一步通讯上面加以补充 离线消息用的redis 做消息队列,假设 Apache mina做推送 http端请求发送信息 全部是json格式统一
查询用户
public NewsObject findByName(NewsObject o) throws Exception{
// TODO Auto-generated method stub
Json json = new Json();
logger.info("com.xinhua.ServiceImpl.UserServiceImpl.findByName into");
if (((UserForm) o).getUsername() == null
|| ((UserForm) o).getUsername().equals("")) {
json.setReturnNo(USER_NULL);
logger.warn("login error code:"+USER_NULL);
return json;
} else if (((UserForm) o).getPassword() == null
|| ((UserForm) o).getPassword().trim().equals("")) {
json.setReturnNo(PASSWORD_NULL);
logger.warn("login error code:"+PASSWORD_NULL);
return json;
}
((UserForm) o).setUsername(((UserForm) o).getUsername().trim());
Users user = (Users) usersMapper.findByName(o);
if (user == null
|| !user.getUsername().equals(((UserForm) o).getUsername().trim())
|| !user.getPassword().equals(((UserForm) o).getPassword())) {
json.setReturnNo(USER_PASSWROD_ERROR);
logger.warn("login error code:"+USER_PASSWROD_ERROR);
return json;
}
json.setReturnNo(SESSION_CODE);
logger.info("User Login Success");
json.setRow(user);
logger.info("com.xinhua.ServiceImpl.UserServiceImpl.findByName into");
return json;
}
返回app 接口代码
public NewsObject loginApp(UserForm form) throws Exception {
// TODO Auto-generated method stub
Json json = (Json) findByName(form);
final String userid = ((Users)json.getRow()).getId();
//String url = "";
if((SESSION_CODE)==json.getReturnNo()){//如果等于session code 那么表示登录成功
form.setLoginKey(Resource.getInstall().randNumber());
json.setMsg(form.getLoginKey());
updateLoginKey(form);
//读取所有离线消息
List<Object> list = redisTemplate.opsForList().range(REDIS_MESSAGE+((Users)json.getRow()).getId(),0,redisTemplate.opsForList().size(REDIS_MESSAGE+((Users)json.getRow()).getId()));
for (Object object : list) {
System.out.println("list -------"+object);
}
((Users)json.getRow()).setMsgList(list); //读取redis 消息队列的消息 进行返回用户界面
//request.getRequestDispatcher("/user/web/index.do");
//url = "redirect:/user/web/index.do";//进行跳转操作
}
return json;
}
短链接发送消息代码 进行发送消息
public void sendMsg(NewsObject object) {
MessageForm form = (MessageForm)object;
UserForm user = new UserForm();
user.setId((form.getReviceId()));
Users users = ((Users)userService.findByIdGetUser(user));
if(users.getLoginStatus()==1){//如果在线表示Apache mina 在线 进行在线消息推送
Message message = new Message();
message.setType(5);//web版本短请求发送消息
user.setId(String.valueOf(form.getSendId()));
message.setUsername(((Users)userService.findByIdGetUser(user)).getUsername());
message.setMsg(form.getMsg());
message.setId(form.getId());
MyIoHandleWeb.getSession().write(JSON.toJSONString(message));
}
messageMapper.insertMessage(form);
redisTemplate.opsForList().rightPush(REDIS_MESSAGE+form.getReviceId(), JSON.toJSONString(form));
}
服务端核心代码 当接受消息是5表示推送消息 那么进行查询操作 进行消息推送
if(msg.getType()==5){
if(mina.map.get("user"+msg.getId()) != null){
mina.map.get("user"+msg.getId()).write(JSON.toJSONString(msg));//写到客户端
}
}
今天的代码更新到此 后续会做 一些新的功能