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

В одной умной книге по сервлетам - Буди Курнявана - есть пример, на стр. 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
02.12.2013, 20:46:35
    #38486619
Alexander A. Sak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
tomcat: как заставить его переключиться на второй сервлет при простое первого ?
Может, дело в браузере?
...
Рейтинг: 0 / 0
02.12.2013, 20:55:57
    #38486626
ozzmosis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
tomcat: как заставить его переключиться на второй сервлет при простое первого ?
Alexander A. Sak,

у меня тут FF 4.0.1. Что-то не вижу я в его настройках ничего на тему сабжа.
...
Рейтинг: 0 / 0
02.12.2013, 20:57:41
    #38486627
Alexander A. Sak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
tomcat: как заставить его переключиться на второй сервлет при простое первого ?
Попробуй два разных браузера запустить. Я сталкивался, что FF по одному URL не посылает одновременно более одного запроса.
...
Рейтинг: 0 / 0
02.12.2013, 21:28:11
    #38486657
ozzmosis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
tomcat: как заставить его переключиться на второй сервлет при простое первого ?
так и есть! запустил IE - всё пошло ОК.
Спасибо!
...
Рейтинг: 0 / 0
02.12.2013, 22:50:11
    #38486714
ozzmosis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
tomcat: как заставить его переключиться на второй сервлет при простое первого ?
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
Форумы / Java [игнор отключен] [закрыт для гостей] / tomcat: как заставить его переключиться на второй сервлет при простое первого ? / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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