10

現在、次のコードを使用して、通常の POJO クラスの EJB3 ステートレス セッション Bean を検索しています。(私たちは JEE5 を使用しているため、ルックアップを使用する必要がある通常の POJO クラスにステートレス セッション Bean を注入することはできません)

import javax.naming.Context;  
import javax.naming.InitialContext;  
import javax.naming.NamingException;  

import org.apache.log4j.Logger;  

public Object getEJB(String jndiName) {  

                logger.debug("WEBSPHERE EJB Lookup : " + jndiName);  
                String modifiedJndiName = "";  
                Hashtable<Object, Object> properties = new Hashtable<Object, Object>();  
                properties.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory");  
                properties.put(Context.PROVIDER_URL, "iiop://localhost:2809");  
                try {  
                    Context context = new InitialContext(properties);  
                    logger.debug("WEBSPHERE EJB Lookup Modified JNDI Name: " + modifiedJndiName);  
                    return context.lookup("ejblocal:"+modifiedJndiName);  
                }catch (NamingException ne) {  
                    logger.debug("Naming Exception occurred :"+jndiName +">>>"+ne.getMessage());  
                    logger.error(ne.getMessage(), ne);  
                }  

                return null;  
            }  

ContextオブジェクトはThredSafeですか?[このコード スニペットに示すように] 呼び出しごとに Context オブジェクトを作成する必要がありますか?それとも、すべてのスレッドで Context を再利用できますか?

4

2 に答える 2

15

スレッドセーフに関する回答は、通常、関連する場合は常に javadoc で既に言及されています。実際、InitialContextjavadocには次のことが記載されています。

InitialContextインスタンスは、複数のスレッドによる同時アクセスに対して同期されません。InitialContextそれぞれが異なるインスタンスを操作する複数のスレッドは、同期する必要はありません。単一のInitialContextインスタンスに同時にアクセスする必要があるスレッドは、それらの間で同期し、必要なロックを提供する必要があります。

最後の文はそれを確認しています。これはスレッドセーフではなく、スレッドごとの同期が必要です。ただし、特定のコード例では、とにかくメソッドローカルスコープで作成されているため、同期は必要ありません(つまり、スレッド間で共有されていないことは間違いありません)。InitialContext特定のコード例で がインスタンス変数である場合は、キーワードをメソッドに追加する必要がありsynchronizedますgetEJB()

于 2012-11-10T00:14:15.033 に答える
0

しかし、このメソッドをシングルトン クラス内に配置すると、Context をクラス変数として使用できますか?以下のコード メソッドのように、シングルトンServiceLocatorクラス内にあります。

import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class ServiceLocator {
    static volatile ServiceLocator serviceLocator = null;

    Map supportedAppServerMap = null;

    @Override
    public Object getEJB(String jndiName) {

        logger.debug("WEBSPHERE EJB Lookup : " + jndiName);
        String modifiedJndiName = "";
        Hashtable<Object, Object> properties = new Hashtable<Object, Object>();
        properties.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory");
        properties.put(Context.PROVIDER_URL, AMPPropertyUtil.getProperty("PROVIDER_URL"));
        try {
            Context context = new InitialContext(properties);
            if (null != jndiName && jndiName.indexOf(".") != -1)
                modifiedJndiName = jndiName.substring(jndiName.lastIndexOf(".") + 1);
            else
                modifiedJndiName = jndiName;
            logger.debug("WEBSPHERE EJB Lookup Modified JNDI Name: " + modifiedJndiName);
            return context.lookup("ejblocal:" + modifiedJndiName);
        } catch (NamingException ne) {
            logger.debug("Naming Exception occurred :" + jndiName + ">>>" + ne.getMessage());
            logger.error(ne.getMessage(), ne);
        }

        return null;
    }

    @Override
    public DataSource getDataSource() {
        Context context = null;
        final String dsName = AMPPropertyUtil.getProperty("dsName");
        Hashtable<Object, Object> properties = new Hashtable<Object, Object>();
        properties.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory");
        properties.put(Context.PROVIDER_URL, AMPPropertyUtil.getProperty("PROVIDER_URL"));
        try {

            context = new InitialContext();
            return (DataSource) context.lookup("java:comp/env/" + dsName);

        } catch (NamingException e) {
            logger.error(e.getMessage(), e);
        }
        return null;
    }

    @Override
    public Object getResources(final String jndiName) {
        Context context = null;
        Hashtable<Object, Object> properties = new Hashtable<Object, Object>();
        properties.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory");
        properties.put(Context.PROVIDER_URL, AMPPropertyUtil.getProperty("PROVIDER_URL"));
        try {
            context = new InitialContext();
            return context.lookup(jndiName);

        } catch (NamingException e) {
            logger.error(e.getMessage(), e);
        }
        return null;
    }

    public static ServiceLocator getInstance() {
        if (serviceLocator == null) {
            synchronized (ServiceLocator.class) {
                if (null == serviceLocator)
                    serviceLocator = new ServiceLocator();
            }
        }
        return serviceLocator;
    }

}
于 2012-11-10T01:10:30.007 に答える