• Как замокать static объект через Mockito?

    @AndreiLED
    Короткий ответ: никак, Mockito позволяет замокать только локальные поля/методы

    Длинный ответ: надо править тестируемый код, чтобы добавить в него возможность из теста заменить стандартное значение статического поля замокированным. Или конвертировать статическое поле в локальное, что является рекомендованным подходом при написании тестируемого кода.
    Ответ написан
    Комментировать
  • Как настроить log4j для многопоточной среды?

    @AndreiLED
    так как MDC статический класс данные перезаписывались и снова каша

    Это не так - MDC использует ThreadLocal, поэтому значения в нем для каждого потока свои собственные, поэтому в лог файле для каждого сообщения будет выведен именно тот самый ид, который был указан в MDC именно для того потока, который сообщение и породил.

    Каша, скорее всего, возникает просто от того, что параллельные потоки пишут параллельно и в итоге в логах записи каждой конкретной сессии не идут все подряд, а перемежаются с другими сессиями.
    Но это совершенно нормально для логов в параллельной среде. Ид сессии в логи добавляют вовсе не для упорядочивания, а для того, чтобы потом было легко извлечь логи, относящиеся к определенной сессии. В простейшем варианте это делается через grep %session% file.log. Если система порождает множество ращнообразныз логов, то применяют системы вроде Splunk для упрощения поиска по множеству файлов и организации всех логов в единую базу.

    log4j.appender.asyncLog=com.log.AsyncAppenderHelper
    ПОможет ли он?

    Интересно почему какой-то сторонний класс (судя по пакету), а не AsyncAppender из самого log4j.
    Но тем не менее, это не поможет: задача, которую решают AsyncAppender-ом - это накапливать сообщения в памяти и потом пачкой записывать их на диск (RollingFileAppender - это синхронный appender и он пишет все сообщения в файл сразу же). Порядок сообщений при использовании AsyncAppender никак не меняется - они по прежнему идут в том порядке, в каком было порождены.
    Ответ написан
    Комментировать
  • Консольный Yandex.Disk - как сделать автозапуск демона Yandex.Disk на Debian?

    @AndreiLED
    Хм, не понимаю, зачем так усложнять себе жизнь cron-ом, если init.d скрипт пишется за 5-20 минут в зависимости от навыков: либо копипастой одного из имеющихся скриптов, либо по гайдам раз и два.
    К примеру, мой /etc/init.d/yadisk
    #!/bin/sh -e
    ### BEGIN INIT INFO
    # Provides:          yandex_disk
    # Required-Start:    $local_fs
    # Required-Stop:     $local_fs
    # Default-Start:     2 3 4 5
    # Default-Stop:      0 1 6
    # Short-Description: Manage Yandex.Disk deamon
    ### END INIT INFO
    
    # Various constants
    user=yadisk
    
    execute() {
        su -c "$1" "$user"
    }
    
    start() {
        echo "Starting Yandex.Disk daemon..."
        execute "yandex-disk start"
    }
    
    stop() {
        echo "Stopping Yandex.Disk daemon..."
        execute "yandex-disk stop"
    }
    
    status() {
        execute "yandex-disk status"
    }
    
    # Carry out specific functions when asked to by the system
    case "$1" in
      start)
        start
        ;;
      stop)
        stop
        ;;
      status)
        status
        ;;
      restart)
        stop
        start
        ;;
      *)
        echo "Usage: $0 {start|stop|status|restart}"
        exit 1
        ;;
    esac
    
    exit 0

    Главное не забыть после этого выполнить
    update-rc.d yadisk defaults
    Ответ написан
    5 комментариев