我已经将一个Spring 4应用程序部署到tomcat服务器,该服务器托管在CentOS VM的数字海洋云中。该应用程序是一个移动后端应用程序,主要是Rest API。 JDK是openjdk版本“1.8.0_111” OpenJDK运行时环境(build 1.8.0_111-b15) OpenJDK 64位服务器VM(版本25.111-b15,混合模式),以及Apache Tomcat / 7.0.54和数据库托管在另一个VM中。
应用程序正常运行,但有时应用程序中存在异常行为。
我使用Log4j记录了来自前端(ieMobile)的每个REST Controller
调用,并使用tail -f /usr/share/tomcat/logs/someapp/info.log
来查看运行时的日志。前端API调用通常是异步的,服务器行为是预期的。但是在某些设备上测试时,行为很奇怪。
当设备进行API调用时,日志不会打印API调用记录,并且响应也不正确。
所以我从Eclipse进行了远程调试,但速度非常慢(需要几分钟才能达到断点,不知道如何快速完成),JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom -Djava.awt.headless=true -Xmx3072m -XX:MaxPermSize=256m -XX:+UseConcMarkSweepGC -Xdebug -agentlib:jdwp=transport=dt_socket,address=8090,server=y,suspend=n"
中有tomcat.conf
。即使在附加调试器时,行为也是相同的,响应在前端但没有日志,也没有命中断点和不正确的数据。但是当从Postman
调用相同的API时,它会被命中,并且还会记录日志并且数据也是正确的。
前端调用是异步的,同时调用多个API。
我尝试复制本地计算机中的行为但无法复制,行为符合预期,响应数据也正确。
但是当单个/(或更少)调用完成时,API调用会按预期记录,非常奇怪。
JVM是否进行了一些缓存?或者它一次在多个API调用上给出这样的行为?或者需要一些配置?
帮助,建议......赞赏。
我的代码: 控制器:
@RequestMapping(value="/get_VIP_requests/{fbId}", method = RequestMethod.GET)
public ResponseEntity<ServiceResponse> getVIPRequests(@RequestHeader HttpHeaders headers,@PathVariable("fbId") Long fbId){
try {
HeaderDto headerDto = new HeaderDto();
GeneralUtil.fillHeaderCredential(headers, headerDto, GeneralUtil.ACCESS_TOKEN);
ServiceResponse serviceResponse = new ServiceResponse("Users have been retrieved successfully");
serviceResponse.addParam("users",clientService.listVIPRequests(fbId));
return new ResponseEntity<ServiceResponse>(serviceResponse, HttpStatus.OK);
} catch (Exception e){
GeneralUtil.logError(log, "Error Occurred while getting users", e);
HttpHeaders httpHeaders = ServiceResponse.generateRuntimeErrors(e);
return new ResponseEntity<ServiceResponse>(httpHeaders, HttpStatus.EXPECTATION_FAILED);
}
}
服务:
@Override
public List<UserEntity> listVIPRequests(Long vipFbId) throws Exception {
List<UserEntity> requesterList = myVIPDao.listVIPRequestsNormal(vipFbId);
List<UserEntity> blockedUsers = userFriendshipDao.listUsersByStatus(vipFbId, UserFriendshipStatus.BLOCKED);
List<UserEntity> usersWhoHaveBlockedMe = userFriendshipDao.listUsersWhoHaveBlockedMe(vipFbId, UserFriendshipStatus.BLOCKED);
requesterList.removeAll(blockedUsers);
requesterList.removeAll(usersWhoHaveBlockedMe);
List<UserEntity> responseList = new ArrayList<>();
for (UserEntity user : requesterList) {
UserEntity returnUser = new UserEntity();
returnUser.setEntityId(user.getEntityId());
returnUser.setFacebookId(user.getFacebookId());
returnUser.setFullName(user.getFullName());
returnUser.setEmail(user.getEmail());
returnUser.setGender(user.getGender());
returnUser.setPushNotificationStatus(null);
returnUser.setProfileImageUrl(user.getProfileImageUrl());
returnUser.setInfo(user.getInfo());
responseList.add(returnUser);
}
List<BusinessEntity> businessRequesterList = myVIPDao.listVIPRequestsBusiness(vipFbId);
if(businessRequesterList!=null & !businessRequesterList.isEmpty()){
businessRequesterList.stream().forEach(b -> {
UserEntity returnUser = new UserEntity();
returnUser.setBusinessId(b.getEntityId()); //To identify if the request is from business a/c or normal a/c
returnUser.setEntityId(b.getEntityId());
returnUser.setFacebookId(b.getOwner().getFacebookId());
returnUser.setFullName(b.getBusinessName());
returnUser.setEmail(b.getWebUrl());
returnUser.setGender(Gender.Male);
returnUser.setPushNotificationStatus(null);
returnUser.setProfileImageUrl(b.getProfileImage());
returnUser.setInfo(b.getDescription());
responseList.add(returnUser);
});
}
return responseList;
}
DAO:
@SuppressWarnings("unchecked")
@Override
public List<UserEntity> listVIPRequestsNormal(Long vipFbId) throws Exception {
Criteria criteria = getCurrentSession().createCriteria(MyVipEntity.class, "v1");
criteria.createAlias("v1.friend", "vip");
criteria.createAlias("v1.organizer", "organizer");
criteria.add(Restrictions.eq("v1.requestStatus", VIPStatus.REQUESTED));
criteria.add(Restrictions.eq("vip.facebookId", vipFbId));
criteria.add(Restrictions.isNull("v1.business"));
criteria.setProjection(Projections.property("organizer"));
criteria.addOrder(Order.asc("organizer.fullName"));
return (List<UserEntity>) criteria.list();
}
@SuppressWarnings("unchecked")
@Override
public List<BusinessEntity> listVIPRequestsBusiness(Long vipFbId) throws Exception {
Criteria criteria = getCurrentSession().createCriteria(MyVipEntity.class, "v1");
criteria.createAlias("v1.friend", "vip");
criteria.createAlias("v1.business", "business");
criteria.add(Restrictions.eq("v1.requestStatus", VIPStatus.REQUESTED));
criteria.add(Restrictions.eq("vip.facebookId", vipFbId));
criteria.add(Restrictions.isNotNull("v1.business"));
criteria.setProjection(Projections.property("v1.business"));
criteria.addOrder(Order.asc("business.businessName"));
return (List<BusinessEntity>) criteria.list();
}
答案 0 :(得分:2)
一个可能的原因可能是Cache-Control
标题。
我相信,默认情况下,它被正确设置为Cache-Control: no-cache, no-store, max-age=0, must-revalidate
,这将导致客户端应用程序不缓存请求/响应。
检查此问题的快速方法是验证响应标头。如果Cache-Control响应标头建议缓存响应,则可以配置spring以轻松更改该行为。
以下是Mozilla网站上有关此标题的详细文章:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
答案 1 :(得分:1)
您希望数据位于正文还是标题中?您可能在返回时错过了@ResponseBody标记。