0

JSP Struts/Hibernate アプリケーションの別の Java ファイルに Quartz スケジューラを組み込みました。私のexecuteメソッドは以下のようになります:

public void execute(JobExecutionContext jExeCtx) throws JobExecutionException {
       try {
        userDetailManager = new UserDetailManagerImpl();
        userDetailManager.sendMailTxnDetailsEveryNight();
    } catch (ApplicationException ex) {
        java.util.logging.Logger.getLogger(JobClass.class.getName()).log(Level.SEVERE, null, ex);
    }
 }

次に、sendMailTxnDetailsEveryNight メソッドを呼び出すと、次のようになります。

public void sendMailTxnDetailsEveryNight() throws ApplicationException{
    List<RemittanceTransactionBean> rBean = remittanceTransactionDao.getTodayTxnSummary();
return rBean;
}

指定された時点で nullpointerException を取得しています:

java.lang.NullPointerException
at com.mtmrs.business.user.impl.UserDetailManagerImpl.sendMailTxnDetailsEveryNight(UserDetailManagerImpl.java:754)
at com.mtmrs.util.common.JobClass.execute(JobClass.java:44)

getTodayTxnSummary(); を呼び出すにはどうすればよいですか? エラーが発生しないように。applicationContext にも remittanceTransactionDao を定義しました。

<bean id="userDetailManager" parent="abstractTxDefinition">
    <property name="target">
        <bean class="com.mtmrs.business.user.impl.UserDetailManagerImpl">
        <property name="remittanceTransactionDao" ref="remittanceTransactionDao"></property>
        </bean>
    </property>
</bean>

デバッグを試みたところ、remittanceTransactionDao が null であることがわかりました。メソッド remittanceTransactionDao を呼び出す前に、以下の設定も試しました。このように、sendMailTxnDetailsEveryNight で使用しているセッション変数は null です。私はここで立ち往生しています。

remittanceTransactionDao = new RemittanceTransactionDaoHibernate(RemittanceTransaction.class);
4

1 に答える 1

0

クラスを削除し、application-Context Dao.xml で次のように構成しました。

<bean name="runMeJob" class="org.springframework.scheduling.quartz.JobDetailBean">

    <property name="jobClass" value="com.mtmrs.util.common.RunMeJob" />

    <property name="jobDataAsMap">
        <map>
            <entry key="userDetailManager" value-ref="userDetailManager" />
        </map>
    </property>

</bean>
<bean id="cronTrigger"
      class="org.springframework.scheduling.quartz.CronTriggerBean">

    <property name="jobDetail" ref="runMeJob" />
    <property name="cronExpression" value="0 0 10,12,14,16,18,20,22,23 * * ?" />
</bean>

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="jobDetails">
        <list>
            <ref bean="runMeJob" />
        </list>
    </property>

    <property name="triggers">
        <list>
            <ref bean="cronTrigger" />
        </list>
    </property>
</bean>

次に、作成しようとしていたクォーツ実装コードに関するすべてを削除し、次のクラスを追加しました。

package com.mtmrs.util.common;
import com.mtmrs.business.user.UserDetailManager;
import com.mtmrs.util.logger.MTMRSLogger;
import com.mtmrs.util.logger.ApplicationException;
import java.util.logging.Level;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;


public class RunMeJob extends QuartzJobBean {

UserDetailManager userDetailManager;

public UserDetailManager getUserDetailManager() {
    return userDetailManager;
}

public void setUserDetailManager(UserDetailManager userDetailManager) {
    this.userDetailManager = userDetailManager;
}

@Override
protected void executeInternal(JobExecutionContext context)
        throws JobExecutionException {
    System.out.print("Entering Class: Job Class , method: execute");
    try {
        userDetailManager.sendMailTxnDetailsEveryNight();
    } catch (ApplicationException ex) {
        java.util.logging.Logger.getLogger(RunMeJob.class.getName()).log(Level.SEVERE, null, ex);
    }
    System.out.print("Exiting Class: Job Class , method: execute");

}

}

また、Quartz jar のバージョンを 1.x にダウングレードしました。トリガーで指定された 2 時間ごとに実行されるジョブとして、userDetailManager (つまり、sendMailTxnDetailsEveryNight) オブジェクトのメソッドを使用する必要がありました。

基本的に、私はこのリンクをたどりました: Mykong これが誰かの役に立てば幸いです。

于 2013-04-25T04:32:48.310 に答える