суббота, 18 сентября 2010 г.

thread pools in glassfish v3

Пришло время переводить свои приложения с glassfish v2+ на glassfish v3+, при это естественно возникла куча проблем.
одна из них это то, что я использовал thread pool`ы GFv2. Эта часть не является частью стандарта javaee как скажем time services, и по этому api легко и непренужденно изменилось

В своем предыдущем посте я описывал как это делается в GFv2


...
        WorkManager workManager = WorkManagerFactory.getWorkManager("threadpoolname");
...
Поковырявшись в исходниках GFv2.1, посмотрим что же происходило на самом деле:
appserv-core/src/java/com/sun/enterprise/connectors/work/WorkManagerFactory.java:

...
    public static WorkManager getWorkManager(String poolName)
                              throws ConnectorRuntimeException {

        String className = null;
        String methodName = "getInstance";
        Class cls = null;
        WorkManager wm = null;

        try {
            className = System.getProperty(WORK_MANAGER_CLASS, DEFAULT);

            // Default work manager implementation is not a singleton.
            if (className.equals(DEFAULT)) {
                return new CommonWorkManager(poolName);
            }

            cls = Class.forName(className);
            if (cls != null) {
                Method method = cls.getMethod("getInstance", new Class[]{});
                wm = (WorkManager) method.invoke(cls, new Object[] {});
            }
        } catch (Exception e) {
            String msg = localStrings.getString("workmanager.instantiation_error");
            logger.log(Level.SEVERE, msg, e);
        }

        return wm;
    }
...

В последней версии GFv3, которую я смотрел [v3.1-b20-09_15_2010], в WorkManagerFactory нет такого метода, по этому можно просто руками сделать то же самое, хотя скорее всего это неправильно, но вот как это выглядит:

...
import com.sun.enterprise.connectors.ConnectorRuntime;
import com.sun.enterprise.connectors.work.CommonWorkManager;
...
workManager = new CommonWorkManager("threadpoolname", ConnectorRuntime.getRuntime(), "resourceAdapterName", resourceAdapter.getClass().getClassLoader());
...

эти классы находятся в библиотеках GLASSFISHv3_DIR/work-management.jar и GLASSFISHv3_DIR/connectors-runtime.jar

p.s. почитав код, не нашел как используются resourceAdapterName и classLoader, по этому в качестве resourceAdapterName использовал просто "fffuuu", а в качестве classLoader - this.getClass().getClassLoader()

1 комментарий: