Ответ 1
JBossAS, который использует Arjuna Transaction Manager. В цепочке перехватчиков EJB3 начнет разворачиваться и, в конце концов, попадет в перехватчики транзакционного менеджера, чья работа заключается в том, чтобы прервать транзакцию.
-
Для MDB вы можете записать его с помощью
@ActivationConfigProperty(propertyName="transactionTimeout" value="1500")
-
Для других beans вы можете иметь
@TransactionTimeout(1500)
на уровне уровня или уровне метода.
Когда менеджер транзакций обнаруживает, что транзакция истекло, а затем прерывает ее из асинхронного потока (отличного от потока, выполняющегося в методе), но он никогда не отправляет прерывание текущему потоку.
Поэтому результат: вызывается, когда в нем задействовано несколько потоков... прерывание с 1 потоком активным!
Изменить:
//---
ThreadGroup root = Thread.currentThread().getThreadGroup().getParent();
while (root.getParent() != null)
root = root.getParent();
findAllThread(root,0);
//---
public static findAllThread(ThreadGroup threadGroup, int level){
int actCount = threadGroup.activeCount();
Thread[] threads = new Thread[actCount*2];
actCount = threadGroup.enumerate(threads, false);
for (int i=0; i<actCount; i++) {
Thread thread = threads[i];
thread.interrupt();
}
int groupCount = threadGroup.activeGroupCount();
ThreadGroup[] groups = new ThreadGroup[numGroups*2];
groupCount = threadGroup.enumerate(groups, false);
for (int i=0; i<groupCount; i++)
findAllThread(groups[i], level+1);
//---
Он будет перечислять другие активные потоки, также как обработчик ссылок, финализатор, диспетчер сигналов и т.д.