在Web应用中,有些请求非常耗时,为避免其执行时间过长,干扰其他应用,通常的方式是给这些请求设置一个专用的执行队列。例如,web.xml中的下列配置将耗时很长的文件wls8.jsp配置一个专用执行队列:
- <servlet>
- <servlet-name>longtimeServlet</servlet-name>
- <jsp-file>/wls8.jsp</jsp-file>
- <init-param>
- <param-name>wl-dispatch-policy</param-name>
- <param-value>MyExecute Queue</param-value>
- </init-param>
- </servlet>
这里执行队列名为“MyExecute Queue”,直接访问/wls8.jsp将通过“MyExecute Queue”执行,而不会通过默认的“weblogic.kernel.Default”执行队列,当“MyExecute Queue”满后,后续请求将会进入“MyExecute Queue”的等待队列中。注意:如果从其他请求重定向到wls8.jsp,则还是在原始线程中执行。
由于这些请求都非常耗时,而进入队列也只是暂缓执行而已,总归是会执行的。处于系统整体效率考虑,希望不要等待队列,无空闲线程时直接返回系统忙就可以了。但是,在WebLogic中,执行队列的最新等待队列就是256,所以需要通过编程来处理。
WebLogic 8示例如下,其中customQueue 是配置的执行线程名。
- <%@ page contentType="text/html;charset=GBK"%>
- <%@page import="javax.naming.Context"%>
- <%@page import="weblogic.management.MBeanHome"%>
- <%@page import="weblogic.management.runtime.ServerRuntimeMBean"%>
- <%@page import="weblogic.management.Helper"%>
- <%@page import="weblogic.management.runtime.ExecuteQueueRuntimeMBean"%>
- <%@page import="weblogic.jndi.Environment"%>
- <html>
- <body>
- <ol>
- <%
- String url = "t3://localhost:7001";
- String serverName = "myserver";
- String username = "weblogic";
- String password = "weblogic";
- String customQueue = "MyExecute Queue";
- Environment env = new Environment();
- env.setProviderUrl(url);
- env.setSecurityPrincipal(username);
- env.setSecurityCredentials(password);
-
- Context ctx = env.getInitialContext();
-
- MBeanHome home = (MBeanHome) ctx.lookup(MBeanHome.LOCAL_JNDI_NAME);
- ServerRuntimeMBean serverRuntimeMBean = (ServerRuntimeMBean) home
- .getRuntimeMBean(serverName, "ServerRuntime");
- ExecuteQueueRuntimeMBean[] runtimeMBeans = serverRuntimeMBean
- .getExecuteQueueRuntimes();
- for (int i = 0; i < runtimeMBeans.length; i++) {
- ExecuteQueueRuntimeMBean runtime = runtimeMBeans[i];
- out.println("<li><p>ExecuteQueue " + runtime.getName()
- + ".</p>TotalCount="
- + runtime.getExecuteThreadTotalCount()
- + ",CurrentIdleCount="
- + runtime.getExecuteThreadCurrentIdleCount());
- if (runtime.getName().equals(customQueue)) {
- if (runtime.getExecuteThreadCurrentIdleCount() < 1) {
- out.println("System Busy.");
- return;
- }
- }
- }
- response.flushBuffer();
-
- Thread.sleep(30000);
- %>
- </ol>
- </body>
- </html>
在WebLogic 9中,执行队列的概念已经被Work Manger取代了。