Включить программный параллелизм на Jetty с WorkManager

Мне удалось настроить пользовательскую реализацию API CommonJ - JSR 237 Timer & WorkManager ( http://commonj.myfoo.de/) как JNDI ресурс на Jetty 6 и 8, но он работает только в глобальном масштабе.
С этим решением JNDI Название ресурса wm/WorkManagerМне нужно чтобы это было java:comp/env/wm/WorkManager, но из-за ограничений я не могу использовать java:comp/env в глобальном имени JNDI, потому что оно зарезервировано для ресурсов области приложения.
Я создал новый файл конфигурации под названием {jetty.home}/etc/jetty-wtm.xml и добавлен в {jetty.home}/start.ini,
Вот jetty-wtm.xmlконтент для Jetty 6, для больших версий он немного другой, но тоже работает:

<!-- =============================================================== -->
<!-- Configure Server Time and Work Managers                         -->
<!-- =============================================================== -->

<Configure id="Server" class="org.mortbay.jetty.Server">


    <New id="WorkManager" class="org.mortbay.jetty.plus.naming.Resource">
        <Arg>wm/WorkManager</Arg>
        <Arg>
            <New class="de.myfoo.commonj.work.FooWorkManager">
                <Arg>
                    <New id="threadPool" class="de.myfoo.commonj.util.ThreadPool">
                        <Arg type="int">0</Arg>
                        <Arg type="int">10</Arg>
                        <Arg type="int">2</Arg>
                    </New>
                </Arg>
            </New>
        </Arg>
    </New>

    <New id="TimeManager" class="org.mortbay.jetty.plus.naming.Resource">
        <Arg>tm/TimeManager</Arg>
        <Arg>
            <New class="de.myfoo.commonj.timers.FooTimerManager">
                <Arg>
                    <New id="threadPool" class="de.myfoo.commonj.util.ThreadPool">
                        <Arg type="int">0</Arg>
                        <Arg type="int">10</Arg>
                        <Arg type="int">2</Arg>
                    </New>
                </Arg>
            </New>
        </Arg>
    </New>
</Configure>

Мне нужно поддерживать стандартное именование JNDI java:comp/env/{RESOURCE} конкретно java:comp/env/wm/MyWorkManagerчерез серверы, но стандартные WEB-INF\jetty-env.xml файл конфигурации не работает. Есть идеи?

ОБНОВЛЕНИЕ: я проверил jetty-env.xml локальный файл конфигурации в Jetty 9, и он работает как положено. Похоже в версиях под 9 JNDI это не полностью поддерживается. Вот содержимое файла конфигурации:

<Configure id="wac" class="org.eclipse.jetty.webapp.WebAppContext">

<New id="WorkManager" class="org.eclipse.jetty.plus.jndi.Resource">
        <Arg><Ref id="wac"/></Arg>
        <Arg>wm/MyWorkManager</Arg>
        <Arg>
            <New class="de.myfoo.commonj.work.FooWorkManager">
                <Arg>
                    <New id="threadPool" class="de.myfoo.commonj.util.ThreadPool">
                        <Arg type="int">0</Arg>
                        <Arg type="int">10</Arg>
                        <Arg type="int">2</Arg>
                    </New>
                </Arg>
            </New>
        </Arg>
    </New>
</Configure>

1 ответ

Решение

Ты проверял это,

Иногда полезно передать информацию о конфигурации веб-приложению во время выполнения, которое вы либо не можете, либо не можете удобно кодировать в web.xml. В таких случаях вы можете использовать org.eclipse.jetty.plus.jndi.EnvEntry и даже переопределить запись с тем же именем в web.xml.

<New class="org.eclipse.jetty.plus.jndi.EnvEntry">
  <Arg></Arg>
  <Arg>mySpecialValue</Arg>
  <Arg type="java.lang.Integer">4000</Arg>
  <Arg type="boolean">true</Arg>
</New>

В этом примере определяется виртуальная env-запись mySpecialValue со значением 4000, уникальным для всей JVM. Он помещается в JNDI по адресу java:comp/env/mySpecialValue для каждого развернутого веб-приложения. Более того, логический аргумент указывает, что это значение переопределяет запись env с тем же именем в web.xml. Если вы не хотите переопределять, пропустите этот аргумент или установите для него значение false.

Для ресурса в пользовательских файлах внутри etcдокументация гласит, что

Предположим, что следующая запись именования находится в $JETTY_HOME/etc/jetty-myjndi.xml:

 <New  id="jdbc/myds"  class="org.eclipse.jetty.plus.jndi.Resource">
     <Arg></Arg>
     <Arg>jdbc/myds</Arg>
     <Arg>
       <New  class="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource">
         <Set  name="Url">jdbc:mysql://localhost:3306/chat</Set>
         <Set  name="User">root</Set>
         <Set  name="Password">sillyness</Set>
       </New>
     </Arg>
  </New>

Тогда вы можете связать jdbc/myds в пространство имен вашего веб-приложения, как java:comp/env/jdbc/myfoo используя WEB-INF/jetty-env.xml файл:

   <Call class="org.eclipse.jetty.plus.jndi.NamingEntryUtil" name="bindToENC">
       <Arg></Arg>    <!-- scope of naming entry, ie same as first argument to your naming entry definition, in this case, null -->
       <Arg>jdbc/myfoo</Arg>
       <Arg>jdbc/myds</Arg>
   </Call>

Обратите внимание, что вы должны использовать файл WEB-INF/jetty-env.xml для вызова метода "bindToENC", а не файл контекста xml, поскольку последний не интерпретируется на правильной фазе развертывания веб-приложения, чтобы иметь java: comp / env пространство имен создано.

Другие вопросы по тегам