Spring MVC: потоки не выполняются в производстве

1
  • Я работаю над приложением Spring-MVC, в котором я хочу использовать потоки, чтобы я мог быстрее выполнять транзакции базы данных, отправку электронной почты, запросы на запуск и перезагрузку. К сожалению, они не работают на производственном сервере. Я помещаю system.out, и он не входит в сам поток. У меня есть thread.start().
    • Для приложения-сервера я использую apache-tomcat. Я отправлю файл server.xml и место, где я использовал поток.
    • Еще один вопрос. Я отправляю thread.start(), когда хочу начать поток. Когда задача в потоке завершена, поток автоматически умирает и память очищается, занятая этим потоком?

GroupMemberServiceImpl:

 Thread thread = new Thread(() -> {
        if (!(existingMember == null)) {
            if (!(this.groupMembersDAO.checkIfMemberAlreadyExists(existingMember.getUsername(), groupId))) {
                members.setMemberUsername(members.getMemberUsername().toLowerCase());
                members.setMemberactivated(true);
                createToken(existingMember.getFirstName(),members.getMemberUsername(), members.isAccesslevel(), groupId);
                WaitingMembers waitingMembers = new WaitingMembers();
                waitingMembers.setGroupAccountId(groupId);
                waitingMembers.setMemberEmail(members.getMemberUsername());
                waitingMembers.setNickName(nickName);
                this.waitingMembersService.addMemberInWaiting(waitingMembers);

            }
        } else {
            GroupAccount groupAccount = this.groupAccountService.getGroupById(groupId);
            WaitingMembers waitingMembers = new WaitingMembers();
            waitingMembers.setGroupAccountId(groupId);
            waitingMembers.setMemberEmail(members.getMemberUsername());
            waitingMembers.setNickName(nickName);
            this.waitingMembersService.addMemberInWaiting(waitingMembers);
            Person inviter = this.personService.findPersonByUsername(groupAccount.getAdminUsername());
            sendFirstTimeGroupUserAccountActivationEmail(nickName, members, inviter.getFirstName(), groupAccount.getGroupName(), groupId);

        }
    });
    thread.start();

Что-то не так с тем, как я использую потоки? Любой сложный способ, который может предотвратить проблему?

Я использую https, сжатие и кеширование на производстве.

Server.xml на производстве:

 <Connector port="80" protocol="HTTP/1.1" compression="force" compressionMinSize="1024" 
               connectionTimeout="20000"
               redirectPort="443" URIEncoding="utf-8"
 compressableMimeType="text/html,text/xml,text/plain,text/css,text/ javascript,application/x-javascript,application/javascript"/>


<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="200" compression="force"
              compressionMinSize="1024" scheme="https" secure="true" clientAuth="false"  sslProtocol="TLS"
               keystoreFile="/etc/ssl/private/my-keystore.jks" keystorePass="password" URIEncoding="utf-8"
 compressableMimeType="text/html,text/xml,text/plain,text/css,text/ javascript,application/x-javascript,application/javascript"
/>

Любая помощь будет приятной. Большое спасибо.

Теги:
multithreading
spring
spring-mvc
tomcat

1 ответ

0

Лучше определить ThreadPoolTaskExecutor для весны. Как это. Возьмите фрагмент кода отсюда. Подход позволяет контролировать количество потоков одновременно.

ThreadPoolTaskExecutor taskExecutor = (ThreadPoolTaskExecutor) context.getBean("taskExecutor");

PrintTask2 printTask1 = (PrintTask2) context.getBean("printTask2");
printTask1.setName("Thread 1");
taskExecutor.execute(printTask1);

О вашем втором вопросе. Короткий ответ - да

  • 0
    Интересный ответ. Я могу создать bean-компонент с помощью ThreadPoolTaskExecutor, это не проблема, но у меня нет класса, который реализует runnable, я просто хочу выполнять определенные части кода в потоках, и ничего более. Тот, который я отправил, например. Кроме того, не могли бы вы сказать мне, почему поток не работает на производстве?
  • 0
    Все, что вам нужно, это вызвать код в методе Runnable.run (). Вы фактически делаете это в своей лямбда-функции.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню