gpt4 book ai didi

java - 部署在 tomcat 中的 java 应用程序中的异常行为

转载 作者:搜寻专家 更新时间:2023-11-01 02:58:54 26 4
gpt4 key购买 nike

我已经将 Spring 4 应用程序部署到托管在 Digital Ocean 云(CentOS 虚拟机)中的 tomcat 服务器。该应用程序是一个移动后端应用程序,主要是 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 中。

应用程序正常工作,但有时应用程序会出现异常行为。我记录了每一个 REST Controller使用 Log4j 从前端(即移动)调用,我使用 tail -f /usr/share/tomcat/logs/someapp/info.log查看运行时日志。前端 API 调用通常是异步的,服务器行为符合预期。但是在某些设备上测试时,行为很奇怪。设备进行API调用时,log不打印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 调用给出这样的行为?或者需要一些配置?

帮助、建议..感激不尽。

我的代码: Controller :

@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;
}

道:

@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();
}

最佳答案

一个可能的原因可能是 Cache-Control header 。

我相信,默认情况下它被正确设置为 Cache-Control: no-cache, no-store, max-age=0, must-revalidate 这将指示客户端应用程序不缓存请求/响应。

检查这一点的快速方法是验证响应 header 。如果 Cache-Control 响应 header 建议缓存响应,您可以配置 spring 以轻松更改该行为。

这是 Mozilla 网站上关于此 header 的详细文章:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control

关于java - 部署在 tomcat 中的 java 应用程序中的异常行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42349286/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com