Dies ist mein 1. Mal versuchen Spring3's @Scheduled , aber fand ich kann nicht an DB zu begehen. Dies ist mein Code:
@Service
public class ServiceImpl implements Service , Serializable
{
@Inject
private Dao dao;
@Override
@Scheduled(cron="0 0 * * * ?")
@Transactional(rollbackFor=Exception.class)
public void hourly()
{
// get xxx from dao , modify it
dao.update(xxx);
}
}
Ich denke, es sollte funktionieren, ich kann sehen, dass es stündlich startet und xxx aus der DB lädt, aber die Daten werden nicht in die DB übertragen.
Es gab schon tx:annotation-driven
in der xml des Frühlings:
<bean id="entityManagerFactoryApp" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="myapp"/>
</bean>
<bean id="transactionManagerApp" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactoryApp" />
</bean>
<tx:annotation-driven transaction-manager="transactionManagerApp" />
Kann mir jemand sagen, was ich hier verpasst habe?
Ich habe eine ' schmutzig ' Lösung:
@Service
public class ServiceImpl implements Service , Serializable
{
@Inject
private Dao dao;
@Inject
@Qualifier("transactionManagerApp")
private PlatformTransactionManager txMgrApp;
@Override
@Scheduled(cron="0 0 * * * ?")
@Transactional(rollbackFor=Exception.class)
public void hourly()
{
final TransactionTemplate txTemplateApp = new TransactionTemplate(txMgrApp);
txTemplateApp.execute(new TransactionCallbackWithoutResult()
{
@Override
protected void doInTransactionWithoutResult(TransactionStatus status)
{
//get xxx from dao
dao.update(xxx);
}
});
}
}
Es funktioniert einwandfrei hier, aber es ist so redundant, dass der Code schwerer zu lesen ist. Ich frage mich, warum TransactionManager wird nicht injiziert (und geöffnet) in den vorherigen Codeschnipseln?
Herzlichen Dank!