2

私は非常に基本的なシナリオでいくつかの問題を抱えています: 私は Java Web アプリ (Spring 3) を持っていて、いくつかのオブジェクトをスタックに保存したいと考えています。次に、スタック内のオブジェクトをスケジューラーで管理したいので、Quartz ジョブを実装しました。簡潔でシンプル。@Autowired アノテーションを使用して、最初のサービス クラスとジョブ クラスにスタックを挿入します。サービス クラスの場合、テーブルは正常に挿入されますが、ジョブ クラスの場合、テーブルは null です。コードは次のとおりです。

共有するクラス

package it.unifi.det.telemat.vr.data;
@Component
public class IndexedNodesStack extends HashMap<IndexedObject, Boolean>{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Override
    public synchronized int size() {
        // TODO Auto-generated method stub
        return super.size();
    }

    //all the HashMap methods are implemented in a synchronized wrapper method

}

最初のクラス (@Autowired は成功)

package it.unifi.det.telemat.vr.service;
@Service
public class InnerNodeManager extends ConcreteNodeManager{

    @Autowired
    private IndexedNodesStack indexedNodesStack; //<--- it is actually autowired!


    private void manageIndexedNodes(Boolean isPut, String lri, String features)
    {
        IndexedObject indexedObject = new IndexedObject();
        indexedObject.setId(lri);
        if(features != null && isPut)
            indexedObject.generateFeatures(features);

        indexedNodesStack.put(indexedObject, isPut);
    }

}

ジョブクラス (@Autowired は失敗)

package it.unifi.det.telemat.vr.service.scheduler;
@Component
public class QuartzJSearchJob extends QuartzJobBean{

    @Autowired
    private IndexedNodesStack indexedNodesStack; //<--- this variable is null :-(

    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException
    {
        //do work       
    }
}

編集:ここに servlet.xml があります

<context:component-scan base-package="it.unifi.det.telemat.vr" />

<bean name="searchJob"
class="org.springframework.scheduling.quartz.JobDetailBean">
    <property name="jobClass" value="it.unifi.det.telemat.vr.service.scheduler.QuartzJSearchJob" />
</bean>

<bean id="searchJobTrigger"
class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail" ref="searchJob" />
    <property name="cronExpression" value="0/50 * * * * ?" />
</bean>

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

この分野では初めての試みなので、スレッド間のリソース共有についての知識が不足しているかもしれません。私は何が欠けていますか?

4

6 に答える 6

2

わかりました、ようやくポイントがわかりました。spring は QuartzJSearchJob をインスタンス化しないため、これは機能しません。ジョブ内に注入する Bean は、 経由で渡す必要がありますSchedulerFacoryBean。物事を機能させる構成は次のとおりです。

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
        <list>
            <ref bean="searchJobTrigger" />
        </list>
    </property>
    <property name="schedulerContextAsMap">
    <map>
       <entry key="indexedNodesStack" value-ref="indexedNodesStack" />
    </map>
    </property>
</bean>
于 2012-05-04T09:40:25.540 に答える
2

自動配線は、Bean が Spring Bean ファクトリから作成された場合にのみ機能します。Bean ファクトリを使用せずにオブジェクトを作成しましたか。つまり、new QuartzJSearchJob()構文を使用して作成しましたか?

于 2012-05-03T17:12:09.527 に答える
0

私は同じ問題を抱えています。メソッドSpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);の最初の行として追加することでこれを解決しました。Job.execute(JobExecutionContext context)

于 2016-11-24T15:28:00.620 に答える
0

「jobDetails」プロパティを忘れた場合:

<property name="jobDetails">
    <list>
        <ref bean="searchJob" />
    </list>
</property>

org.springframework.scheduling.quartz.JobDetailFactoryBeanの代わりに使用する必要もありますorg.springframework.scheduling.quartz.JobDetailBean

次のように挿入します。

<bean name="searchJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
    <property name="jobClass" value="it.unifi.det.telemat.vr.service.scheduler.QuartzJSearchJob" />
</bean>

<bean id="searchJobTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail" ref="searchJob" />
    <property name="cronExpression" value="0/50 * * * * ?" />
</bean>

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
        <list>
            <ref bean="searchJobTrigger" />
        </list>
    </property>
    <property name="jobDetails">
        <list>
            <ref bean="searchJob" />
        </list>
    </property>
</bean>
于 2015-01-09T15:43:24.810 に答える
0

QuartzJSearchJobクラスレベルのアノテーションがないため、Bean として認識されません。試す@Component

于 2012-05-03T17:11:13.830 に答える
-2

scheduleFactoryBeanに値を割り当てる必要があると思いますsetSchedulerContextAsMap()。オブジェクトをこのマップに配置すると、機能します。

@Bean(name = "scheduler")
  public SchedulerFactoryBean schedulerFactory()
  {
    SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean();
    schedulerFactory.setDataSource(dataSource);
    schedulerFactory.setAutoStartup(true);
    schedulerFactory.setGlobalJobListeners(globalJobListeners);
    schedulerFactory.setSchedulerContextAsMap(contextMap());
    schedulerFactory.setQuartzProperties(schedulerProperties());
    return schedulerFactory;
  }
于 2014-12-18T09:37:47.113 に答える