2009-10-14 9 views
2

Я не совсем уверен, что вопрос задать здесь, так как я не знаю, словарный запас ...Процессы с точки зрения состояния (демоны?) В Tomcat?

Tomcat сервлетов (и любой сервер по этому вопросу) работают хорошо, если они являются лицами без гражданства и быстро реагировать на запросы, с состоянием, хранящимся в базе данных. Похоже, если у меня есть длительные операции, возможно, я хочу запустить другую службу в фоновом режиме и обработать обработчики Tomcat. Есть ли способ запустить длинное приложение Java в той же JVM, что и Tomcat, и взаимодействовать с ним через «обычный» сервлет Tomcat?


Пример: Допустим, я хочу предложить RESTful сервис число факторизации в HTTP.

Вот возможный сценарий (я надеюсь, что у меня есть правильный синтаксис HTTP, я опускаю большинство заголовков):

# comments start with #, > = request, < = response 
# 
# first we create a queue 
> POST /factorizer/create-queue 
> {information here} 
< queue=12345B 
# then we post some numbers to it 
> POST /factorizer/queue/12345B 
> 123 
> 456 
> 678 
> 123456789
< OK 
# let's look at the status 
> GET /factorizer/queue/12345B/status 
< requested=4 
< processed=3 
# query 
> GET /factorizer/queue/12345B/7 
< Error: invalid index 
> GET /factorizer/queue/12345B/3 
< Error: not complete 
> GET /factorizer/queue/12345B/0 
< 123=3*41 
# wait a while 
> GET /factorizer/queue/12345B/status 
< requested=4 
< processed=4 
> GET /factorizer/queue/12345B/3 
< 123456789=3*3*3*7*13*31*37*211*241*2161*3607*3803*2906161 

я могу думать о том, как написать сервлет для обработки запросов, но как я мог бы начать реализацию службы демона/независимо работающего в той же JVM?

редактировать: В приведенном выше примере, что я хотел бы сделать, это иметь фоновое приложение, которое работает в автономном режиме, с рабочими очередями, фактор простых чисел, и имеет интерфейс Java, который поддерживает операции, которые Tomcat сервлеты могут использовать для предоставления услуги в Интернете. Тогда мне не нужно беспокоиться о веб-интерфейсе или HTTP в моем фоновом приложении, и мне не нужно беспокоиться о проблемах многопоточности или простой факторизации в моих сервлетах.

+0

ли все сервлеты в том же веб-приложения? –

+0

есть. (просто любопытно: что изменилось бы, если бы я сказал нет, но все они были сербами Tomcat в одной JVM?) –

+0

Если я правильно помню, приложения Tomcat в одной JVM изолированы друг от друга. Вместо Tomcat вам понадобится нечто вроде JBoss, который использует Enterprise Java Beans. В качестве альтернативы вы можете поместить много сервлетов в одно приложение Tomcat, и они могут видеть друг друга. –

ответ

1

Если вам не обязательно нужно находиться в одном JVM (то есть, если вам не нужна производительность прямого доступа к объектам), вы можете написать другое приложение Tomcat и связать с ним другие приложения HTTP to localhost. Фактически вы будете писать веб-службу, которая будет работать на одной машине. (Я не знаю, как еще несколько приложений Tomcat могут видеть друг друга. Это проблема, которую решает Enterprise Java Beans, но это может быть слишком тяжелое решение для вас.)

Если у вас есть только одно приложение Tomcat это нужно сделать, создать рабочий поток и поместить его в контекст приложения, где все запросы могут связываться с ним.

Что касается вашей конкретной проблемы, похоже, что вы описываете что-то вроде шаблона асинхронной работы в книге «Восстанавливающие веб-службы O'Reilly». Это использует код состояния «202 Accepted», чтобы указать, что обработка не завершена. См. «Асинхронные операции» в главе 8 книги.

http://www.amazon.com/RESTful-Web-Services-Leonard-Richardson/dp/0596529260/ref=sr_1_1?ie=UTF8&s=books&qid=1255555328&sr=8-1

+0

"контекст приложения"? есть ли учебник для этого? Я достаточно знаком с рабочими потоками, чтобы знать, как справляться с большинством аспектов многопоточности/параллелизма. –

+0

Ваш сервлет расширяет HttpServlet. HttpServlet.getServletContext() возвращает ServletContext (или область приложения), видимую всеми запросами. ServletContext.setAttribute (имя строки, значение объекта) и ServletContext.getAttribute (имя строки) позволяют помещать туда что угодно.Учебник Java Server Pages, вероятно, имеет наибольшее значение в этом вопросе. –

+0

ой, аккуратный. это звучит так, как будто я хочу. Благодаря! –