JTA、非JTAとスレッドの混合使用の問題


昨日の夜JTAとスレッドの問題にやられて、markはちょっとして、後で補充し続けます.
 
問題の説明
Httpリクエストを受信すると、次のように論理を実行します. 
1.データベースds 1を問い合わせる.
2.データベースds 1、ds 2を挿入します.特徴:物事を求め、すべてJTAを使う
3.新しいスレッド呼び出しWSの起動
 
導入環境
サーバ:Websphere 6.1
JDK: IBM 1.5
オペレーティングシステム:Red Hat Enterprise Linux
 
データ・ソースの構成
1.jdbc/x 1 JTAを有効にし、oracle 10 gに接続し、「このデータソースをコンテナ管理の持続性(CMP)に使用する」を選択します.
2.jdbc/x2 JTAを有効にし、MSSQL 2005に接続し、「このデータソースをコンテナ管理の持続性(CMP)に使用する」を選択し、JTDSドライバを使用します.
3.jdbc/nx 1はx 1と同じライブラリに接続されているが、JTAは有効ではない
 
Daoの構成
x 1 Dao対応データソースjdbc/x 1
x2Dao 対応データソースjdbc/x 2
nx1Dao  対応データソースjdbc/nx 1
 
プログラム
プログラム中のJTA事物はSpringで管理する
1.spring構成
<!--        -->
<jee:jndi-lookup id="x1" jndi-name="jdbc/x1" />
<jee:jndi-lookup id="x2" jndi-name="jdbc/x2" />
<jee:jndi-lookup id="nx1" jndi-name="jdbc/nx1" />

<!--       -->
<tx:jta-transaction-manager />

2.正常なコードを実行する
    SdhxBO.javaはBeanとしてspringコンテナにあります
@Transactional(rollbackFor = { Exception.class })	
@SuppressWarnings({ "unchecked"})
public void hx(ViewDataset datasetLeasCharge, ViewDataset datasetVirCharge,
			ViewDataset datasetPayments) throws Exception {
        
	//1.  nx1  
	x1Dao.do..
		
	//2.  x1,x2          
	x1Dao.do...
	x2Dao.do...
	   
	//3.  Thread
        FetchWorkflowThread f = new FetchWorkflowThread(wfParamsList,headerMap);
	f.start();
}

    GzdDetailViewModel.javaはbeanではなくSchxBOを呼び出す方法
public void hx(ParameterSet parameters, ParameterSet outParameters)		
throws Exception {
	ViewDataset datasetLeasCharge = this.getDataset("datasetLeasCharge");
	ViewDataset datasetVirCharge = this.getDataset("datasetVirCharge");
	ViewDataset datasetPayments = this.getDataset("datasetPayments");

	SdhxBO bo = SpringService.getSdhxBO();
	
	bo.hx(datasetLeasCharge, datasetVirCharge, datasetPayments);
}

 3.WSタイムアウト異常時のコード   
2011-01-19 20:42:41,355 [WebContainer : 977] WARN  g.apache.cxf.phase.PhaseInterceptorChain -Interceptor for {urn:DefaultNamespace}IFELCWriteOffService#{urn:DefaultNamespace}CHECKRENT has thrown exception, unwinding now
org.apache.cxf.interceptor.Fault: Could not send Message.
	at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:64)
Caused by: java.net.SocketTimeoutException: SocketTimeoutException invoking http://dev1.corp.sinochem.com:80/k3oa/assistancework/daypaynetwork.nsf/IFELC_WriteOff?OpenWebService: Read timed out
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
Caused by: java.net.SocketTimeoutException: Read timed out
	at java.net.SocketInputStream.socketRead0(Native Method)

    SdhxBO.java
@Transactional(rollbackFor = { Exception.class })
@SuppressWarnings({ "unchecked"})
public List hx(ViewDataset datasetLeasCharge, ViewDataset datasetVirCharge,
			ViewDataset datasetPayments) throws Exception {
        
	//1.  nx1  
	nx1Dao.do..
		
	//2.  x1,x2          
	x1Dao.do...
	x2Dao.do...
	
	return list
}

    GzdDetailViewModel.java
public void hx(ParameterSet parameters, ParameterSet outParameters) 
    throws Exception {  
	...
    SdhxBO bo = SpringService.getSdhxBO();  
    List list = bo.hx(datasetLeasCharge, datasetVirCharge, datasetPayments);  
	//3.  Thread
    FetchWorkflowThread f = new FetchWorkflowThread(list,headerMap);
    f.start();
}  

4.JTA異常1
org.springframework.transaction.TransactionSystemException: UOWManager transaction processing failed; nested exception is com.ibm.wsspi.uow.UOWException: javax.transaction.RollbackException: Global transaction timed out after 0 seconds
	at org.springframework.transaction.jta.WebSphereUowTransactionManager.execute(WebSphereUowTransactionManager.java:288)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:127)
Caused by: com.ibm.wsspi.uow.UOWException: javax.transaction.RollbackException: Global transaction timed out after 0 seconds
	at com.ibm.ws.uow.UOWManagerImpl.runUnderNewUOW(UOWManagerImpl.java:981)
	at com.ibm.ws.uow.UOWManagerImpl.runUnderUOW(UOWManagerImpl.java:510)
	at org.springframework.transaction.jta.WebSphereUowTransactionManager.execute(WebSphereUowTransactionManager.java:281)
Caused by: javax.transaction.RollbackException: Global transaction timed out after 0 seconds
	at com.ibm.ws.uow.UOWManagerImpl.uowEnd(UOWManagerImpl.java:1019)
	at com.ibm.ws.uow.UOWManagerImpl.runUnderNewUOW(UOWManagerImpl.java:976)

SdhxBOでnx 1 Dao,x 1 Dao,x 2 Dao,FetchWorkflowThreadが呼び出されます
5.JTA異常2
org.springframework.transaction.TransactionSystemException: UOWManager transaction processing failed; nested exception is com.ibm.wsspi.uow.UOWException: javax.transaction.RollbackException
	at org.springframework.transaction.jta.WebSphereUowTransactionManager.execute(WebSphereUowTransactionManager.java:288)
Caused by: com.ibm.wsspi.uow.UOWException: javax.transaction.RollbackException
	at com.ibm.ws.uow.UOWManagerImpl.runUnderNewUOW(UOWManagerImpl.java:981)
Caused by: javax.transaction.RollbackException
	at com.ibm.ws.Transaction.JTA.TransactionImpl.stage3CommitProcessing(TransactionImpl.java:1880)

SdhxBOでnx 1 Dao,x 1 Dao,x 2 Dao,FetchWorkflowThreadが呼び出されます