2014-10-16 2 views
5

두 개의 tomee 인스턴스가 클러스터되었습니다.@Schedule을 클러스터 환경에서 한 번만 실행하십시오.

각 하나는 방법은 내가 하루에 한 번만이 방법을 실행하고 싶습니다

@Schedule(dayOfWeek = "*") 
public void runMeDaily() {...} 

같은 주석이 있습니다. 하루에 두 번 (각 인스턴스 당 하나씩)

여기에 설명 된대로 플래그를 사용할 수 있습니다. Run @Scheduled task only on one WebLogic cluster node? 또는 일부 노드를 선출 할 수 있지만이를 수행하는 좀 더 우아한 방법이 있는지 궁금합니다.

이 질문은 다소 EJB3.1 @Schedule in clustered environment과 관련이 있지만 JBOSS를 사용하지는 않습니다. (그리고 대답이 안된다.)

+0

https://github.com/SpringOnePlatform2016/dsyer-locks-andleaders – MariuszS

답변

1

기본 조각. 내 경우, TomEE +와 Quartz를 사용하고있다. Quartz를 클러스터 모드 (org.quartz.jobStore.isClustered = true)로 실행하고 단일 데이터베이스에 타이머를 지속 시키면 Quartz가 타이머를 트리거 할 인스턴스를 선택하게되므로 한 번만 실행된다.

이 링크

은 매우 유용 - http://rmannibucau.wordpress.com/2012/08/22/tomee-quartz-configuration-for-scheduled-methods/

그것은 부끄러운 자바 EE가의 동작을 지정하지 않는 것. (아직, 나는 희망한다) :-)

2

다른 스레드 검사에서와 동일한 접근법을 사용하여 특정 호스트가 작업을 실행하는 데 올바른 호스트인지 확인합니다. 그러나 ..

Im 정보가 많지는 않지만, 봄에는 프로파일을 사용할 수 있습니다. 아마도 당신은 당신의 요구에 맞는 유사한 솔루션을 찾을 수있을 것입니다.

@Configuration 
@Profile("dev") 
public class StandaloneDataConfig { 

@Bean 
public DataSource dataSource() { 
    return new EmbeddedDatabaseBuilder() 
     .setType(EmbeddedDatabaseType.HSQL) 
     .addScript("classpath:com/bank/config/sql/schema.sql") 
     .addScript("classpath:com/bank/config/sql/test-data.sql") 
     .build(); 
} 
} 

@Configuration 
@Profile("production") 
public class JndiDataConfig { 

@Bean 
public DataSource dataSource() throws Exception { 
    Context ctx = new InitialContext(); 
    return (DataSource) ctx.lookup("java:comp/env/jdbc/datasource"); 
} 
} 

과 프로필을 전환하여 켜 어느 결정 : 당신은 두 개의 별도 콩을 정의 할 수 있습니다 http://spring.io/blog/2011/06/21/spring-3-1-m2-testing-with-configuration-classes-and-profiles

에서 살펴 보자. 그래서 @Scheduled 주석이 달린 메소드를 가진 클래스는 특정 프로파일에 대해서만로드 될 것입니다. 물론 노드의 프로필 만 켜도록 앱을 구성해야합니다. 스프링 애플리케이션에서는 -Dspring.profiles.active = profile을 그 중 하나에 전달하는 것처럼 간단합니다.

+0

좋은 생각, 나는 그것을 살펴볼 것이다 :-) 나는 내가 ' 지금 당장이 프로젝트에서 봄으로 전환 하겠지만, 다음 번에는 귀하의 선택을 고려할 것입니다. 고마워! – Leo

+0

내가 말했듯이, 당신은 아마도 ejb에서 비슷한 것을 발견 할 수있을 것이다. – freakman

-1

상자 중 하나를 마스터로 만들어이 문제를 해결했습니다. 기본적으로 master = true와 같은 상자에 환경 변수를 설정합니다.

그리고 java 코드에서 system.getenv ("master")를 통해 읽으십시오. 현재와 ​​그 사실이 당신의 코드를 실행한다면.

난 단지 플랫폼 (독점)에 고유 한 비 Java EE 솔루션을 사용하여이 문제를 해결할 수

@schedule() 
void process(){ 
boolean master=Boolean.parseBoolean(system.getenv("master")); 
if(master) 
{ 
    //your logic 
} 

} 
관련 문제