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
트랜잭션에 여전히입니다 완료하십시오.
트랜잭션 시간 제한을 엄청나게 조정하는 것보다 나은 접근법이 있습니까?
글쎄, 단순히 run() 메소드가 트랜잭션 적이 지 않도록하십시오. –
어떻게하면됩니까? TransactionAttribute 표기법에 익숙하지 않습니다. – ChrisGeo
설명서가있는 이유는 다음과 같습니다. http://docs.oracle.com/javaee/6/api/javax/ejb/TransactionAttribute.html –