【问题标题】:Spring MVC : Threads not executing in productionSpring MVC:线程未在生产中执行
【发布时间】:2015-05-11 16:16:29
【问题描述】:
  • 我正在开发一个我想在其中使用的 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"
/>

任何帮助都会很好。非常感谢。

【问题讨论】:

    标签: java multithreading spring spring-mvc tomcat


    【解决方案1】:

    最好为spring定义ThreadPoolTask​​Executor。像这样。从here 获取代码 sn-p。该方法允许控制同时工作的线程数量。

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

    关于你的第二个问题。简短的回答是 - 是的

    【讨论】:

    • 有趣的答案。我可以用这个 ThreadPoolTask​​Executor 创建 bean,这没问题,但我没有实现可运行的类,我只想在线程中执行代码的特定部分,仅此而已。比如我发的那个。另外,你能告诉我为什么线程不能在生产中工作吗?
    • 您只需要在 Runnable.run() 方法中调用您的代码即可。实际上,您可以在 lambda 函数中执行此操作。
    • 当我使用 Runnable.run() 时,我无法调用类似 this.waitingMembersService 的接口...我只能使用 waitingMemberService。你能告诉我一个例子,我可以如何执行我在 TaskExecutor 中发布的代码 sn-p 吗?
    • 为什么无法调用this.waitingMembersService这样的接口
    • 我无法解析 waitingMemberService。检查图像:postimg.org/image/yjyem5e2h。你能给我 Lambda 的 TaskExecutor 的代码吗?
    猜你喜欢
    • 1970-01-01
    • 2013-05-13
    • 1970-01-01
    • 2012-10-27
    • 2019-12-04
    • 2016-05-28
    • 2012-12-16
    • 2019-12-29
    • 1970-01-01
    相关资源
    最近更新 更多