解決Shiro和Quartz2.X版本衝突問題

控制檯報錯的信息:java

nested exception is java.lang.IncompatibleClassChangeError: Implementing classapache

或者拋出異常:Java.lang.InstantiationErrorsession

查看包衝突:ui

右鍵項目—>Properties—>Java Build Path —>Libraries—>點開Maven Dependenciesthis

能夠看到shiro使用的1.6版本,我引用的是2.2.2版本,因此jar包衝突。spa


具體解決方式:debug

一、自定義實現QuartzSessionValidationJob類和QuartzSessionValidationScheduler類code

QuartzSessionValidationJob類:blog

package org.apache.shiro.session.mgt.quartz;

import org.apache.shiro.session.mgt.ValidatingSessionManager;  
import org.quartz.Job;  
import org.quartz.JobDataMap;  
import org.quartz.JobExecutionContext;  
import org.quartz.JobExecutionException;  
import org.slf4j.Logger;  
import org.slf4j.LoggerFactory;  

/** 
 * 基於Quartz 2.* 版本的實現 
 * 
 */  
public class QuartzSessionValidationJob implements Job {

	/** 
     * Key used to store the session manager in the job data map for this job. 
     */  
    public static final String SESSION_MANAGER_KEY = "sessionManager";  
  
    /*-------------------------------------------- 
    |    I N S T A N C E   V A R I A B L E S    | 
    ============================================*/  
    private static final Logger log = LoggerFactory.getLogger(QuartzSessionValidationJob.class);  
  
    /*-------------------------------------------- 
    |         C O N S T R U C T O R S           | 
    ============================================*/  
  
    /*-------------------------------------------- 
    |  A C C E S S O R S / M O D I F I E R S    | 
    ============================================*/  
  
    /*-------------------------------------------- 
    |               M E T H O D S               | 
    ============================================*/  
  
    /** 
     * Called when the job is executed by quartz. This method delegates to the <tt>validateSessions()</tt> method on the 
     * associated session manager. 
     * 
     * @param context 
     *            the Quartz job execution context for this execution. 
     */  
    public void execute(JobExecutionContext context) throws JobExecutionException {  
  
        JobDataMap jobDataMap = context.getMergedJobDataMap();  
        ValidatingSessionManager sessionManager = (ValidatingSessionManager) jobDataMap.get(SESSION_MANAGER_KEY);  
  
        if (log.isDebugEnabled()) {  
            log.debug("Executing session validation Quartz job...");  
        }  
  
        sessionManager.validateSessions();  
  
        if (log.isDebugEnabled()) {  
            log.debug("Session validation Quartz job complete.");  
        }  
    }  
  
}

QuartzSessionValidationScheduler類:ci

package org.apache.shiro.session.mgt.quartz;

import org.apache.shiro.session.mgt.DefaultSessionManager;
import org.apache.shiro.session.mgt.SessionValidationScheduler;
import org.apache.shiro.session.mgt.ValidatingSessionManager;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 基於Quartz 2.* 版本的實現
 */
public class QuartzSessionValidationScheduler implements SessionValidationScheduler {

	public static final long DEFAULT_SESSION_VALIDATION_INTERVAL = DefaultSessionManager.DEFAULT_SESSION_VALIDATION_INTERVAL;  
    private static final String JOB_NAME = "SessionValidationJob";  
    private static final Logger log = LoggerFactory.getLogger(QuartzSessionValidationScheduler.class);  
    private static final String SESSION_MANAGER_KEY = QuartzSessionValidationJob.SESSION_MANAGER_KEY;  
    private Scheduler scheduler;  
    private boolean schedulerImplicitlyCreated = false;  

    private boolean enabled = false;  
    private ValidatingSessionManager sessionManager;  
    private long sessionValidationInterval = DEFAULT_SESSION_VALIDATION_INTERVAL;  

    public QuartzSessionValidationScheduler() {  
    }  

    public QuartzSessionValidationScheduler(ValidatingSessionManager sessionManager) {  
        this.sessionManager = sessionManager;  
    }  

    protected Scheduler getScheduler() throws SchedulerException {  
        if (this.scheduler == null) {  
            this.scheduler = StdSchedulerFactory.getDefaultScheduler();  
            this.schedulerImplicitlyCreated = true;  
        }  
        return this.scheduler;  
    }  

    public void setScheduler(Scheduler scheduler) {  
        this.scheduler = scheduler;  
    }  

    public void setSessionManager(ValidatingSessionManager sessionManager) {  
        this.sessionManager = sessionManager;  
    }  

    public boolean isEnabled() {  
        return this.enabled;  
    }  

    public void setSessionValidationInterval(long sessionValidationInterval) {  
        this.sessionValidationInterval = sessionValidationInterval;  
    }  

    public void enableSessionValidation() {  
        if (log.isDebugEnabled()) {  
            log.debug("Scheduling session validation job using Quartz with session validation interval of ["  
                    + this.sessionValidationInterval + "]ms...");  
        }  

        try {  
            SimpleTrigger trigger = TriggerBuilder.newTrigger().startNow().withIdentity(JOB_NAME, Scheduler.DEFAULT_GROUP)  
                    .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInMilliseconds(sessionValidationInterval))  
                    .build();//<span style="color:#ff0000;">Quartz 2中的實現</span>  

            JobDetail detail = JobBuilder.newJob(QuartzSessionValidationJob.class)  
                    .withIdentity(JOB_NAME, Scheduler.DEFAULT_GROUP).build();  
            detail.getJobDataMap().put(SESSION_MANAGER_KEY, this.sessionManager);  
            Scheduler scheduler = getScheduler();  

            scheduler.scheduleJob(detail, trigger);  
            if (this.schedulerImplicitlyCreated) {  
                scheduler.start();  
                if (log.isDebugEnabled()) {  
                    log.debug("Successfully started implicitly created Quartz Scheduler instance.");  
                }  
            }  
            this.enabled = true;  

            if (log.isDebugEnabled())  
                log.debug("Session validation job successfully scheduled with Quartz.");  
        } catch (SchedulerException e) {  
            if (log.isErrorEnabled())  
                log.error("Error starting the Quartz session validation job.  Session validation may not occur.", e);  
        }  
    }  

    public void disableSessionValidation() {  
        if (log.isDebugEnabled()) {  
            log.debug("Stopping Quartz session validation job...");  
        }  
        Scheduler scheduler;  
        try {  
            scheduler = getScheduler();  
            if (scheduler == null) {  
                if (log.isWarnEnabled()) {  
                    log.warn("getScheduler() method returned a null Quartz scheduler, which is unexpected.  Please check your configuration and/or implementation.  Returning quietly since there is no validation job to remove (scheduler does not exist).");  
                }  

                return;  
            }  
        } catch (SchedulerException e) {  
            if (log.isWarnEnabled()) {  
                log.warn("Unable to acquire Quartz Scheduler.  Ignoring and returning (already stopped?)", e);  
            }  
            return;  
        }  
        try {  
        	//scheduler.unscheduleJob(JOB_NAME, Scheduler.DEFAULT_GROUP); //源代碼中的樣子
        	scheduler.unscheduleJob(new TriggerKey("SessionValidationJob", "DEFAULT")); //修改後
            if (log.isDebugEnabled())  
                log.debug("Quartz session validation job stopped successfully.");  
        } catch (SchedulerException e) {  
            if (log.isDebugEnabled()) {  
                log.debug("Could not cleanly remove SessionValidationJob from Quartz scheduler.  Ignoring and stopping.", e);  
            }  

        }  

        this.enabled = false;  

        if (this.schedulerImplicitlyCreated)  
            try {  
                scheduler.shutdown();  
            } catch (SchedulerException e) {  
                if (log.isWarnEnabled())  
                    log.warn("Unable to cleanly shutdown implicitly created Quartz Scheduler instance.", e);  
            } finally {  
                setScheduler(null);  
                this.schedulerImplicitlyCreated = false;  
            }  
    }  
	
}

二、註釋掉引用的shiro-quart包:

        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-quartz</artifactId>
            <version>1.2.5</version>
        </dependency>

而後重啓項目,完美解決。

轉載:http://nonobaba.iteye.com/blog/2312468

提示:轉載別人的文章請註明來源,很是鄙視那些粘貼別人文章還寫成本身原創的人,這樣的行爲和小偷沒什麼區別。

相關文章
相關標籤/搜索