@Override public void run() { LoggedInInfo.setLoggedInInfoToCurrentClassAndMethod(); try { log.debug("start bed program discharge task"); Program[] bedPrograms = programManager.getBedPrograms(); if (bedPrograms == null) { log.error("getBedPrograms returned null"); return; } for (Program bedProgram : bedPrograms) { MiscUtilsOld.checkShutdownSignaled(); Date dischargeTime = DateTimeFormatUtils.getTimeFromString(DISCHARGE_TIME); Date previousExecutionTime = DateTimeFormatUtils.getTimeFromLong(scheduledExecutionTime() - PERIOD); Date currentExecutionTime = DateTimeFormatUtils.getTimeFromLong(scheduledExecutionTime()); // previousExecutionTime < dischargeTime <= currentExecutionTime if (previousExecutionTime.before(dischargeTime) && (dischargeTime.equals(currentExecutionTime) || dischargeTime.before(currentExecutionTime))) { Bed[] reservedBeds = bedManager.getBedsByProgram(bedProgram.getId(), true); if (reservedBeds == null) { log.error( "getBedsByProgram returned null for bed program with id: " + bedProgram.getId()); continue; } for (Bed reservedBed : reservedBeds) { MiscUtilsOld.checkShutdownSignaled(); BedDemographic bedDemographic = bedDemographicManager.getBedDemographicByBed(reservedBed.getId()); if (bedDemographic != null && bedDemographic.getId() != null && bedDemographic.isExpired()) { try { admissionManager.processDischargeToCommunity( Program.DEFAULT_COMMUNITY_PROGRAM_ID, bedDemographic.getId().getDemographicNo(), Provider.SYSTEM_PROVIDER_NO, "bed reservation ended - automatically discharged", "0", null); } catch (AdmissionException e) { log.error("Error discharging to community", e); } } } } } log.debug("finish bed program discharge task"); } catch (ShutdownException e) { log.debug("BedProgramDischargeTask noticed shutdown signaled."); } finally { LoggedInInfo.loggedInInfo.remove(); DbConnectionFilter.releaseAllThreadDbResources(); } }