Ответ 1
Я нашел это сейчас:
boolean isDebug = java.lang.management.ManagementFactory.getRuntimeMXBean().
getInputArguments().toString().indexOf("jdwp") >= 0;
Это проверит, используется ли агент Java Debug Wire Protocol.
Как программа Java может узнать, работает ли она в режиме отладки?
Приложение должно вести себя немного иначе в обычном режиме "полной скорости", чем в "режиме отладки" (при подключении отладчика при запуске в режиме отладки). Приложение взаимодействует через TCP с другим компьютером, другим процессом или внутри себя. Мой сотрудник хочет, чтобы мы использовали Socket.setSoTimeout(1000)
по умолчанию, так что чтение из сокета может блокироваться не более 1 секунды. При отладке этого, конечно, недостаточно, и приложение перестает работать так, как должно. Таким образом, решение было бы установить SO_TIMEOUT
выше, но только в режиме отладки (например: без ограничений). Теперь я не всегда устанавливаю точки останова или не хочу использовать отладочную сборку, где я мог бы самостоятельно установить свойство "debug". Иногда я прикрепляю отладчик (удаленная отладка). Я в основном использую Eclipse, поэтому решение, которое просто работает, в порядке.
Возможные ответы:
Чтобы узнать, запущен ли в режиме отладки, используйте следующий метод в java.lang.management.*
или javax.management.*
...
Ваш коллега ошибочен по причине X, вы не должны устанавливать SO_TIMEOUT
на 1 секунду по умолчанию.
Я знаю об использовании системного свойства, но я оставляю вопрос открытым, чтобы решить свой первоначальный вопрос.
Я нашел это сейчас:
boolean isDebug = java.lang.management.ManagementFactory.getRuntimeMXBean().
getInputArguments().toString().indexOf("jdwp") >= 0;
Это проверит, используется ли агент Java Debug Wire Protocol.
Сделать тайм-аут настраиваемым. Самый простой способ - просто использовать системное свойство и прочитать его с помощью Integer.getInteger
:
private final static int SOCKET_TIMEOUT =
Integer.getInteger("com.yourapp.module.socketTimeout", 1000); // default 1 sec
Затем, при запуске приложения для отладки, просто установите свойство из командной строки (или соответствующего файла конфигурации, в зависимости от среды, в которой работает ваше приложение):
java -Dcom.yourapp.module.socketTimeout=1000000 MainClass
Это хорошо, потому что это не волшебным образом изменяет поведение при запуске приложения в отладчике, и вы можете изменить таймаут, когда не отлаживаете (например, если вам нужно запустить его где-нибудь с медленным подключением, некоторые день).
(Конечно, если ваша система уже использует файл конфигурации, может быть целесообразно добавить это значение в качестве записи там.)
В зависимости от того, соответствует ли одна секунда тайм-ауту... полностью зависящему от приложения. Иногда лучше дать правильный ответ в конце концов, другие неудачные времена лучше, чем ждать успеха.
Вы решаете неправильную проблему. Ваша программа не должна знать об этом, если она не связана с внутренними системами eclipse или jvm.
Используйте системное свойство со значением по умолчанию:
int timeout = Integer.parseInt(
System.getProperty("socket.timeout", "1000"));
socket.setSoTimeout(timeout);
И в конфигурации запуска отладки просто добавьте
-Dsocket.timeout=20000
к параметрам вызова
(Если вы не укажете системное свойство, будет использоваться значение по умолчанию)