Включить программный параллелизм на 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 пространство имен создано.