2015-02-03 1 views
0

Следующий код реплицирует проблему.Два синглтона в одном приложении - оба с разными методами @Scheduled - метод одного класса ждет другого?

Класс TestA:

package main.java.monitor; 

import javax.ejb.Schedule; 
import javax.ejb.Singleton; 

@Singleton 
public class TestA { 

    @Schedule(hour="*", minute="*", second="*") 
    public void run() { 
     System.out.println("Test A started"); 
     System.out.println("Test A finished"); 
    } 

} 

Класс TestB:

package main.java.monitor; 

import javax.ejb.Schedule; 
import javax.ejb.Singleton; 

@Singleton 
public class TestB { 

    @Schedule(hour="*", minute="*", second="*") 
    public void run() throws InterruptedException { 
     System.out.println("Test B started"); 
     Thread.sleep(10000); 
     System.out.println("Test B finished"); 
    } 

} 

Ожидаемый результат (что-то подобное) будет тест Запущенный, тест А закончил в 10 раз чаще, чем тест B начал и испытания B (с добавленной датой/временем):

Test A started Tue Feb 03 13:09:47 GMT 2015 
Test A finished Tue Feb 03 13:09:47 GMT 2015 
Test B started Tue Feb 03 13:09:47 GMT 2015 
Test A started Tue Feb 03 13:09:48 GMT 2015 
Test A finished Tue Feb 03 13:09:48 GMT 2015 
Test A started Tue Feb 03 13:09:49 GMT 2015 
Test A finished Tue Feb 03 13:09:49 GMT 2015 
Test B finished Tue Feb 03 13:09:57 GMT 2015 
Test B started Tue Feb 03 13:09:57 GMT 2015 
Test A started Tue Feb 03 13:09:58 GMT 2015 
Test A finished Tue Feb 03 13:09:58 GMT 2015 
Test B finished Tue Feb 03 13:10:07 GMT 2015 
Test B started Tue Feb 03 13:10:07 GMT 2015 
Test A started Tue Feb 03 13:10:08 GMT 2015 
Test A finished Tue Feb 03 13:10:08 GMT 2015 

Любой, кто может пролить часть лига ht на этом?

Заранее спасибо

ответ

1

Я думаю, вы увидите, что это довольно ясно, добавив на ваших EJBs @AccessTimeout (0)

в 2 словах: вы одиночек являются @Lock (WRITE) по умолчанию и В блокировка (выполняется каждую секунду, но ждет 10). Как только пул асинхронов заполнен (по умолчанию - 3 потока), тогда больше нет потока, и вызов ждет слота, который должен быть освобожден B.