使用WorkManager在Jetty上启用编程并发

Raf*_*len 6 java jndi jetty commonj workmanagers

我设法将CommonJ-JSR 237 Timer&WorkManager API(http://commonj.myfoo.de)的自定义实现配置为JNDIJetty 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.xmlJetty 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>
Run Code Online (Sandbox Code Playgroud)

我需要java:comp/env/{RESOURCE}专门针对java:comp/env/wm/MyWorkManager服务器标准的JNDI命名,但标准WEB-INF\jetty-env.xml配置文件不起作用.有任何想法吗?

更新:我已经测试了jetty-env.xmlJetty 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>
Run Code Online (Sandbox Code Playgroud)

Ant*_*ten 1

你检查过这个吗?

有时,在运行时将配置信息传递给您无法或无法方便地编码到 web.xml 中的 Web 应用程序很有用。在这种情况下,您可以使用 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>
Run Code Online (Sandbox Code Playgroud)

此示例定义了一个名为 mySpecialValue 的虚拟环境条目,其值为 4000,该条目在整个 JVM 中是唯一的。对于部署的每个Web 应用程序,它都会放入位于 java:comp/env/mySpecialValue 的 JNDI 中。此外,布尔参数指示该值覆盖 web.xml 中同名的 env-entry。如果您不想覆盖,请忽略此参数,或将其设置为 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>
Run Code Online (Sandbox Code Playgroud)

然后你可以像使用文件一样链接jdbc/myds到你的 web 应用程序的命名空间 :java:comp/env/jdbc/myfooWEB-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>
Run Code Online (Sandbox Code Playgroud)

请注意,您必须使用 WEB-INF/jetty-env.xml 文件来调用“bindToENC”方法,而不是上下文xml 文件,因为后者不会在 web 应用程序部署的正确阶段被解释为具有 java:comp /env 命名空间已创建。