Results 1 to 2 of 2

Thread: Properly configuring declarative transactions with Quartz and Hibernate

  1. #1
    Join Date
    Nov 2008
    Posts
    4

    Default Properly configuring declarative transactions with Quartz and Hibernate

    Hi there!

    I'm doing something basic wrong and I'm not quite sure what it is. My Quartz code is running fine, and my Hibernate services run fine and are transactional and all that, but I can't get my Quartz beans to be wrapped in a Hibernate transaction. I've tried quite a few different things, but nothing's quite working.


    Here's the XML in beans.xml, my basic stuff.
    Code:
    		<tx:advice id="txAdvice" transaction-manager="txManager">
    			<tx:attributes>
    				<tx:method name="*" propagation="REQUIRED"/>
    			</tx:attributes>
    		</tx:advice>
    		
    		<aop:config>
    			<aop:pointcut id="serviceOperations" expression="execution(* com.tamedtornado.services.*.*(..))"/>
    			<aop:pointcut id="adminServiceOperations" expression="execution(* com.tamedtornado.services.admin.*.*(..))"/>
    
    			<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperations"/>
    			<aop:advisor advice-ref="txAdvice" pointcut-ref="adminServiceOperations"/>
    		</aop:config>
    
    		<!-- Needed a seperate one, for some reason admin wasn't being included in the above pointcut -->
    
    	
    		<bean id="myDataSource" class="org.apache.tomcat.dbcp.dbcp.BasicDataSource">
    			<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    			<property name="url" value="jdbc:mysql://localhost:3306/gangster"/>
    			<property name="username" value="*"/>
    			<property name="password" value="*"/>
    		</bean>
    	
    		<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    			<property name="sessionFactory" ref="mySessionFactory"/>
    		</bean>
    
    
    		<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    			<property name="dataSource" ref="myDataSource"/>
    			<property name="mappingDirectoryLocations">
    				<list>
    					<value>WEB-INF/mapping</value>
    				</list>
    			</property>
    			<property name="hibernateProperties">
    				<props>
    					<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
    				</props>
    			</property>
    		</bean>
    Here's the stuff I added this morning for Quartz and is not working like I expected.

    Code:
    		<aop:config>
    			<aop:pointcut id="jobOperations" expression="execution(* com.tamedtornado.server.*.*(..))"/>
    			<aop:advisor advice-ref="txAdvice" pointcut-ref="jobOperations"/>
    		</aop:config>
    
    		<bean name="testJob" class="org.springframework.scheduling.quartz.JobDetailBean">
    			<property name="jobClass" value="com.tamedtornado.server.TestQuartzBean"/>
    			<property name="jobDataAsMap">
    				<map>
    					<entry key="blah" value="DUDE"/>
    
    <!-- This is always null, I managed to pass it in through the factory bean, but still no transactional context when I use getCurrentSession() -->
    					<entry key="sessionFactory" value-ref="mySessionFactory"/>
    
    				</map>
    			</property>
    		</bean>
    		
    		<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
    			<property name="jobDetail" ref="testJob"/>
    			
    			<property name="startDelay" value="1000"/>
    			
    			<property name="repeatInterval" value="10000"/>
    		</bean>
    		
    		<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    			<property name="triggers">
    				<list>
    					<ref bean="simpleTrigger"/>
    				</list>
    			</property>
    		</bean>
    I've been tinkering with this, so it's not how it was when I got closest to success, which meant I got my session factory injected, but still had no transactional context when I used getCurrentSession().

    I'm sure I'm just doing something stupid, can anyone help me out here?

  2. #2
    Join Date
    Nov 2008
    Posts
    4

    Default

    Ok, I solved my own problem, thankfully.

    So, rather than do it the traditional way, I had to use the MethodInvokingJobDetailFactoryBean, which worked like a charm.

    New config is thus:

    Code:
    		<aop:config>
    			<aop:pointcut id="jobOperations" expression="execution(* com.tamedtornado.server.*.*(..))"/>
    			<aop:advisor advice-ref="txAdvice" pointcut-ref="jobOperations"/>
    		</aop:config>
    
    		<bean id="testJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    			<property name="targetObject" ref="testQuartzBean"/>
    			<property name="targetMethod" value="doIt"/>
    			<property name="concurrent" value="false"/>
    		</bean>
    		
    		<bean id="testQuartzBean" class="com.tamedtornado.server.TestQuartzBean">
    			<property name="sessionFactory" ref="mySessionFactory"/>
    		</bean>
    Can anyone tell me what I did wrong in the first config for it to not even try to wrap it in a proxy?

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •