JAX-WS Webサービスにおけるスレッドの安全性(glassfish3のメトロ)

私のビジネス層はwebservices ontopのメトロスタックでglassfish3に実装されています。

簡単な処理を処理するために、単一のリクエストが行われるたびに呼び出される論理ハンドラを使用して、クローズまたはフォルトが発生します。

closeおよびfaultメソッドでは、トランザクションが開いたままになっているかどうかを確認し、ロールバックします。

これを行うにはthreadlocalを使用しますが、もちろんこれは論理ハンドラが具体的なwebserviceクラスの同じスレッドで実行される場合にのみ機能します。

public class WebServiceMessageHandler implements LogicalHandler  
@Override
public void close(MessageContext context)
{
    DataLayerTransactionManager.RollBackTransactions();         
}

@Override
public boolean handleFault(LogicalMessageContext context)
{
    DataLayerTransactionManager.RollBackTransactions();

    return true;
}



    public class DataLayerTransactionManager
    {
     static ThreadLocal> threadLocalDAOList = new ThreadLocal>();

     public static void Add(DataLayerSession dao) 
     {
        List list;

        list=threadLocalDAOList.get();

        if ( list == null )
        {
            list=new ArrayList();
            threadLocalDAOList.set(list);
        }

        list.add(dao);
        }

     public static void Remove(DataLayerSession dao) 
     {
        List list;

        list=threadLocalDAOList.get();

        if ( list == null )
            return;

        list.remove(dao);       
        }

        public static void RollBackTransactions()
        {
            List list;

            list=DataLayerTransactionManager.threadLocalDAOList.get();

            if ( DataLayerTransactionManager.threadLocalDAOList.get()==null)
                return;

            for (DataLayerSession session : list)
            {
             try
                {
                session.rollbackTransaction();

              Logger log;

                    log=LoggerFactory.getLogger(DataLayerTransactionManager.class);
                    log.error("Rollingback pending transaction "+session.toString() );
                } 
             catch (Exception e)
                {
                    Logger log;

                    log=LoggerFactory.getLogger(DataLayerTransactionManager.class);
                    log.error("",e);
                }                            
            }

            list.clear();

            DataLayerTransactionManager.threadLocalDAOList.set(null);
        }
    }


ベストアンサー
申し訳ありませんが、適切な答えはありません

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です