怎样在response.getWriter() 执行完,结果就及时返回

[code="java"]
@RequestMapping("xxx.do")
public void test(HttpServletResponse response, String pcid) {
this.sendDirectToClient(response, CONTENTTYPE_JSON, CHARSET_UTF8, json.toString());
//结果集先返回、短信后置发送
sMSService.sendSmsTask(data);
}
[/code]

怎样让this.sendDirectToClient这句执行完,前台ajax 就收到后台返回的结果,sendDirectToClient方法如下
[code="java"]
PrintWriter writer = response.getWriter();
writer.write(s);
writer.flush();
[/code]

但调试时,总是等到test方法执行完,前台才返回结果,
想要的是 sendDirectToClient 执行完结果就返回, 后台接着执行
sMSService.sendSmsTask

7个回答

如果访问量不是特别的大,可以另外起一个线程来sMSService.sendSmsTask;

@RequestMapping("xxx.do")

public void test(HttpServletResponse response, String pcid) {

this.sendDirectToClient(response, CONTENTTYPE_JSON, CHARSET_UTF8, json.toString());

Thread t = new Thread(new Runnable() {

    @Override
    public void run() {
        sMSService.sendSmsTask(data);  
    }
});

t.start();
}  

如果访问量不是特别的大,可以另外起一个线程来sMSService.sendSmsTask;

@RequestMapping("xxx.do")

public void test(HttpServletResponse response, String pcid) {

this.sendDirectToClient(response, CONTENTTYPE_JSON, CHARSET_UTF8, json.toString());

Thread t = new Thread(new Runnable() {

    @Override
    public void run() {
        sMSService.sendSmsTask(data);  
    }
});

t.start();
}  

其实你调试一下就会发现是先执行玩的sendDirectToClient方法,此时结果已返回至前台,然后再执行sendSmsTask方法,只不过时间间隔比较短看不出来
你在sMSService.sendSmsTask(data);这里打个断点调试一下看看

可以考虑使用spring的异步任务 即在sendSmsTask 上加 @Async xml配置参考
[flash=200,200]https://github.com/zhangkaitao/es/blob/master/web/src/main/resources/spring-config-task.xml[/flash]

jinnianshilongnian
jinnianshilongnian 可以使用线程池 自己实现下
接近 7 年之前 回复
ailongni
ailongni 用的Spring不是3以上,无法使用@Async
接近 7 年之前 回复

servlet3支持异步处理,可以考虑使用

加一个线程,用于异步处理。
//结果集先返回、短信后置发送

sMSService.sendSmsTask(data);
这里可以加到线程队列里。由线程一个一个执行,不影响servlet

前台调用完。ajax再次调用不行吗?
一个请求本来就是很单一的事件了。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问