首页 新闻 会员 周边 捐助

http请求响应问题

0
悬赏园豆:50 [已解决问题] 解决于 2019-03-14 17:07

现在出现了一个情况,别人发送http请求,我程序接收到http请求之后执行相对应的业务代码,最后传回响应信息。但是中间执行相对应的业务代码会占用较长时间,能不能先发送响应,然后我程序再执行业务代码。
总结如下:请问传回响应必须要程序结束的时候吗?可以在一开始就传回响应,但是我程序还能接着执行业务代码吗?

隐语者的主页 隐语者 | 初学一级 | 园豆:5
提问于:2019-03-14 16:31
< >
分享
最佳答案
0

可以,就是调用者只能假设执行成功了,失败了也得不到反馈。可以把业务代码在子线程里执行,或者干脆放到一个队列,有另一个线程或程序读取这个队列并执行

收获园豆:50
会长 | 专家六级 |园豆:12463 | 2019-03-14 16:41

您好,我想要做到的是,我收到别人发送的请求,先进行简单的检查,检查通过之后就发送响应回去,别人能够很快收到这个响应结果,但是我程序会接着处理相对应的业务代码。
原因:不想因为过长执行业务代码的时间,拖慢请求响应的总时间。

隐语者 | 园豆:5 (初学一级) | 2019-03-14 16:43

@隐语者: 可以把业务代码在子线程里执行,或者干脆放到一个队列,有另一个线程或程序读取这个队列并执行

会长 | 园豆:12463 (专家六级) | 2019-03-14 16:44

@隐语者: 或者换一个思路,你还是这样处理,但是调用者异步调用,这样调用者不会卡顿,而且能得到反馈

会长 | 园豆:12463 (专家六级) | 2019-03-14 16:50

@会长: @RequestMapping(value = "create", method = RequestMethod.POST)
@ResponseBody
public void addList(HttpServletRequest request, HttpServletResponse response){
//《业务代码...》
//发回响应
response.getWriter().write("success");
}
必须要等addList()这个方法执行完才能发送响应给对方吗?

隐语者 | 园豆:5 (初学一级) | 2019-03-14 16:51

@隐语者: 是啊,但是你这个方法可以很快返回,具体的处理放在子线程里。

会长 | 园豆:12463 (专家六级) | 2019-03-14 16:54

@会长: 额,addList()这是个主线程,在这个主线程下面添加个子线程,在怎么异步都要等子线程结束完,主线程才会结束吧?能够主线程数据了,子线程还能执行吗?

隐语者 | 园豆:5 (初学一级) | 2019-03-14 16:58

@会长: 额,addList()这是个主线程,在这个主线程下面添加个子线程,在怎么异步都要等子线程结束完,主线程才会结束吧?能够主线程结束了,子线程还能执行吗?

隐语者 | 园豆:5 (初学一级) | 2019-03-14 16:59

@隐语者: 试试

会长 | 园豆:12463 (专家六级) | 2019-03-14 17:04

@会长: @RequestMapping(value = "create", method = RequestMethod.POST, consumes = "application/xml", produces = "application/xml;charset=UTF-8")
@ResponseBody
public void addList(HttpServletRequest request, HttpServletResponse response, @RequestBody RequestInbound b)
throws Exception {
String aaaa="sdf";
new Thread(new Runnable() {

        @Override
        public void run() {
            try {
                System.err.println("The thread is running.....");
                Thread.sleep(15000);
                System.err.println("The thread was ended.....");
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }
    }).start();
    response.getWriter().write("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");
    return;
    
}

可以了,先响应了,但是程序还要执行15秒,我知道怎么做了,谢谢。

隐语者 | 园豆:5 (初学一级) | 2019-03-14 17:06

@隐语者: 赞!给我分点园豆

会长 | 园豆:12463 (专家六级) | 2019-03-14 17:06
其他回答(3)
0

当然可以,只是这时候的响应表示,我知道了,在做。至于做的结果,不知道。

爱编程的大叔 | 园豆:30844 (高人七级) | 2019-03-14 16:34

您好,能具体讲讲怎么操作吗?
以下为简单的例子。
@RequestMapping(value = "create", method = RequestMethod.POST, consumes = "application/xml", produces = "application/xml;charset=UTF-8")
@ResponseBody
public void addList(HttpServletRequest request, HttpServletResponse response){
//《业务代码...》
//发回响应
response.getWriter().write("success");
}

支持(0) 反对(0) 隐语者 | 园豆:5 (初学一级) | 2019-03-14 16:37

我想要做到的是,我收到别人发送的请求,先进行简单的检查,检查通过之后就发送响应回去,别人能够很快收到这个响应结果,但是我程序会接着处理相对应的业务代码。

支持(0) 反对(0) 隐语者 | 园豆:5 (初学一级) | 2019-03-14 16:41
0

RabbitMQ 消息队列,将参数逻辑作为消息体发送到消息队列中,然后让Listener去处理业务逻辑;

Rekent | 园豆:91 (初学一级) | 2019-03-26 11:10

通过一个MessageProducer将参数发送到 Message QUEUE 队列中,然后同时配置一个Listener去监听这个 QUEUE队列 , Listener获取到参数后进行业务代码处理。在接口的实现方法就是(1)校验参数;(2)将参数打包发送到消息队列;(3)返回信息给调用者。Listener会自动在后台接收到消息后处理业务逻辑,如果要现成的产品,那就参考一下RabbitMQ:http://www.rabbitmq.com/,这个可以直接引入Spring中,然后做一些相关配置即可用

支持(1) 反对(0) Rekent | 园豆:91 (初学一级) | 2019-03-26 11:14
0

你这问题有点矛盾啊业务代码都没执行完,返回的状态码应该是什么

Jachs | 园豆:264 (菜鸟二级) | 2019-07-04 10:40
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册