2014-11-05 1 views
-1

У меня есть ServerSocket в одном из классов Java-проекта. Этот сокет получает некоторые команды, которые привели к новым действиям. Например:Лучший подход для ServerSocket Java

deleteAllFromDB -> Удаляет все записи в БД.

sendMsgToX -> Создание нового сообщения, отправляемые на X.

Что-то вроде:

in = new Scanner(s.getInputStream()); 
message = in.next(); 

    if (message.equalsIgnoreCase("deleteAllFromDB"){ 
    //code 
    //more code 
    //even more code 
    } 
... 

Хорошо, я думаю, что у вас появилась идея (это довольно простой, но я использую примеры потому что мои английские навыки могут запутать аудиторию).

Проблема в том, что методы внутри класса становятся все крупнее и тяжелее, поэтому сокет не считывает входящие сообщения до тех пор, пока метод не будет выполнен и не закончен.

Я думаю, что у меня есть 2 подхода к решению этого:

1. многопоточного

Вместо обработки входящих запросов в том же потоке, который принимает соединение клиента, то соединение передается на рабочую нить, которая обрабатывает запрос

http://tutorials.jenkov.com/java-multithreaded-servers/multithreaded-server.html

2. Резьбовые методы

После того, как я прочитал входящий запрос (message=in.next()), запускаю поток, который отвечает из методов, которые будут выполняться (deleteFromDB, sendMsgToX и т.д.).

Любой совет был бы действительно оценен. Кроме того, просто для того, чтобы упомянуть, я работаю с базой OSGi, даже я не думаю, что это релевантно для вопроса (на всякий случай ..).

Заранее благодарен!

+0

ли вы рассмотреть вопрос об использовании OSGi оболочки (Гого), которая поддерживает сеансы, которые могут быть легко подключены к розетке? –

+0

Сколько одновременных клиентов вы ожидаете? Вам нужно различать разных клиентов? нормально ли выполнять команды одновременно (так как есть БД, вам придется беспокоиться о транзакциях и атомарности)? – Yuri

+0

У вас есть «Socket». «ServerSocket» не может принимать команды. – EJP

ответ

0

Вы можете просто выполнить код, обрабатывающий сообщение в ExecutorService.

Как что:

//Outside the handler: 
pool = Executors.newFixedThreadPool(poolSize); 

// On message receipt 
message = in.next(); 
pool.execute(new MessageHandler(message)); 

Таким образом, вы можете хорошо масштабироваться путем установки PoolSize.

Так что я думаю, что был бы метод 2