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

时间:2017-02-20 16:10:00

标签: java eclipse tomcat java-8 jvm

我已经将一个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();
    }

2 个答案:

答案 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标记。