Skip to content

Commit

Permalink
fix issue javamelody#638 ClassNotFoundException in Jenkins script + r…
Browse files Browse the repository at this point in the history
…efactoring
  • Loading branch information
evernat authored and elnggng committed Mar 17, 2022
1 parent 75acbf6 commit 7f43db9
Show file tree
Hide file tree
Showing 8 changed files with 63 additions and 102 deletions.
16 changes: 0 additions & 16 deletions javamelody-collector-server/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -68,22 +68,6 @@
<artifactId>slf4j-api</artifactId>
<version>1.5.11</version>
</dependency>
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>1.6.0</version>
</dependency>
<dependency>
<groupId>quartz</groupId>
<artifactId>quartz</artifactId>
<version>1.5.2</version>
<exclusions>
<exclusion>
<artifactId>commons-logging</artifactId>
<groupId>commons-logging</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
Expand Down
2 changes: 0 additions & 2 deletions javamelody-core/build.xml
Original file line number Diff line number Diff line change
Expand Up @@ -167,8 +167,6 @@
<include name="xstream-1.4.9.jar" />
<include name="xpp3_min-1.1.4c.jar" />
<include name="xmlpull-1.1.3.1.jar" />
<include name="ehcache-1.6.0.jar" />
<include name="quartz-1.5.2.jar" />
</zipfileset>
<!-- web.xml -->
<zipfileset file="src/main/collector-webapp/**" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -492,11 +492,11 @@ private String pauseJob(String jobId) {

private boolean pauseJobById(int myJobId) {
try {
final QuartzAdapter quartzAdapter = QuartzAdapter.getSingleton();
for (final Scheduler scheduler : JobInformations.getAllSchedulers()) {
for (final JobDetail jobDetail : JobInformations.getAllJobsOfScheduler(scheduler)) {
if (QuartzAdapter.getSingleton().getJobFullName(jobDetail)
.hashCode() == myJobId) {
QuartzAdapter.getSingleton().pauseJob(jobDetail, scheduler);
for (final JobDetail jobDetail : quartzAdapter.getAllJobsOfScheduler(scheduler)) {
if (quartzAdapter.getJobFullName(jobDetail).hashCode() == myJobId) {
quartzAdapter.pauseJob(jobDetail, scheduler);
return true;
}
}
Expand Down Expand Up @@ -540,11 +540,11 @@ private String resumeJob(String jobId) {

private boolean resumeJobById(int myJobId) {
try {
final QuartzAdapter quartzAdapter = QuartzAdapter.getSingleton();
for (final Scheduler scheduler : JobInformations.getAllSchedulers()) {
for (final JobDetail jobDetail : JobInformations.getAllJobsOfScheduler(scheduler)) {
if (QuartzAdapter.getSingleton().getJobFullName(jobDetail)
.hashCode() == myJobId) {
QuartzAdapter.getSingleton().resumeJob(jobDetail, scheduler);
for (final JobDetail jobDetail : quartzAdapter.getAllJobsOfScheduler(scheduler)) {
if (quartzAdapter.getJobFullName(jobDetail).hashCode() == myJobId) {
quartzAdapter.resumeJob(jobDetail, scheduler);
return true;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,10 @@ public class CacheInformations implements Serializable {
private static final boolean EHCACHE_1_6 = isEhcache16();
private static final boolean EHCACHE_1_2 = isEhcache12();
private static final boolean EHCACHE_1_2_X = isEhcache12x();

// cache must not be serialized and neither typed,
// otherwise serialization would not work in the collector server or in jenkins scripts
private final transient Object cache;
private final String name;
private final long inMemoryObjectCount;
private final int inMemoryPercentUsed;
Expand All @@ -62,6 +66,7 @@ public class CacheInformations implements Serializable {
CacheInformations(Ehcache cache, boolean includeKeys) {
super();
assert cache != null;
this.cache = cache;
this.name = cache.getName();

if (includeKeys) {
Expand All @@ -81,8 +86,8 @@ public class CacheInformations implements Serializable {
this.cacheMisses = statistics.getCacheMisses(); // ou devrait être cache.getStatistics().cacheMissCount() en v2.7.0
// en raison du bug https://jira.terracotta.org/jira/browse/EHC-1010
// la valeur de l'efficacité du cache (hits/accesses) est fausse si ehcache 2.7.0
this.inMemoryPercentUsed = getMemoryPercentUsed(cache);
this.configuration = buildConfiguration(cache);
this.inMemoryPercentUsed = computeMemoryPercentUsed();
this.configuration = buildConfiguration();
return;
}

Expand Down Expand Up @@ -120,8 +125,8 @@ public class CacheInformations implements Serializable {
this.inMemoryHits = statistics.getInMemoryHits();
this.cacheHits = statistics.getCacheHits();
this.cacheMisses = statistics.getCacheMisses();
this.inMemoryPercentUsed = getMemoryPercentUsed(cache);
this.configuration = buildConfiguration(cache);
this.inMemoryPercentUsed = computeMemoryPercentUsed();
this.configuration = buildConfiguration();
}
}

Expand Down Expand Up @@ -266,19 +271,20 @@ private static boolean isEhcache12x() {
}
}

private int getMemoryPercentUsed(Ehcache cache) {
final int maxElementsInMemory = cache.getCacheConfiguration().getMaxElementsInMemory();
private int computeMemoryPercentUsed() {
final int maxElementsInMemory = ((Ehcache) cache).getCacheConfiguration()
.getMaxElementsInMemory();
if (maxElementsInMemory == 0) {
// maxElementsInMemory peut être 0 (sans limite), cf issue 73
return -1;
}
return (int) (100 * inMemoryObjectCount / maxElementsInMemory);
}

private static String buildConfiguration(Ehcache cache) {
private String buildConfiguration() {
final StringBuilder sb = new StringBuilder();
// getCacheConfiguration() et getMaxElementsOnDisk() n'existent pas en ehcache 1.2
final CacheConfiguration config = cache.getCacheConfiguration();
final CacheConfiguration config = ((Ehcache) cache).getCacheConfiguration();
sb.append("ehcache [maxElementsInMemory = ").append(config.getMaxElementsInMemory());
final boolean overflowToDisk = config.isOverflowToDisk();
sb.append(", overflowToDisk = ").append(overflowToDisk);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,10 @@ public class JobInformations implements Serializable {
- quartzAdapter.getContextFireTime(jobExecutionContext).getTime();
}
final List<Trigger> triggers = quartzAdapter.getTriggersOfJob(jobDetail, scheduler);
this.nextFireTime = getNextFireTime(triggers);
this.previousFireTime = getPreviousFireTime(triggers);
final List<Date> previousAndNextFireTime = quartzAdapter
.getPreviousAndNextFireTime(triggers);
this.nextFireTime = previousAndNextFireTime.get(1);
this.previousFireTime = previousAndNextFireTime.get(0);

String cronTriggerExpression = null;
long simpleTriggerRepeatInterval = -1;
Expand All @@ -99,7 +101,8 @@ public class JobInformations implements Serializable {
this.repeatInterval = simpleTriggerRepeatInterval;
this.cronExpression = cronTriggerExpression;
this.paused = jobPaused;
this.globalJobId = buildGlobalJobId(jobDetail);
this.globalJobId = PID.getPID() + '_' + Parameters.getHostAddress() + '_'
+ quartzAdapter.getJobFullName(jobDetail).hashCode();
}

private static boolean isQuartzAvailable() {
Expand All @@ -119,22 +122,29 @@ static List<JobInformations> buildJobInformationsList() {
}
final List<JobInformations> result = new ArrayList<JobInformations>();
try {
final QuartzAdapter quartzAdapter = QuartzAdapter.getSingleton();
for (final Scheduler scheduler : getAllSchedulers()) {
final Map<String, JobExecutionContext> currentlyExecutingJobsByFullName = new LinkedHashMap<String, JobExecutionContext>();
for (final JobExecutionContext currentlyExecutingJob : (List<JobExecutionContext>) scheduler
.getCurrentlyExecutingJobs()) {
final JobDetail jobDetail = QuartzAdapter.getSingleton()
final JobDetail jobDetail = quartzAdapter
.getContextJobDetail(currentlyExecutingJob);
final String jobFullName = QuartzAdapter.getSingleton()
.getJobFullName(jobDetail);
final String jobFullName = quartzAdapter.getJobFullName(jobDetail);
currentlyExecutingJobsByFullName.put(jobFullName, currentlyExecutingJob);
}
for (final JobDetail jobDetail : getAllJobsOfScheduler(scheduler)) {
final String jobFullName = QuartzAdapter.getSingleton()
.getJobFullName(jobDetail);
final JobExecutionContext jobExecutionContext = currentlyExecutingJobsByFullName
.get(jobFullName);
result.add(new JobInformations(jobDetail, jobExecutionContext, scheduler));
try {
for (final JobDetail jobDetail : quartzAdapter
.getAllJobsOfScheduler(scheduler)) {
final String jobFullName = quartzAdapter.getJobFullName(jobDetail);
final JobExecutionContext jobExecutionContext = currentlyExecutingJobsByFullName
.get(jobFullName);
result.add(new JobInformations(jobDetail, jobExecutionContext, scheduler));
}
} catch (final Exception e) {
// si les jobs sont persistés en base de données, il peut y avoir une exception
// dans scheduler.getJobGroupNames(), par exemple si la base est arrêtée
LOG.warn(e.toString(), e);
return Collections.emptyList();
}
}
} catch (final Exception e) {
Expand All @@ -148,43 +158,6 @@ public static List<Scheduler> getAllSchedulers() {
return new ArrayList<Scheduler>(SchedulerRepository.getInstance().lookupAll());
}

static List<JobDetail> getAllJobsOfScheduler(Scheduler scheduler) {
try {
return QuartzAdapter.getSingleton().getAllJobsOfScheduler(scheduler);
} catch (final Exception e) {
// si les jobs sont persistés en base de données, il peut y avoir une exception
// dans scheduler.getJobGroupNames(), par exemple si la base est arrêtée
LOG.warn(e.toString(), e);
return Collections.emptyList();
}
}

private static Date getPreviousFireTime(List<Trigger> triggers) {
Date previousFireTime = null;
for (final Trigger trigger : triggers) {
final Date triggerPreviousFireTime = QuartzAdapter.getSingleton()
.getTriggerPreviousFireTime(trigger);
if (previousFireTime == null || triggerPreviousFireTime != null
&& previousFireTime.before(triggerPreviousFireTime)) {
previousFireTime = triggerPreviousFireTime;
}
}
return previousFireTime;
}

private static Date getNextFireTime(List<Trigger> triggers) {
Date nextFireTime = null;
for (final Trigger trigger : triggers) {
final Date triggerNextFireTime = QuartzAdapter.getSingleton()
.getTriggerNextFireTime(trigger);
if (nextFireTime == null
|| triggerNextFireTime != null && nextFireTime.after(triggerNextFireTime)) {
nextFireTime = triggerNextFireTime;
}
}
return nextFireTime;
}

public String getGlobalJobId() {
return globalJobId;
}
Expand Down Expand Up @@ -233,11 +206,6 @@ public boolean isPaused() {
return paused;
}

private static String buildGlobalJobId(JobDetail jobDetail) {
return PID.getPID() + '_' + Parameters.getHostAddress() + '_'
+ QuartzAdapter.getSingleton().getJobFullName(jobDetail).hashCode();
}

/** {@inheritDoc} */
@Override
public String toString() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,12 +94,22 @@ Class<?> getJobClass(JobDetail jobDetail) {
return jobDetail.getJobClass();
}

Date getTriggerPreviousFireTime(Trigger trigger) {
return trigger.getPreviousFireTime();
}

Date getTriggerNextFireTime(Trigger trigger) {
return trigger.getNextFireTime();
List<Date> getPreviousAndNextFireTime(List<Trigger> triggers) {
Date previousFireTime = null;
Date nextFireTime = null;
for (final Trigger trigger : triggers) {
final Date triggerPreviousFireTime = trigger.getPreviousFireTime();
final Date triggerNextFireTime = trigger.getNextFireTime();
if (previousFireTime == null || triggerPreviousFireTime != null
&& previousFireTime.before(triggerPreviousFireTime)) {
previousFireTime = triggerPreviousFireTime;
}
if (nextFireTime == null
|| triggerNextFireTime != null && nextFireTime.after(triggerNextFireTime)) {
nextFireTime = triggerNextFireTime;
}
}
return Arrays.asList(previousFireTime, nextFireTime);
}

String getCronTriggerExpression(CronTrigger trigger) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,15 +80,10 @@ Class<?> getJobClass(JobDetail jobDetail) {
}

@Override
Date getTriggerPreviousFireTime(Trigger trigger) {
return trigger.getPreviousFireTime();
List<Date> getPreviousAndNextFireTime(List<Trigger> triggers) { // NOPMD
return super.getPreviousAndNextFireTime(triggers);
}

@Override
Date getTriggerNextFireTime(Trigger trigger) {
return trigger.getNextFireTime();
}


@Override
String getCronTriggerExpression(CronTrigger trigger) {
// getCronExpression gives a PMD false+
Expand Down
Binary file not shown.

0 comments on commit 7f43db9

Please sign in to comment.