Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Sevlet, лишние треды, Tomcat NetBeans RMI Servlet 
V
    Опции темы
Fieral
Дата 8.2.2009, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 250
Регистрация: 10.12.2007

Репутация: нет
Всего: 1



Такая проблемма:

Есть сервлет, который дёргает RMI метод на удалённом сервере:

Код

...
 protected void processRequest(HttpServletRequest Q, HttpServletResponse R)
            throws ServletException, IOException {
        int t = 0;
        l.lock();
        try {
            k++;
            t = k;
        } finally {
            l.unlock();
        }

        System.out.println("Do " + t);
                  ....
               .....RMI вызов, обработка показывает страницу...
                  ....
        System.out.println("UnDo " + t);

    }


Так вот видно что i это номер текущего вхождения в processRequest()
И в консоли поначалу печатается

Do 1 
UnDo 1
Do 2 
UnDo 2
Do 3 
UnDo 3
Do 4 
UnDo 4
...
НО потом начинается что-то типа:
Do 1 
Do 2 
UnDo 1
UnDo 2
Do 3 
Do 4 
UnDo 4
Do 5 
Do 6
Do 7  
UnDo 5
UnDo 3
UnDo 7
UnDo 6
...

Если же распечатать номер треда который делает вход
System.out.println("Do " + t+" th "+Thread.currentThread().toString());
 то там можно увидеть примерно такое:

Do 7 th Thread[http-8080-3,5,main]
Do 8 th Thread[http-8080-2,5,main]
Do 6 th Thread[http-8080-5,5,main]

тоесть получается что один запрос обрабатывают несколько тредов с именами  вида "Thread[http-8080-*,5,main]"

судя по логам RMI сервера - его удалённый метод вызывает каждый тред без исключения
в браузере же показывается результат работы только одного из них (причём не понятно какого - каждый раз разный)
////Но мне необходимо чтоб на одно открытие страницы удалённый метод вызывался один раз.

Вопрос: откуда берутся лишние треды, зачем они нужны и что с ними делать?

PM MAIL   Вверх
COVD
Дата 8.2.2009, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 4
Всего: 43



Цитата

тоесть получается что один запрос обрабатывают несколько тредов с именами  вида "Thread[http-8080-*,5,main]"

Неправильный вывод. Один запрос обрабатывается одним потоком. После завершения обработки запроса поток возвращается в пул.

Цитата

Do 7 th Thread[http-8080-3,5,main]
Do 8 th Thread[http-8080-2,5,main]
Do 6 th Thread[http-8080-5,5,main]


это три разных запроса
PM MAIL   Вверх
Fieral
Дата 8.2.2009, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 250
Регистрация: 10.12.2007

Репутация: нет
Всего: 1



откуда тогда берутся лишние запросы? если я открываю один браузер и в нем одну вкладку?
--------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор.
PM MAIL   Вверх
COVD
Дата 9.2.2009, 01:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 4
Всего: 43



Один вызов метода processRequest - это один запрос. Если метод обьявить synchronized, то запросы будут обрабатываться поочередно. Откуда "лишние" запросы только вы сами можете определить. Анализируйте хтмл страницу - может там auto refresh указан или еще что-то.

Это сообщение отредактировал(а) COVD - 9.2.2009, 01:39
PM MAIL   Вверх
Fieral
Дата 9.2.2009, 01:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 250
Регистрация: 10.12.2007

Репутация: нет
Всего: 1



Код

protected void processRequest(HttpServletRequest Q, HttpServletResponse R)
            throws ServletException, IOException {
        HttpSession S = null;
        l.lock();
        try {
            S = Q.getSession(true);

            System.out.println("Do " + "  " + Thread.currentThread().toString() + " " + S + " : ");
            System.out.println(">>> " + S.getId());
..................................
..................................
..................................
        

        } finally {
            l.unlock();
        }
        System.out.println("UnDo " + "  " + Thread.currentThread().toString());

    }


Do   Thread[http-8080-3,5,main] org.apache.catalina.session.StandardSessionFacade@272961 : 
>>> 795906749AA85B128D733F7B3D819029

UnDo   Thread[http-8080-3,5,main]

Do   Thread[http-8080-1,5,main] org.apache.catalina.session.StandardSessionFacade@272961 : 
>>> 795906749AA85B128D733F7B3D819029

UnDo   Thread[http-8080-1,5,main]

Do   Thread[http-8080-3,5,main] org.apache.catalina.session.StandardSessionFacade@272961 : 
>>> 795906749AA85B128D733F7B3D819029

Do   Thread[http-8080-1,5,main] org.apache.catalina.session.StandardSessionFacade@272961 : 
>>> 795906749AA85B128D733F7B3D819029

UnDo   Thread[http-8080-3,5,main]

UnDo   Thread[http-8080-1,5,main]

Do   Thread[http-8080-3,5,main] org.apache.catalina.session.StandardSessionFacade@272961 : 
>>> 795906749AA85B128D733F7B3D819029

UnDo   Thread[http-8080-3,5,main]


Почему тогда несколько стредов и у всех одинаковый Session ID?

страница одна и таже а количесво тредов меняется от одного до 7

Это сообщение отредактировал(а) Fieral - 9.2.2009, 01:49
--------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор.
PM MAIL   Вверх
Kangaroo
Дата 9.2.2009, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 14
Всего: 104



Цитата(Fieral @  9.2.2009,  01:40 Найти цитируемый пост)
Почему тогда несколько стредов и у всех одинаковый Session ID?

Так сессия для того и есть, чтобы быть одной для разных страниц/запросов. Пробуй это:
Цитата(COVD @  9.2.2009,  01:18 Найти цитируемый пост)
Откуда "лишние" запросы только вы сами можете определить. Анализируйте хтмл страницу - может там auto refresh указан или еще что-то.




--------------------
Lost....
PM MAIL MSN   Вверх
am_sasa
Дата 9.2.2009, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 19.12.2006

Репутация: нет
Всего: нет



Цитата(Fieral @ 9.2.2009,  01:40)
Почему тогда несколько стредов и у всех одинаковый Session ID?

может маппинг неверный? вот и лезут левые запросы, например за картинками...
PM MAIL   Вверх
Fieral
Дата 9.2.2009, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 250
Регистрация: 10.12.2007

Репутация: нет
Всего: 1



Ох.
В общем порядок такой:
1) Сервлетт замапен на "/"
2) Открываю страницу http://localhost:9000/WebApplication4/
3) Сервлет из protected void processRequest(HttpServletRequest Q, HttpServletResponse R)
бросает запрос на RMI сервер, который возвращает инстанц класса Anton_Doc
4) Сервлет вызывает метод этого класса .Save2Stream(out);  где out это PrintWrite респонса.

Так и не пойму откуда лишие запросы лезут.

Вот собсно код DoDo, web.xml и записываемая страница:
Код

 public void Do(HttpServletRequest Q, HttpServletResponse R,int Time) {
        NewServlet n = this;


        VectorMap<String, String> V = n.getVar(Q);
        V.print();
        Anton_Doc d = null;

        try {

            P.Play();
            Message M = new Message("DoDo");
            M.addAttachment("VAR", V);
            M.PrintMessage();
            P.putMail(M);
            ;
            if (!sleepWhile(!P.newMailAvailable(),Time)) {
                Message F = P.getMail();
                F.PrintMessage();
                d = (Anton_Doc) F.getAttachment("HTML");

            }
            P.Stop();

        } catch (Exception ex) {
            ex.printStackTrace();
            d = null;
        }



        if (d == null) {
            n.saySorry(Q, R);
        } else {
            try {
                PrintWriter out = R.getWriter();
                d.Save2Stream(out);
                out.flush();
                out.close();
            } catch (Exception ex) {
                n.saySorry(Q, R);
            }
        }



    }


web.xml
Код

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <servlet>
        <servlet-name>NewServlet</servlet-name>
        <servlet-class>NewServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>NewServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
        </welcome-file-list>
    </web-app>



Код

<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<style type="text/css">/* Reset */
body,img,p,h1,h2,h3,h4,h5,h6,ul,ol {margin:0; padding:0; list-style:none; border:none;}
/* End Reset */

body {font-size:0.8em; font-family:Arial,Verdana,Sans-Serif; background: #000;}
a {color:white;}

/* Colors */
.color-yellow {background:#f2bc00;}
.color-red    {background:#dd0000;}
.color-blue   {background:#148ea4;}
.color-white  {background:#dfdfdf;}
.color-orange {background:#f66e00;}
.color-green  {background:#8dc100;}
.color-yellow h3,
.color-white h3,
.color-green h3
    {color:#000;}
.color-red h3,
.color-blue h3,
.color-orange h3
    {color:#FFF;}
/* End Colors */

/* Head section */
#head {
    background: #000 url(img/head-bg.png) repeat-x;
    height: 100px;
}
#head h1 {
    line-height: 100px;
    color: #FFF;
    text-align: center;
    background: url(img/inettuts.png) no-repeat center;
    text-indent: -9999em
}
/* End Head Section */

/* Columns section */
#columns .column {
    float: center;
    width: 100%;
        /* Min-height: */
        min-height: 400px;
        height: auto !important; 
        height: 400px;
}

/* Column dividers (background-images) : */
    #columns #column1 { background: url(img/column-bg-left.png) no-repeat right top; }
    #columns #column3 { background: url(img/column-bg-right.png) no-repeat left top; }
    
#columns #column1 .widget { margin: 30px 35px 0 25px; }
#columns #column3 .widget { margin: 30px 25px 0 35px; }
#columns .widget {
    margin: 30px 20px 0 20px;
    padding: 2px;
    -moz-border-radius: 4px;
    -webkit-border-radius: 4px;
}
#columns .widget .widget-head {
    color: #000;
    overflow: hidden;
    width: 100%;
    height: 30px;
    line-height: 30px;
}
#columns .widget .widget-head h3 {
    padding: 0 5px;
    float: left;
}
#columns .widget .widget-content {
    background: #333 url(img/widget-content-bg.png) repeat-x;
    padding: 0 5px;
    color: #DDD;
    -moz-border-radius-bottomleft: 2px;
    -moz-border-radius-bottomright: 2px;
    -webkit-border-bottom-left-radius: 2px;
    -webkit-border-bottom-right-radius: 2px;
    line-height: 1.2em;
    overflow: hidden;
}
#columns .widget .widget-content p {
    padding: 0.8em 0;
    border-bottom: 1px solid #666;
}
#columns .widget .widget-content img {
    float: right;
    margin: 10px;
    border: 1px solid #FFF;
}
#columns .widget .widget-content pre {
    padding: 0.5em 5px;
    color: #EEE;
    font-size: 12px;
}
#columns .widget .widget-content ul {
    padding: 5px 0 5px 20px;
    list-style: disc;
}
#columns .widget .widget-content ul li {padding: 3px 0;}
#columns .widget .widget-content ul.images {
    padding: 7px 0 0 0;
    list-style: none;
    height: 1%;
}
#columns .widget .widget-content ul.images li {
    display: inline;
    float: left;
}
#columns .widget .widget-content ul.images img {
    display: inline;
    float: left;
    margin: 0 0 7px 7px;
}
/* End Columns section */

</style>
<title>no_name</title>
</head>
<body>
<div id="columns">
<ul class="column" id="column1">
<li class="widget color-green" ID="intro">
<div class="widget-head">
<h3>Wiget head message!</h3>
</div>
<div class="widget-content">

<p>Description!</p>
<ul></ul>
<p>Time: Mon Feb 09 14:35:54 CET 2009</p>
</div>
</li>
</ul>
</div>
<script type="text/javascript" src="jquery-1.2.6.min.js"></script><script type="text/javascript" src="jquery-ui-personalized-1.6rc2.min.js"></script><script type="text/javascript" src="inettuts.js"></script>
</body>
</html>


Это сообщение отредактировал(а) Fieral - 9.2.2009, 16:37
--------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор.
PM MAIL   Вверх
Fieral
Дата 9.2.2009, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 250
Регистрация: 10.12.2007

Репутация: нет
Всего: 1



В общем, несколько тредов вызывается если сервлетт замапин на / или /*
Судя по всему это особенность Томката, который заходя на / вызывает сервлетт по адресу /, после чего делает новый запрос по редиректу и зацикливается, пока огранечитель на число запросов или ещё какая-та там система защиты не останавливает это мракобесие. Других версий у меня нет.

--------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор.
PM MAIL   Вверх
am_sasa
Дата 11.2.2009, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 19.12.2006

Репутация: нет
Всего: нет



Цитата(Fieral @ 9.2.2009,  19:42)
Других версий у меня нет.

 а у меня версия есть! это к тебе прут вот эти запросы
Код

<script type="text/javascript" src="jquery-1.2.6.min.js"></script>
<script type="text/javascript" src="jquery-ui-personalized-1.6rc2.min.js"></script>
<script type="text/javascript" src="inettuts.js" ></script>

это как минимум, дальше не смотрел, вставь печать запроса и усе увидишь
PM MAIL   Вверх
Fieral
Дата 11.2.2009, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 250
Регистрация: 10.12.2007

Репутация: нет
Всего: 1



без 
Код

<script type="text/javascript" src="jquery-1.2.6.min.js"></script>
<script type="text/javascript" src="jquery-ui-personalized-1.6rc2.min.js"></script>
<script type="text/javascript" src="inettuts.js" ></script>

тоже самое
--------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор.
PM MAIL   Вверх
am_sasa
Дата 11.2.2009, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 19.12.2006

Репутация: нет
Всего: нет



Цитата(Fieral @ 11.2.2009,  17:00)
без 
Код

<script type="text/javascript" src="jquery-1.2.6.min.js"></script>
<script type="text/javascript" src="jquery-ui-personalized-1.6rc2.min.js"></script>
<script type="text/javascript" src="inettuts.js" ></script>

тоже самое

так там в стилях еще картинки!
сделай тестовую страницу с хело ворлд и не парься, сразу все поймешь.
Короче, делай нормальный мапинг и будет тебе счасть smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.1085 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.