首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring :生产中不执行的线程

Spring :生产中不执行的线程
EN

Stack Overflow用户
提问于 2015-03-10 09:29:53
回答 1查看 169关注 0票数 1
  • 我正在开发一个Spring应用程序,在这个应用程序中我想使用线程,这样我就可以更快地处理数据库事务、电子邮件发送、火灾和遗忘查询。不幸的是,他们没有在生产服务器上工作。我放了一个system.out,它没有进入线程本身。我有thread.start()。
    • 对于应用服务器,我使用apache-tomcat。我将张贴server.xml和一个我使用线程的地方。
    • 还有一个问题。当我想启动线程时,我将发出thread.start()。当线程中的任务完成时,该线程是否会自动死掉并清除该线程占用的内存?

GroupMemberServiceImpl:

代码语言:javascript
复制
 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:

代码语言:javascript
复制
 <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"
/>

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

EN

回答 1

Stack Overflow用户

发布于 2015-03-10 09:46:29

最好为春季定义ThreadPoolTaskExecutor。就像这样。从这里获取代码片段。该方法允许同时控制线程的数量。

代码语言:javascript
复制
ThreadPoolTaskExecutor taskExecutor = (ThreadPoolTaskExecutor) context.getBean("taskExecutor");

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28960114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档