6

我设法将 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>

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

更新:我已经jetty-env.xml在 J​​etty 9 中测试了本地配置文件,它按预期工作。似乎在低于 9JNDI的版本中它不完全受支持。以下是配置文件内容:

<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>
4

1 回答 1

1

你检查过这个吗,

有时,在运行时将配置信息传递给 Web 应用程序很有用,您不能或不能方便地将其编码到 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>

此示例定义了一个名为 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>

然后,您可以使用文件链接jdbc/myds到 webapp 的命名空间 :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>

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

于 2017-11-29T06:46:36.753 回答