Политики Weblogic WorkManager через war в ejb-jar

#weblogic #workmanagers

#weblogic #workmanagers

Вопрос:

У меня есть сервлет, который использует defaultWM для Weblogic. Этот сервлет, в свою очередь, вызывает ejb. Этот ejb связан с другим WM ( WM_EJB ). Что я хотел бы знать, когда поток поступает для обработки через сервлет, использует ли сервлет defaultWM, а затем переносит тот же контекст WM в вызов ejb? или есть переключатель?

т.е.

  1. Внешний запрос к ServletA — ServletA настроен с DefaultWM
  2. СервлетА обрабатывает запрос и вызывает EJB.HelloWorld()
  3. EJB.HelloWorld() настроен с помощью WM_EJB workmanager

Использует ли весь процесс DefaultWM или он включает вызов EJB.HelloWorld()

Мои извинения, если на этот вопрос был дан ответ где-то еще, я не смог найти ответ на WM flow.

Ответ №1:

Я провел некоторые исследования по этому вопросу, и мой ответ заключается в том, что Weblogic * переключится с DefaultWM на WorkManager компонента, скажем, EJB_WM *, если он определен.

Помните, что поток выполнения остается тем же — поэтому, как только поступил запрос, тот же поток выполнит сервлет, а затем EJB.

В моем примере приложения я запускаю 50 одновременных вызовов index.jsp, тогда как в weblogic-ejb-jar.xml , я определил это ограничение только для EJB

 <work-manager>
       <name>WorkManagerA</name>
       <max-threads-constraint>
          <name>MyMaxThreadCount</name>
          <count>1</count>
       </max-threads-constraint>
    </work-manager>
  

Я вижу журналы, показывающие 2 параллельных вызова в разных потоках 6 и 8 в index.jsp

 INDEX.JSP - Current ThreadName Is: [ACTIVE] ExecuteThread: '6' for queue: 'weblogic.kernel.Default (self-tuning)'

INDEX.JSP - Current ThreadName Is: [ACTIVE] ExecuteThread: '8' for queue: 'weblogic.kernel.Default (self-tuning)'
  

Теперь еще несколько инструкций журнала

 Calling EJB from index.jsp 1317985368088[ACTIVE] ExecuteThread: '6' for queue: 'weblogic.kernel.Default (self-tuning)'
Start EJB 1317985368088[ACTIVE] ExecuteThread: '6' for queue: 'weblogic.kernel.Default (self-tuning)'
end EJB 1317985368088[ACTIVE] ExecuteThread: '6' for queue: 'weblogic.kernel.Default (self-tuning)'

Calling EJB from index.jsp 1317985368088[ACTIVE] ExecuteThread: '8' for queue: 'weblogic.kernel.Default (self-tuning)'
Start EJB 1317985368104[ACTIVE] ExecuteThread: '8' for queue: 'weblogic.kernel.Default (self-tuning)'
end EJB 1317985368104[ACTIVE] ExecuteThread: '8' for queue: 'weblogic.kernel.Default (self-tuning)'
  

Как показывают временные метки (System.currentTimeMillis()), index.jsp был вызван одновременно 1317985368088 из потоков 6 и 8, однако операторы
System.out.println, называемые «Start EJB» и «end EJB», имеют разные временные метки для потоков 6 и 8. Они находятся внутри EJB.

Это показывает, что EJB WorkManager выполняет свою задачу по ограничению количества параллельных потоков только до 1 за раз