powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Оцените пожалуйста кусочек кода или дайте рекомендации по улучшению.
6 сообщений из 6, страница 1 из 1
Оцените пожалуйста кусочек кода или дайте рекомендации по улучшению.
    #37670897
junixar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет. Ниже кусочек кода. Суть в том, что сессия хранится в мапе, и у неё проверяется, подключена ли она. Но возможна ситуация, что метод isConnected вернёт true, но при создании канала или его подключении выяснится, что сессия протухла. И тогда надо создать новую сессию и ещё раз попробовать создать канал. Но так, как это в коде ниже мне кажется некрасивым. Может кто более красивое решение подскажет?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Session session = sessionMap.get(multiKey);
			if (session == null || !session.isConnected())
			{
				session = createSession(userName, host, port);
				sessionMap.put(multiKey, session);
			}

			try
			{
				Channel channel = session.openChannel(channelType);
				return channel;
			}
			catch (JSchException ex)
			{
				LOG.error("Error by channel creating", ex);
				session.disconnect();

				session = createSession(userName, host, port);
				sessionMap.put(multiKey, session);
				return session.openChannel(channelType);
			}
...
Рейтинг: 0 / 0
Оцените пожалуйста кусочек кода или дайте рекомендации по улучшению.
    #37670921
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зависит от ответов на следующией вопросы
1) Есть ли какой-то другой способ провалидировать сессию без выброса исключения?
2) JSchException возникает только в указаном вами случае, или в других случаях тоже?
3) Из JSchException можно ли получить информацию о том стоит ли пытатся пересоздать сессию или ошибка более глобальная?
...
Рейтинг: 0 / 0
Оцените пожалуйста кусочек кода или дайте рекомендации по улучшению.
    #37670949
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что при session.isConnected() разве последнее время доступа к сессии не обновляется? Может есть какой-то метод в API для этого? Посмотрите. Ну а если говорить именно про ваш код, то можно сделать так -

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
     private Channel getChannel(Session session, boolean recreateSession){

         if(recreateSession){
             session = createSession(userName, host, port);
	     sessionMap.put(multiKey, session);
        }
         return session.openChannel(channelType);
    }


                        Session session = sessionMap.get(multiKey);
			try
			{
                                boolean sessionAlive = session != null && session.isConnected();
				getChannel(session, sessionAlive);
			}
			catch (JSchException ex)
			{
				LOG.error("Error by channel creating", ex);
				session.disconnect();
				getChannel(session, true);
			}
...
Рейтинг: 0 / 0
Оцените пожалуйста кусочек кода или дайте рекомендации по улучшению.
    #37670977
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя нет, тупанул, лучше так:

Код: 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.
//Try to open channel from given session. If session is null or not connected -  new session will be created
private Channel getChannel(Session session) throws JSchException{

         if(session == null || !session.isConnected()){
             Session newSession = createSession(userName, host, port);
	     sessionMap.put(multiKey, session);
             return newSession.openChannel(channelType);

        }
         return session.openChannel(channelType);
    }


                        Session session = sessionMap.get(multiKey);
			try
			{
				getChannel(session);
			}
			catch (JSchException ex)
			{
				LOG.error("Error by channel creating", ex);
				session.disconnect();
				getChannel(null);
			}
...
Рейтинг: 0 / 0
Оцените пожалуйста кусочек кода или дайте рекомендации по улучшению.
    #37671019
junixar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

Нет, провалидировать сессию по другому нельзя, только методом isConnected. Внутри метода openChannel тоже делается проверка, что всё ещё isConnected и в противном случае происходит JSchException. Проблема в том, что когда берём сессию, она может быть ещё isConnected, а когда делаем openChannel, она будет уже !isConnected. Из исключения ничего нужного достать нельзя.
...
Рейтинг: 0 / 0
Оцените пожалуйста кусочек кода или дайте рекомендации по улучшению.
    #37671021
junixar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл ник,

да, спасибо, всё ж покрасивее получается, чем было.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Оцените пожалуйста кусочек кода или дайте рекомендации по улучшению.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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