2014-04-29 2 views
1

solrJ.indexAllergenBulkSlor() 메소드에서 예외가 발생하더라도 트랜잭션을 롤백해야하지만 트랜잭션을 롤백하지는 않습니다. 또한 AUTOCOMMIT를 false로 설정했습니다. 친절히 도와주세요. 미리 감사드립니다. 내 서비스 IMPL은 여전히 ​​롤백 아니에요, 제안spring @Transactional rollbackFor = Exception.class에 대해 롤백하지 않음

@Service("mcareService") 
@Transactional(readOnly = true, value = "oltpTransactionManager") 
public class MyServiceImpl implements MyService { 

    @Override 
    @Transactional(value = "oltpTransactionManager", propagation=Propagation.REQUIRED, rollbackFor={Exception.class, SolrServerException.class}) 
    public boolean saveAllergens(List<AllergenAutoCmp> allergenList) { 
     boolean flag = false; 
     LOGGER.info("Inside saveAllergens in MCareServiceImpl"); 
     try { 
      allergenAutoCmpRepository.deleteAllergens(); 
      allergenAutoCmpRepository.saveAllergens(allergenList); 
      solrJ.indexAllergenBulkSlor(); 
      flag = true; 
     } catch (SolrServerException e) { 
      LOGGER.error("Error occured while solr indexing Allergens", e); 
     } catch (IOException e) { 
      LOGGER.error("Error occured while solr indexing Allergens", e); 
     } 
     LOGGER.info("returning from saveAllergens in MCareServiceImpl"); 
     return flag; 
    } 

} 
+0

스프링 빈 정의를 게시 할 수 있습니까? – JToddler

답변

2

코드를 수정의 모습 이다.

그래서 대신 컨트롤러에서

@RequestMapping 호출

@Override 
    @Transactional(value = "oltpTransactionManager", propagation=Propagation.REQUIRED, rollbackFor={Exception.class, SolrServerException.class}) 
    public boolean saveAllergens(List<AllergenAutoCmp> allergenList) { 
     boolean flag = false; 
     LOGGER.info("Inside saveAllergens in MCareServiceImpl"); 
     try { 
      allergenAutoCmpRepository.deleteAllergens(); 
      allergenAutoCmpRepository.saveAllergens(allergenList); 
      solrJ.indexAllergenBulkSlor(); 
      flag = true; 
     } catch (SolrServerException e) { 
      LOGGER.error("Error occured while solr indexing Allergens", e); 
     } catch (IOException e) { 
      LOGGER.error("Error occured while solr indexing Allergens", e); 
     } 
     LOGGER.info("returning from saveAllergens in MCareServiceImpl"); 
     return flag; 
    } 

사용 하나 아래 (제거 시도를 바로 잡기)

@Override 
    @Transactional(value = "oltpTransactionManager", propagation=Propagation.REQUIRED, rollbackFor={Exception.class, SolrServerException.class}) 
    public boolean saveAllergens(List<AllergenAutoCmp> allergenList) { 
     boolean flag = false; 
     LOGGER.info("Inside saveAllergens in MCareServiceImpl"); 
      allergenAutoCmpRepository.deleteAllergens(); 
      allergenAutoCmpRepository.saveAllergens(allergenList); 
      solrJ.indexAllergenBulkSlor(); 
      flag = true; 
     LOGGER.info("returning from saveAllergens in MCareServiceImpl"); 
     return flag; 
    } 

(방법 = RequestMethod.POST) @ResponseBody public boolean handleFileUpload ( @ModelAttribute ("uploadFile") MultipartFile uploadFile,,@ModelAttribute ("의 fileType") 문자열되는 파일 형식) 예외 {

LOGGER.info("inside handleFileUpload"); 

    CommonsMultipartFile aFile = (CommonsMultipartFile) uploadFile; 
    boolean flag = false; 
    if (aFile != null && aFile.getSize() > 0) { 
     flag = macareService.isFileUploaded(fileType, aFile); 
    } 
    LOGGER.info("exiting handleFileUpload"); 
    return flag; 
} 

및 saveAllergens 호출 서비스 방법을 던진다 (...) 방법

@Override 
public boolean isFileUploaded(String fileType, CommonsMultipartFile aFile) { 
    boolean flag = false; 

    try { 
     if (MCareConstants.ALLERGEN_UPLOAD_FILETYPE.equals(fileType)) { 
      ArrayList<AllergenAutoCmp> bulkInsertList = (ArrayList<AllergenAutoCmp>) ExcelUtils 
        .getBulkInsert(fileType, aFile); 
      if (bulkInsertList.size() > 0) { 
       flag = saveAllergens(bulkInsertList); 
      } 
     } 
     if (MCareConstants.REACTION_UPLOAD_FILETYPE.equals(fileType)) { 
      ArrayList<ReactionAutoCmp> bulkInsertList = (ArrayList<ReactionAutoCmp>) ExcelUtils 
        .getBulkInsert(fileType, aFile); 
      if (bulkInsertList.size() > 0) { 
       flag = saveReactionAutoCmps(bulkInsertList); 
      } 
     } 
     if (MCareConstants.LABTESTS_UPLOAD_FILETYPE.equals(fileType)) { 
      ArrayList<LabTestAutoCmp> bulkInsertList = (ArrayList<LabTestAutoCmp>) ExcelUtils 
        .getBulkInsert(fileType, aFile); 
      if (bulkInsertList.size() > 0) { 
       flag = saveLabTestAutoCmps(bulkInsertList); 
      } 
     } 
     if (MCareConstants.STAFF_UPLOAD_FILETYPE.equals(fileType)) { 
      ArrayList<StaffSolrForm> bulkInsertList = (ArrayList<StaffSolrForm>) ExcelUtils 
        .getBulkInsert(fileType, aFile); 
      if (bulkInsertList.size() > 0) { 
       flag = updateStaffList(bulkInsertList); 
      } 
     } 
     if (MCareConstants.REFERRAL_DOCTOR_UPLOAD_FILETYPE.equals(fileType)) { 
      ArrayList<ReferralAutoLookup> bulkInsertList = (ArrayList<ReferralAutoLookup>) ExcelUtils 
        .getBulkInsert(fileType, aFile); 
      if (bulkInsertList.size() > 0) { 
       flag = saveAllReferralAutolookup(bulkInsertList); 
      } 
     } 
    } catch (HeaderNameNotFoundException e) { 
     LOGGER.error("Error occured while updating solr indexing"); 
    } catch (MandatoryValueNotFoundException e) { 
     LOGGER.error("Error occured while updating solr indexing"); 
    }catch (SolrServerException e) { 
     LOGGER.error("Error updating index : ", e); 
    }catch (IOException e) { 
     LOGGER.error("Error updating index : ", e); 
    }catch (Exception e) { 
     LOGGER.error("Error occured while saving and solr indexing  ReactionAutoCmps", e); 
    } 
    return flag; 
} 

이며 로그

을 다음과 같다

2014-04-29 19:14:21 오류 MCareServiceImpl : 405 - 색인 업데이트 오류 : org.apache.solr.solient.SolrServerException : 서버가 연결을 거부했습니다 : http://samplename.com:8090/solr/icd102 at org.apache. solr.client.solrj.impl.HttpSolrServer.request (HttpSolrServer.java:432) at org.apache.solr.client.solrj.impl.HttpSolrServer.request (HttpSolrServer.java:221) at org.apache.solr. client.solrj.request.AbstractUpdateRequest.process (AbstractUpdateRequest.java:105) at org.apache.solr.client.solrj.SolrServer.deleteByQuery (SolrServer.java:293) at org.apache.solr.client.solrj. com.bluecapmobile.service.impl.MCareServiceImpl.saveAllergens (MCareServiceImpl.java:103) 에서 com.bluecapmobile.helper.SolrJ.indexAllergenBulkSlor (SolrJ.java:222) 에서 SolrServer.deleteByQuery (SolrServer.java:278)에서 com.bluecapmobile.service.impl.MCareServiceImpl.isFileUploaded (MCareServiceImpl.java:369) at sun.reflect.NativeMethodAccessorImpl.invoke0 (기본 메서드) 2014-04-29 19 : 14 : 24.469 [http-bio-8080-exec-4] DEBUG osojpa.JpaTransactionManager - 트랜잭션 커밋 시작 2014-04-29 19 : 14 : 24.469 [http-bio-8080-exec -4] DEBUG osojpa.JpaTransactionManager - EntityManager에서 JPA 트랜잭션 커밋 [[email protected]] 2014-04-29 19:14:24 DEBUG AbstractTransactionImpl : 175 - 커밋 2014-04-29 19:14:24 DEBUG AbstractFlushingEventListener : 149 - 플러시 타임 캐스케이드 처리 2014-04-29 19:14:24 DEBUG AbstractFlushingEventListener : 189 - 더티 검사 모음 2014-04-29 19:14:24 DEBUG AbstractFlushingEventListener : 123 - 플러시 됨 : 0 삽입, 0 업데이트, 3 개체에 0 삭제 2014-04-29 19:14:24 DEBUG AbstractFlushingEventListener : 130 - 플러시 됨 : 0 (다시) 생성, 0 업데이트, 0 재실행 0 컬렉션으로 이동 2014-04-29 19:14:24 DEBUG EntityPrinter : 114 - 리스팅 엔티티 : 2014-04-29 19:14:24 DEBUG EntityPrinter : 121 - com.bluecapmobile.domain.oltp.AllergenAutoCmp {alergen = 밀, allergenId = 472, 설명 = 설명, 유형 = 음식} 2014-04-29 19:14:24 디버그 EntityPrinter : 121 - com.bluecapmobile.domain.oltp.AllergenAutoCmp {alergen = 473, description = 설명 1, type = Food} 2014-04-29 19:14:24 DEBUG EntityPrinter : 121 - com.bluecapmobile.domain.oltp.AllergenAutoCmp {alergen = 테스트, allergenId = 474, description = 테스트, 유형 = test} 2014-04-29 19:14:24 DEBUG JdbcTransaction : 113 - 커밋 된 JDBC 연결 2014-04-29 19:14:24 디버그 JdbcTransaction : 126 - 자동 커밋 다시 사용 2014-04-29 19 : 14:24 DEBUG LogicalConnectionImpl : 212 - 적극적으로 JDBC 연결 해제 2014-04-29 19:14:24 DEBUG LogicalConnectionImpl : 246 - JDBC 연결 해제 2014-04-29 19:14:24 DEBUG LogicalConnectionImpl : 264 - JD 출시 BC 연결 2014-04-29 19 : 14 : 24.496 [http-bio-8080-exec-4] DEBUG osojpa.JpaTransactionManager - 거래 후 JPA EntityManager [[email protected]] 닫음 2014 -04-29 19 : 14 : 24.497 [HTTP 바이오-8080-간부-4] 디버그 osojEntityManagerFactoryUtils - JPA EntityManager를 닫기

이 내 transacton 관리자 설정이

@Bean (이름처럼 보이는 방법이다 = " mtdmEntityManger ") public LocalContainerEntityManagerFactoryBean configureMtdmEntityManagerFactory() { LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactor yBean(); entityManagerFactoryBean.setPackagesToScan ("com.sample.domain.mtdm"); entityManagerFactoryBean.setPersistenceProviderClass (HibernatePersistenceProvider.class);

+0

오류가 아닌 예외로 보입니다. 둘 다 Java와 트랜잭션 롤백이 다릅니다. 오류가 아닌 예외에 대해서만 반환됩니다. –

+0

org.apache.solr.client.solrj.SolrServerException : Server refused와 같은 예외가 발생합니다. connection : http://samplename.com:8090/solr/icd102 at org.apache.solr.client.solrj.impl.HttpSolrServer.request (HttpSolrServer.java:432) – Malreddy

+0

솔직히이 solrJ.indexAllergenBulkSlor(); 메서드 정의가 예외를 throw하거나 처리 중입니까? –

2

이것은 SolrServerException 또는 IOException을 잡았으나 버리지 않았기 때문입니다. @Transational이 어떻게 작동하는지 이해한다면, 함수 주위에 코드를 래핑하고 RuntimeException을 잡으려고한다는 것을 알게 될 것입니다. 예외를 외부 레이어에 전달해야합니다.

try { 
     allergenAutoCmpRepository.deleteAllergens(); 
     allergenAutoCmpRepository.saveAllergens(allergenList); 
     solrJ.indexAllergenBulkSlor(); 
     flag = true; 
    } catch (SolrServerException e) { 
     LOGGER.error("Error occurred while solr indexing Allergens", e); 
     throw new RuntimeException("SolrServerException occurred! Rollback my transaction."); 
    } catch (IOException e) { 
     LOGGER.error("Error occured while solr indexing Allergens", e); 
     throw new RuntimeException("IOException occurred! Rollback my transaction."); 
    }