2009-07-24 16 views
5

Mam 4 serwery i JVM jest zainstalowany na nich. Napisałem usługę Java, którą Quartz wywołuje tę usługę co 10 minut. Ale na 4 serwerach, co 10 minut 4 połączenia są wykonywane. Ta sytuacja tworzy stan wyścigu. Chcę tylko jedną usługę na 4 JVM.Spring Framework Łączenie JVM ze sobą

Jak mogę zrobić z Spring Framework?

Odpowiedz

3

Jest to całkiem łatwe do skonfigurowania za pomocą kwarcu. Sama wiosna nie może ci w tym pomóc, ponieważ nie jest świadoma innych maszyn JVM, które są uruchomione. Natomiast mechanizm kwarcowy ma koncepcję klastrowego programu szeregującego.

Zasadniczo trzeba skonfigurować jedną bazę danych, że wszystkie 4 JVM mogą dzielić. Będzie to używane jako harmonogram dla wszystkich 4 wystąpień. Gdy zadanie jest zaplanowane, jest uruchamiane tylko przez jedną z instancji korzystających z klastrowego programu planującego.

Zaczerpnięte z witryny internetowej wiki kwarcu do klastrowania ( http://www.opensymphony.com/quartz/wikidocs/ConfigJDBCJobStoreClustering.html), jest to przykładowa konfiguracja konfiguracji klastrowego programu planującego. Możesz także ustawić te właściwości bezpośrednio ze sprężyny, jeśli tak konfigurujesz swój harmonogram.

#============================================================================ 
# Configure Main Scheduler Properties 
#============================================================================ 

org.quartz.scheduler.instanceName = MyClusteredScheduler 
org.quartz.scheduler.instanceId = AUTO 

#============================================================================ 
# Configure ThreadPool 
#============================================================================ 

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool 
org.quartz.threadPool.threadCount = 25 
org.quartz.threadPool.threadPriority = 5 

#============================================================================ 
# Configure JobStore 
#============================================================================ 

org.quartz.jobStore.misfireThreshold = 60000 

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX 
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.oracle.OracleDelegate 
org.quartz.jobStore.useProperties = false 
org.quartz.jobStore.dataSource = myDS 
org.quartz.jobStore.tablePrefix = QRTZ_ 

org.quartz.jobStore.isClustered = true 
org.quartz.jobStore.clusterCheckinInterval = 20000 

#============================================================================ 
# Configure Datasources 
#============================================================================ 

org.quartz.dataSource.myDS.driver = oracle.jdbc.driver.OracleDriver 
org.quartz.dataSource.myDS.URL = jdbc:oracle:thin:@polarbear:1521:dev 
org.quartz.dataSource.myDS.user = quartz 
org.quartz.dataSource.myDS.password = quartz 
org.quartz.dataSource.myDS.maxConnections = 5 
org.quartz.dataSource.myDS.validationQuery=select 0 from dual 
+0

Dziękuję. To będzie dla mnie pomocne. Spróbuję. – firstthumb

3

Twoje pytanie nie jest zbyt jasne, więc zobaczmy, czy rozumiem: masz 4 serwery, z których każdy działa z mechanizmem kwarcu w maszynie wirtualnej, a każdy serwer ma to samo zadanie kwarcowe zaplanowane co 10 minut, za pomocą wyrażenia cron. Co 10 minut wszystkie 4 serwery rozpoczynają tę samą pracę, tworząc warunki wyścigu, ponieważ wszyscy próbują zrobić to samo w tym samym czasie.

Nie jest to zadanie na wiosnę. Jednak Quartz ma zdolność do tworzenia klastrów, w której można skonfigurować zadanie do uruchamiania tylko jednego serwera w klastrze. Korzysta ze współużytkowanej bazy danych, aby koordynować, które serwery uruchamiają dane zadanie, i upewnia się, że nie wszystkie robią to razem.

Dokumenty mają pewne informacje na temat tego here, ale w zwykłym stylu opensymphony.com są dość rzadkie i niepomocne.

+0

Zrozumiałem to pytanie z twoim wyjaśnieniem, skaffman. Niesamowite. +1 za to. – peakit

0

Co zrobić w naszej aplikacji internetowej jest dla każdego zadania mają być zapakowane w klasie, która zajmuje się globalną blokadę w całej gromady (używam memcached, a ja naprawdę nie obchodzi, czy zadanie zostanie uruchomić zbyt często) i uruchamia tylko to zadanie, jeśli ma blokadę. Następnie może zwolnić blokadę po zakończeniu zadania (nie zapomnij tego zrobić w finally).

Zaletą owijając każdą pracę zamiast zmieniać harmonogramu jest to, że można mieć pewne zadania, które działają na wszystkich komputerach, a niektórzy, że uruchomić tylko na jednym.