EJB

2014-05-11 3 views
1

나는 기본적으로 일정 시간 간격으로 예약 된 다음 서비스는 다음을 수행 할 수있는 매우 긴 트랜잭션 (제이보스를) 피 :EJB

  • 에서 다운로드 URL 목록을 얻을를 다운로드를 수행
  • 디스크에 자신의 위치와 다운로드로 인한 엔티티를 지속 디스크에 저장

이러한 다운로드는 모두 1-2 시간 정도 소요될 수 있습니다. 수업 레이아웃에서 볼 수있는 내용과 내가 이해하는 바에 따라 예약 된 전체 서비스 기간 동안 영구적으로 거래가 진행됩니다.

@Stateless 
public class TimedService { 

    @EJB 
    private Facade facade; 

    @Schedule(hour="*/12") 
    public void run() { 

     List<String> urls = getAllUrls(); 

     urls.forEach(u -> { 
      facade.downloadFromUrl(u); 
     }); 

    } 
} 

@Stateless 
public class Facade { 

    @EJB 
    private Dao dao; 

    public void downloadFromUrl(String url) { 

     //this is the download part that may take a couple of minutes 
     byte[] bytes = NetUtils.getByteArrayFromUrl(url); 

     //if download was succesfull 
     if(bytes != null) { 
      //save the filename to disk 
      String fileName = createFileName(url); 
      Files.write(fileName, bytes); 

      //save entity to the database with the fileName location 
      Entity e = new Entity(fileName); 
      dao.merge(e); 
     } 
    } 
} 

기본적으로 Wildfly는 트랜잭션 (기본적으로 5 분)을 시간 초과하거나 24 시간 내에 제한 시간과 같이 크게 변경합니다.

내가 제대로 Facade#downloadFromUrl 트랜잭션 타임 아웃이 하나의 다운로드가 오래 지속 나던 이후 트리거되지 않더라도 이해한다면, 나는 모든 다운로드에 걸리는 전체 기간에 대한 개방 될 TimedService#run 트랜잭션에 여전히입니다 완료하십시오.

트랜잭션 시간 제한을 엄청나게 조정하는 것보다 나은 접근법이 있습니까?

+0

글쎄, 단순히 run() 메소드가 트랜잭션 적이 지 않도록하십시오. –

+0

어떻게하면됩니까? TransactionAttribute 표기법에 익숙하지 않습니다. – ChrisGeo

+0

설명서가있는 이유는 다음과 같습니다. http://docs.oracle.com/javaee/6/api/javax/ejb/TransactionAttribute.html –

답변

관련 문제