Hi,

I'm using jdbcjobstore and have 3 triggers, executing 3 different jobs on the same table. It runs for about a minute and then all 3 triggers changes to error state?

schedulerContext.xml
Code:
<bean id="newFaultsTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
	    <!-- Start 10 seconds after app startup -->
	    <property name="startDelay" value="10000" />
	    <!-- repeat every 3 seconds -->
	    <property name="repeatInterval" value="3000" />
	    <property name="jobDetail">
			<bean class="za.co.telkom.portal.base.assurance.services.BeanInvokingJobDetailFactoryBean" name="ProcessNewFaults"> 
				<property name="concurrent" value="false"/>
				<property name="targetBean" value="faultManager" />
				<property name="targetMethod" value="processNewFaults" /> 				
			</bean>
		</property>	
	</bean>
	
	<bean id="postTicketsTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
	    <!-- Start 10 seconds after app startup -->
	    <property name="startDelay" value="10000" />
	    <!-- repeat every 60 seconds -->
	    <property name="repeatInterval" value="60000" />
	    <property name="jobDetail">
			<bean class="za.co.telkom.portal.base.assurance.services.BeanInvokingJobDetailFactoryBean" name="PostTickets"> 
				<property name="concurrent" value="false"/>
				<property name="targetBean" value="faultManager" />
				<property name="targetMethod" value="postTickets" /> 
			</bean>
		</property>	
	</bean>
	
	<bean id="expireFaultsTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
	    <!-- Start 10 seconds after app startup -->
	    <property name="startDelay" value="10000" />
	    <!-- repeat every 60 seconds -->
	    <property name="repeatInterval" value="60000" />
	    <property name="jobDetail">
			<bean class="za.co.telkom.portal.base.assurance.services.BeanInvokingJobDetailFactoryBean" name="ExpireFaults"> 
				<property name="concurrent" value="false"/>
				<property name="targetBean" value="faultManager" />
				<property name="targetMethod" value="expireFaults" /> 
			</bean>
		</property>	
	</bean>

	<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
	    <property name="triggers">
	        <list>
	            <ref bean="newFaultsTrigger" />
	            <ref bean="postTicketsTrigger" />	            
	            <ref bean="expireFaultsTrigger" />	            	            
	        </list>
	    </property>  
	    <property name="dataSource">
	    	<ref bean="dataSource" />
	    </property>
	    <property name="quartzProperties">            
	    	<props>                
	    		<prop key="org.quartz.scheduler.instanceName">ProcessFaultsScheduler</prop>                
	    		<prop key="org.quartz.scheduler.instanceId">AUTO</prop>             
	    			    		              
	    		<prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop>                
	    		<prop key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.StdJDBCDelegate</prop>                
	    		<prop key="org.quartz.jobStore.tablePrefix">qrtz_</prop>                
	    		<prop key="org.quartz.jobStore.isClustered">true</prop>      
	    		          
	    		<prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>                
	    		<prop key="org.quartz.threadPool.threadCount">25</prop>                
	    		<prop key="org.quartz.threadPool.threadPriority">5</prop>            
	    	</props>      
	    </property>
	</bean>	
</beans>
FaultManager.java
Code:
public void processNewFaults() throws PortalException {
		PotentialFault fault = new PotentialFault();
		try {			
			for (Iterator faults = faultDao.getFaults(Constants.NEW).iterator(); faults.hasNext();) {
				fault = (PotentialFault) faults.next();
				fault.setStatus(Constants.BUSY);
				faultDao.store(fault);

				/* 1.  Validate input fields */					
				if (validateInputFields(fault) == false){
					faultDao.store(fault);
					continue; // process next record
				}
				
				/* 2. Validate Feasibility against CBS*/
				if (verifyCbsFeasibility(fault) == false){
					faultDao.store(fault);
					continue; // process next record
				}
				
				/* 3. Validate Feasibility against CPH */
				if (verifyCphFeasibility(fault) == false){
					faultDao.store(fault);
					continue; // process next record
				}
				
				faultDao.store(fault);
			}
		} catch (Exception e){
			fault.setStatus(Constants.ERROR);
			fault.setFeasibilityResult(messageSource.getMessage("serviceProcessError",null,null));
			faultDao.store(fault);
			this.recordTransaction("Process potential fault", "", fault, e.toString(), TransactionRecorder.ERROR_FLAG);
		}
	}
	
	public void postTickets() throws PortalException {
		PotentialFault fault = new PotentialFault();		
					
		for (Iterator faults = faultDao.getFaults(Constants.SYMPTOM).iterator(); faults.hasNext();) {
			fault = (PotentialFault) faults.next();
				
			/* 1.  Validate input fields */					
			if (validateInputFields(fault) == false){
				faultDao.store(fault);
				continue; // process next record
			}
				
				/* ---------- Setup Ticket objects ----------- */
			Ticket ticket = new Ticket();
			try {	
	    		/* Ticket */
	    		ticket = new Ticket();
	    		ticket.setAcceptedTerms(false);	    			    		
	    				
	    		ticket.setCategory((faultDao.getSymptom(fault.getSymptom(), fault.getPartNumber()).getCategory()));
	    		ticket.setDateLogged(new Date());
	    		ticket.setFaultDescription(fault.getSymptom());
	    		
	    		ticket.setSymptom(fault.getSymptom());	    		
	    		
	    		/* TicketContact */
	    		TicketContact contact = new TicketContact();
	    		String businessHours = "08:00 - 17:00 AAH=N AAW=N";	    	
	    		contact.setBusinessHours(businessHours);
	    		contact.setCellphone(fault.getCellNumber());	    			    		  	
	    		ticket.setContact(contact); 		    		
	    		
	    		/* TicketService */
	    		TicketService service = ticketManager.getTicketService(fault.getDirectoryNumber());
	    		if (service == null){
	    			service = new TicketService();    			  	    			
	    		}	    		    		
	    		service.setPartNumber(fault.getPartNumber());	    		 		
	    		service.setProductDescription(fault.getFeasibilityResult());
	    		service.setServiceNumber(fault.getDirectoryNumber());
	    		service.setSpecialResource(fault.getSpecialResource()); 
	    		
	    		/* LineTestResult */	   	
	    		LineTestResult lineTestResult = new LineTestResult();
	    			    		
	    		if (fault.getLineTestable().equalsIgnoreCase("Y")) {
	    			service.setLineTestable(true);	  
	    			ticket.setService(service);
	    			
	    			try {    				
	    				lineTestResult = ticketManager.createTest(fault.getDirectoryNumber());
	    				ticket.setLineTestResult(lineTestResult);    			    		
	    			} catch (Exception e){
	    				lineTestResult.setTestDate(new Date());
	    				ticket.setLineTestResult(lineTestResult);
	    				// Do Nothing
	    			}	
				}else{
					lineTestResult.setTestResultCode("No Test");
					lineTestResult.setTestComment("No Test requested");
					ticket.setLineTestResult(lineTestResult);
					service.setLineTestable(false);
					ticket.setService(service);
				}
	    			    		
				ticketManager.store(ticket);
				fault.setStatus("Done");
				faultDao.store(fault);
				this.recordTransaction("Post fault to assurance", "Post fault to assurance", fault, "Post fault to assurance");
			} catch (Exception e){
				fault.setStatus(Constants.ERROR);
				fault.setFeasibilityResult(messageSource.getMessage("serviceProcessError",null,null));
				faultDao.store(fault);
				ticketManager.prepareAndSendEmail(ticket);
				this.recordTransaction("Post fault to assurance", "", fault, e.toString(), TransactionRecorder.ERROR_FLAG);
			}
		}	
	}
		
	public void expireFaults() throws PortalException {
		PotentialFault fault = new PotentialFault();
		try {			
			for (Iterator faults = faultDao.getFaults(Constants.FEASIBLE).iterator(); faults.hasNext();) {
				fault = (PotentialFault) faults.next();
				fault.setStatus(Constants.EXPIRE);
				faultDao.store(fault);
			}
		} catch (Exception e){
			fault.setStatus(Constants.ERROR);
			fault.setFeasibilityResult(messageSource.getMessage("serviceProcessError",null,null));
			faultDao.store(fault);			
			this.recordTransaction("Expire fault", "", fault, e.toString(), TransactionRecorder.ERROR_FLAG);
		}
	}