powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / tomcat: как заставить его переключиться на второй сервлет при простое первого ?
6 сообщений из 6, страница 1 из 1
tomcat: как заставить его переключиться на второй сервлет при простое первого ?
    #38486588
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

В одной умной книге по сервлетам - Буди Курнявана - есть пример, на стр. 65, показывающий чтение одного и того же счетчика двумя окнами (что, очевидно, не есть гут).
Если перевести этот пример на core java, без всяких сервлетов, то воспроизводится всё элементарно:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
import static java.lang.System.*;
import java.text.*;
import java.util.*;
import java.io.*;

public class ThreadTest {

  private static SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
  private static final String COUNTER_FILE = "d:\\temp\\counter.txt";
  public static void main(String[] args) {
    new ThreadTest().go(COUNTER_FILE);
  }
  void go(String fileName) {
    int cnt = 0;
    out.println( "\n\n"+System.currentTimeMillis()+": intro thread "+Thread.currentThread().getId() );

    // obtain from file previously saved value of counter:
    try {
      BufferedReader br = new BufferedReader( new FileReader(fileName) );
      out.println( System.currentTimeMillis()+": start reading next cnt. . ." );
      cnt = Integer.parseInt( br.readLine() );
      br.close();
      out.println( System.currentTimeMillis()+": done reading next cnt. . ." );
    } catch(Exception x) {
      x.printStackTrace();
    }

    // increment the counter:
    cnt++;

    out.println( "\n"+System.currentTimeMillis()+": increment cnt, new value="+cnt+"\n" );

    // artificial delay:
    try {
      Thread tx = new Thread();
      tx.sleep(5000);
    } catch(InterruptedException x) { x.printStackTrace(); }

    // and save new value:
    try {
      BufferedWriter bw = new BufferedWriter( new FileWriter(fileName) );
      out.println( System.currentTimeMillis()+": start writing next cnt. . ." );
      bw.write( Integer.toString(cnt) );
      bw.close();
      out.println( System.currentTimeMillis()+": done writing next cnt. . ." );
    } catch(Exception x) {
      x.printStackTrace();
    }
    out.println( System.currentTimeMillis()+": bye-bye from thread "+Thread.currentThread().getId()+"\n" );
  }
}

И при запуске его в двух окнах действительно видно, что идёт чтение одного и того же счетчика.

Этот же пример, переделанный "под сервлеты" и запускаемый в двух окнах браузера, приводит к выводу в консоли Томката сообщений строго в послед. порядке:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
import static java.lang.System.*;
import java.text.*;
import javax.servlet.*;
import java.util.*;
import java.io.*;

public class SingleThreadServlet extends GenericServlet {

  private static SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");

  public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
    int cnt = 0;
    out.println( "\n\n"+System.currentTimeMillis()+": intro thread "+Thread.currentThread().getId() );

    // obtain from file previously saved value of counter:
    try {
      BufferedReader br = new BufferedReader( new FileReader("d:\\temp\\counter.txt") );
      out.println( System.currentTimeMillis()+": start reading next cnt. . ." );
      cnt = Integer.parseInt( br.readLine() );
      br.close();
      out.println( System.currentTimeMillis()+": done reading next cnt. . ." );
    } catch(Exception x) {
      x.printStackTrace();
    }

    // increment the counter:
    cnt++;

    out.println( "\n"+System.currentTimeMillis()+": increment cnt, new value="+cnt+"\n" );

    // artificial delay:
    try {
      Thread tx = new Thread();
      tx.sleep(5000);
    } catch(InterruptedException x) { x.printStackTrace(); }

    // and save new value:
    try {
      BufferedWriter bw = new BufferedWriter( new FileWriter("d:\\temp\\counter.txt") );
      out.println( System.currentTimeMillis()+": start writing next cnt. . ." );
      bw.write( Integer.toString(cnt) );
      bw.close();
      out.println( System.currentTimeMillis()+": done writing next cnt. . ." );
    } catch(Exception x) {
      x.printStackTrace();
    }

    try {
      PrintWriter o = res.getWriter();
      o.println( sdf.format( System.currentTimeMillis() )+": you are visitor #"+cnt);
      out.println( System.currentTimeMillis()+": bye-bye from thread "+Thread.currentThread().getId()+"\n" );
    } catch(Exception x) {
      x.printStackTrace();
    }
  }
}

Вот пример вывода в консоли Томката:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
02.12.2013 20:15:02 org.apache.catalina.core.StandardContext reload
INFO: Reloading Context with name [/myApp] has started

1386004517625: intro thread 19
1386004517625: start reading next cnt. . .
1386004517625: done reading next cnt. . .

1386004517625: increment cnt, new value=831

1386004522625: start writing next cnt. . .
1386004522625: done writing next cnt. . .
1386004522625: bye-bye from thread 19

 -- во втором окне не начнёт, пока не завершится запрос от первого окна: 
1386004522718: intro thread 19
1386004522718: start reading next cnt. . .
1386004522718: done reading next cnt. . .

1386004522718: increment cnt, new value=832

1386004527734: start writing next cnt. . .
1386004527734: done writing next cnt. . .
1386004527734: bye-bye from thread 19

То есть, второй сервлет не начинает запускаться раньше первого.

Как это исправить ?

PS. Добавление maxThreads="300" в conf/server.xml (тег <Connector port="8080" protocol="HTTP/1.1" . . . />) - не помогло. Но судя по гуглению, этот параметр можно и не указывать, он по дефолту = 3000.

PPS.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Server version: Apache Tomcat/6.0.36
Server built:   Oct 16 2012 09:59:09
Server number:  6.0.36.0
OS Name:        Windows 2000
OS Version:     5.0
Architecture:   x86
JVM Version:    1.6.0_31-b05
JVM Vendor:     Sun Microsystems Inc.
...
Рейтинг: 0 / 0
tomcat: как заставить его переключиться на второй сервлет при простое первого ?
    #38486619
Alexander A. Sak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может, дело в браузере?
...
Рейтинг: 0 / 0
tomcat: как заставить его переключиться на второй сервлет при простое первого ?
    #38486626
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexander A. Sak,

у меня тут FF 4.0.1. Что-то не вижу я в его настройках ничего на тему сабжа.
...
Рейтинг: 0 / 0
tomcat: как заставить его переключиться на второй сервлет при простое первого ?
    #38486627
Alexander A. Sak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй два разных браузера запустить. Я сталкивался, что FF по одному URL не посылает одновременно более одного запроса.
...
Рейтинг: 0 / 0
tomcat: как заставить его переключиться на второй сервлет при простое первого ?
    #38486657
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
так и есть! запустил IE - всё пошло ОК.
Спасибо!
...
Рейтинг: 0 / 0
tomcat: как заставить его переключиться на второй сервлет при простое первого ?
    #38486714
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PS. в FF конфиг-параметры, содержащие слово 'connect', видимо на это не влияют.
В итоге, всё разрулилось маппингом: задал еще один шаблон УРЛа на тот же сервлет и всё стало читаться "в параллель".
web.xml
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    " http://java.sun.com/dtd/web-app_2_3.dtd"> 
<web-app>

  <servlet>
    <servlet-name>t1servlet</servlet-name>
    <servlet-class>SingleThreadServlet</servlet-class>
  </servlet>


  <servlet-mapping>
    <servlet-name>t1servlet</servlet-name>
    <url-pattern>/t1servlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>t1servlet</servlet-name>
    <url-pattern>/t2servlet</url-pattern>
  </servlet-mapping>

</web-app>
Теперь в двух окнах жмякая:
- получаю в консоли томката:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20131202_224633.031: intro thread  19 
20131202_224633.031: start reading next cnt. . .
20131202_224633.031: done reading next cnt. . .

20131202_224633.031: increment cnt, new value= 853
 

20131202_224633.906: intro thread  39 
20131202_224633.906: start reading next cnt. . .
20131202_224633.906: done reading next cnt. . .

20131202_224633.906: increment cnt, new value= 853
 
20131202_224638.031: start writing next cnt. . .
20131202_224638.031: done writing next cnt. . .
20131202_224638.031: bye-bye from thread 19

20131202_224638.906: start writing next cnt. . .
20131202_224638.906: done writing next cnt. . .
20131202_224638.906: bye-bye from thread 39
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / tomcat: как заставить его переключиться на второй сервлет при простое первого ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]