私はしばらくSpring-Quartzをいじっていましたが、達成できないことが1つあります。私が持っているクラスでメソッドを実行するために「MethodInvokingJobDetailFactoryBean」を使用したいのですが、トリガーがトリガーされるたびに作成されるそのオブジェクトの新しいインスタンス。
Quartz に関連するアプリケーション コンテキストの部分は次のようになります。
<bean id="myTask" class="com.test.TestImpl" scope="prototype" /> <!-- The bean that does the actual work -->
<bean id="testMethodJobDetailBean" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="myTask"/>
<property name="targetMethod" value="run"/>
<property name="concurrent" value="false"/>
</bean>
<bean id="testTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="testMethodJobDetailBean"/>
<property name="startDelay" value="25000"/>
<property name="repeatInterval" value="5000"/>
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="waitForJobsToCompleteOnShutdown" value="true"/>
<property name="triggers">
<list>
<ref bean="testTrigger"/>
</list>
</property>
</bean>
私のオブジェクトの名前は元のファイルとは異なり、さらに 2 つのジョブ (それぞれにトリガーがあります) がありますが、それらは私の質問には関係ありません。
上記の構成は機能し、私のタスクは 5 秒ごとに実行されます。問題は、オブジェクトがその動作に影響を与える状態を持っているため、常に同じ「com.test.TestImpl」インスタンスを使用することです。
Quartz のデフォルトの動作は毎回ジョブの新しいインスタンスを作成することですが、Spring-Quartz を使用すると、Spring がライフサイクルを管理します。これは確かに論理的に思えます。そのため、scope="prototype" を "myTask" Bean に追加しましたが、役に立ちませんでした。また、JobDetailsFactory Bean のスコープをプロトタイプに設定しようとしましたが、役に立ちませんでした。
問題は、「MethodInvokingJobDetailFactoryBean」によって作成された JobDetail オブジェクトがプロトタイプとして定義されていないことだと思います。これは、Bean をラップしているため、1 回しか作成されないため、Bean は複数回作成されません。
この問題に関する有用な情報を見つけることができず、同じ動作を経験した人を見つけることができなかったため、他の誰かがこれに遭遇したかどうかを知りたい. もちろん、これを修正する方法を知っていれば、喜んでお知らせします。