当你想在web应用中使用线程的时候

我们到底能走多远系列(24)

先不扯淡,先推荐:

  如果你热爱英文技术原文的话,这个推荐的网站绝对让你会想抱一抱他: (也许你早就知道啦) 再一次感谢那些乐于分享和贡献的勇士们,虽然互联网上我们互不相识,却通过知识,我们建立了某种超越空间时光的特殊关系,想想,这真的很有趣。

扯淡:

  最近朋友在老家工作量一年,又跑来城市奋斗。可是纳闷的是我数来数去,当时留在城市的人数正在逐年的下降,可这货怎么还会来呢?

最近,想比较深入的学习事务,可是看了好多文章,却越看越糊涂,有想起去看别的东西,有点三心两意的感觉了。真心希望有人带一下,轻松一点,唉。神,赐我一个大牛吧!

现在的公司,虽然是国内的,工作管理上较为开放,很多事可以自己决定,有时候自己会准备好几个方案,和同事讨论一下,选个比较优的,再去写代码,到也不错。

主题:

  初入web的时候,我们总是会被教育,web应用无需关心线程的问题,学好基本的框架,就可以上手啦。

  其实实际项目中使用多线程的情况是很正常的,在业务复杂的应用程序中,比如如果一个业务非常耗时,我们只好采用异步的方式,避免影响web端的展示,再有定时监控数据库字段的变化的业务,或者是batch处理(半夜处理数据库…..)也就是定时任务啦等等。

我就把最近遇到的问题展现给各位,希望大家能给点好的意见,我都会尝试使用,并应用到项目中去。

1,发邮件问题

  项目中,注册完毕后,需要向用户的邮箱发送邮件,开始的代码就是把发邮件的逻辑封装在service层,然后action层调用完毕后,返回页面,展现页面。实际测试还没有发现页面跳转太慢的情况,但是为了安全起见,还有一个原则就是我们不要把一些会抛诸runtimeException的逻辑放在和展现页面的逻辑一起,异步是唯一的选择。

多线程的实现是利用spring的框架:

线程池bean配置:

直接把mailTaskExecutor注入进service层,就可以使用啦!

一下是发送邮件的简单代码:

public boolean sendMail4D(String email,String basePath, String cstmName,String userName,String passWord) {final MailSenderInfo mailInfo = getMailInfo(email);final Map model = new HashMap();model.put(“basePath”, basePath);model.put(“cstmName”, cstmName);model.put(“username”, userName);model.put(“password”, passWord);model.put(“dealerLogin”, dealerLogin);model.put(“customerTel”, customerTel);model.put(“cusEmailAddress”, cusEmailAddress);mailTaskExecutor.execute(new Runnable(){public void run(){String result;try {result = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine,”dealer-reg-send-mail.vm”, model);mailInfo.setContent(result);SimpleMailSender sms = new SimpleMailSender();sms.sendHtmlMail(mailInfo);// 发送文体格式} catch (Exception e) {log.error(“send mail failed,there has a Exception”);log.error(e.toString());e.printStackTrace();}}});return true;}

  这样以来,在action层调用这个方法后就不用等待,邮件发送完毕后的返回了,唯一的坏处是,我们不知道邮件是否发送成功,这可能需要更多其他的代码来弥补了。

2,数据库字段监控问题

问题描述:

比如我们进行一个发布评论的操作,发布这个过程是通过webservice来调用另一个系统来实现的,在调用前我们把这个数据的字段置为发布中,对方回调成功后就置为发布成功,失败就是发布失败,但是有一种情况那就是对方出现异常,回调没来调,这样会导致这条数据一直为发布中… 这样的数据就需要我这边来判断,然后把它置为发布失败!

开始的想法:

每次调用对方的发布接口时,都启用一个线程,这个线程每隔一分钟检查数据库中这条数据的标志位,检查三次,如果始终是发布中,就把它置为发布失败。

ok,开始去实现了,想到前面提到的spring框架提供的线程池,也不是很难了吧。

一下是线程的代码示例:(spring的线程配置与前面差不多)

import org.apache.log4j.Logger;import com.syezon.webapp.constant.BusinessConstants;import com.syezon.webapp.dao.ReleaseDao;import com.syezon.webapp.model.Release;public class CheckAdvStatusThread extends Thread{public static Logger log = Logger.getLogger(CheckAdvStatusThread.class);private ReleaseDao releaseDao;private Long releaseId;public CheckAdvStatusThread(Long releaseId, ReleaseDao releaseDao){this.releaseId = releaseId;this.releaseDao = releaseDao;}public void setReleaseDao(ReleaseDao releaseDao) {this.releaseDao = releaseDao;}public void run() {int i = 0;for ( ; i < 3; i++) {try {// 半分钟Thread.sleep(30000);Release release = releaseDao.getById(releaseId);if(release.getStatus() == BusinessConstants.RELEASE_STATUS_PUBING){continue;}else{break;}} catch (InterruptedException e) {log.error(“there has a InterruptedException”);e.printStackTrace();}}(i == 3){releaseDao.setStatus(releaseId, BusinessConstants.RELEASE_STATUS_PUB_FAIL);}}}

与其在那里苦苦挣扎,碍于面子硬撑,倒不如微笑着面对,

当你想在web应用中使用线程的时候

相关文章:

  • 【算法】直接插入排序C语言实现
  • 嵌入式 FAAC1.28 在海思HI3518C/HI3518A平台linux中的编译优化
  • Android 动画animation 深入分析
  • Mybatis极其(最)简(好)单(用)的一个分页插件
  • Ext JS Kitchen Sink [Learning by doing](2)ArrayGrid
  • API开发第三篇:PHP的设计模式之完美的单例模式
  • 你感兴趣的文章:

    标签云:

    亚洲高清电影在线, 免费高清电影, 八戒影院夜间, 八戒电影最新大片, 出轨在线电影, 午夜电影院, 在线影院a1166, 在线电影院, 在线观看美剧下载, 日本爱情电影, 日韩高清电影在线, 电影天堂网, 直播盒子app, 聚合直播, 高清美剧, 高清美剧在线观看 EhViewer-E站, E站, E站绿色版, qqmulu.com, qq目录网, qq网站目录,