在Web應用中,有些請求非常耗時,爲避免其執行時間過長,干擾其他應用,通常的方式是給這些請求設置一個專用的執行隊列。例如,web.xml中的下列配置將耗時很長的文件wls8.jsp配置一個專用執行隊列:
這裏執行隊列名爲“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);
- //Setting the initial context
- Context ctx = env.getInitialContext();
- //Retrieving the server-specific MBeanHome interface
- 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();
- //長時間操作,通過sleep來模擬
- Thread.sleep(30000);
- %>
- </ol>
- </body>
- </html>
在WebLogic 9中,執行隊列的概念已經被Work Manger取代了。