WebLogic 8 中長時間任務的處理

在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 是配置的執行線程名。

  1. <%@ page contentType="text/html;charset=GBK"%>
  2. <%@page import="javax.naming.Context"%>
  3. <%@page import="weblogic.management.MBeanHome"%>
  4. <%@page import="weblogic.management.runtime.ServerRuntimeMBean"%>
  5. <%@page import="weblogic.management.Helper"%>
  6. <%@page import="weblogic.management.runtime.ExecuteQueueRuntimeMBean"%>
  7. <%@page import="weblogic.jndi.Environment"%>
  8. <html>
  9. <body>
  10. <ol>
  11.     <%
  12.         String url = "t3://localhost:7001";
  13.         String serverName = "myserver";
  14.         String username = "weblogic";
  15.         String password = "weblogic";
  16.         String customQueue = "MyExecute Queue";
  17.         Environment env = new Environment();
  18.         env.setProviderUrl(url);
  19.         env.setSecurityPrincipal(username);
  20.         env.setSecurityCredentials(password);
  21.         //Setting the initial context            
  22.         Context ctx = env.getInitialContext();
  23.         //Retrieving the server-specific MBeanHome interface            
  24.         MBeanHome home = (MBeanHome) ctx.lookup(MBeanHome.LOCAL_JNDI_NAME);
  25.         ServerRuntimeMBean serverRuntimeMBean = (ServerRuntimeMBean) home
  26.                 .getRuntimeMBean(serverName, "ServerRuntime");
  27.         ExecuteQueueRuntimeMBean[] runtimeMBeans = serverRuntimeMBean
  28.                 .getExecuteQueueRuntimes();
  29.         for (int i = 0; i < runtimeMBeans.length; i++) {
  30.             ExecuteQueueRuntimeMBean runtime = runtimeMBeans[i];
  31.             out.println("<li><p>ExecuteQueue " + runtime.getName()
  32.                     + ".</p>TotalCount="
  33.                     + runtime.getExecuteThreadTotalCount()
  34.                     + ",CurrentIdleCount="
  35.                     + runtime.getExecuteThreadCurrentIdleCount());
  36.             if (runtime.getName().equals(customQueue)) {
  37.                 if (runtime.getExecuteThreadCurrentIdleCount() < 1) {
  38.                     out.println("System Busy.");
  39.                     return;
  40.                 }
  41.             }
  42.         }
  43.         response.flushBuffer();
  44.         //長時間操作,通過sleep來模擬
  45.         Thread.sleep(30000);
  46.     %>
  47. </ol>
  48. </body>
  49. </html>

在WebLogic 9中,執行隊列的概念已經被Work Manger取代了。

發佈了60 篇原創文章 · 獲贊 16 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章