2012-06-27 5 views
0

Я создаю приложение, которое использует представления CDI (Weld Container) и @ConversationScope для представлений. Мне нужно будет начать транзакцию JTA в начале Разговора и совершить/откат в конце. Так что я закодированы это:Использование транзакции с CDI Разговор

@Named 
@ConversationScoped 
public class ConversationBean implements Serializable { 

private @Inject UserTransaction utx; 
private @Inject Conversation conversation; 

public void startConversation(){ 
    conversation.begin(); 
    try { 
     utx.begin(); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 
public void stopConversation(){ 
    conversation.end(); 
    try { 
     utx.commit(); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

} 

Однако результат в том, что, когда я начинаю разговор/сделки

09: 23: 33795 ERROR [org.jboss.as.txn] (HTTP - 127,0 .0.1-8180-1) JBAS010152: APPLICATION ERROR: транзакция еще активна в запросе со статусом 0

И когда я выдаю коммита:

09: 23: 56513 ERROR [STDERR] (http-- 127.0.0.1-8180-1) java.lang .IllegalStateException: BaseTransaction.commit - ARJUNA016074: никаких транзакций!

Любая идея, как это могло бы работать? моя среда - сервер приложений JBoss 7.1.1 (контейнер Weld). Thanks Linda

+0

Похоже, что у вас уже есть активная транзакция (возможно, из-за предыдущих вызовов EJB?) –

+0

Спасибо за ответ, однако startConversation() и endConversation() вызывается непосредственно как действие со страницы JSF .... –

ответ

2

Я думаю, что есть немного проблемы с вашим мышлением здесь. Разговор охватывает несколько запросов (в противном случае вы должны использовать область запроса), в то время как транзакция привязана к потоку на сервере. Несколько запросов не являются (обязательно, особенно в веб-приложении, обслуживающем несколько клиентов), связанным с одним и тем же потоком. Вам нужна транзакция, когда вы работаете с базой данных или другим транзакционным ресурсом. Вероятно, вы должны немного переосмыслить его.

+0

Спасибо за ваш ответ. Возможно, я неправильно понял, что делает «разговорная» область, но я думал, что за кулисами этот компонент был поддержан компонентом Sessionful Session, который может охватывать транзакцию по нескольким запросам. К сожалению, я не смог найти никаких доказательств этого ... но я попробовал ..... –

+1

Нет, к сожалению, этого не происходит, даже с EJB. транзакции находятся на уровне потока, который не соответствует 1: 1 с запросами. – LightGuard

Смежные вопросы