Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >嵌套web服务调用与龙卷风(异步?)

嵌套web服务调用与龙卷风(异步?)
EN

Stack Overflow用户
提问于 2013-01-29 07:10:16
回答 2查看 2.3K关注 0票数 4

我正在使用tor非典(和第三方tornadows模块)实现一个SOAP web服务。我服务中的一个操作需要调用另一个操作,所以我有了链:

  1. (通过SOAPUI)对操作A的外部请求
  2. 内部请求(通过请求模块)进入操作B
  3. B行动的内部反应
  4. A行动的外部反应

因为它都在一个服务中运行,所以它在某个地方被阻塞了。我不熟悉龙卷风的异步功能。

只有一个请求处理方法(post),因为所有内容都来自单个url,然后根据SOAPAction请求头值调用特定的操作(进行处理的方法)。我用@tornado.web.asynchronous修饰了post方法,最后调用了self.finish(),但是没有骰子。

龙卷风能处理这个场景吗?如果是的话,我如何实现它?

编辑(添加代码):

代码语言:javascript
运行
AI代码解释
复制
class SoapHandler(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    def post(self):
        """ Method post() to process of requests and responses SOAP messages """
        try:
            self._request = self._parseSoap(self.request.body)
            soapaction = self.request.headers['SOAPAction'].replace('"','')
            self.set_header('Content-Type','text/xml')
            for operations in dir(self):
                operation = getattr(self,operations)
                method = ''
                if callable(operation) and hasattr(operation,'_is_operation'):
                    num_methods = self._countOperations()
                    if hasattr(operation,'_operation') and soapaction.endswith(getattr(operation,'_operation')) and num_methods > 1:
                        method = getattr(operation,'_operation')
                        self._response = self._executeOperation(operation,method=method)
                        break
                    elif num_methods == 1:
                        self._response = self._executeOperation(operation,method='')
                        break
            soapmsg = self._response.getSoap().toprettyxml()
            self.write(soapmsg)
            self.finish()
        except Exception as detail:
            #traceback.print_exc(file=sys.stdout)
            wsdl_nameservice = self.request.uri.replace('/','').replace('?wsdl','').replace('?WSDL','')
            fault = soapfault('Error in web service : {fault}'.format(fault=detail), wsdl_nameservice)
            self.write(fault.getSoap().toxml())
            self.finish()

这是来自请求处理程序的post方法。它来自我使用的web服务模块(不是我的代码),但是我添加了异步装饰器和self.finish()。它所做的基本工作就是调用正确的操作(如请求的SOAPAction中所指示的)。

代码语言:javascript
运行
AI代码解释
复制
class CountryService(soaphandler.SoapHandler):
    @webservice(_params=GetCurrencyRequest, _returns=GetCurrencyResponse)
    def get_currency(self, input):
        result = db_query(input.country, 'currency')
        get_currency_response = GetCurrencyResponse()
        get_currency_response.currency = result
        headers = None
        return headers, get_currency_response

    @webservice(_params=GetTempRequest, _returns=GetTempResponse)
    def get_temp(self, input):
        get_temp_response = GetTempResponse()
        curr = self.make_curr_request(input.country)
        get_temp_response.temp = curr
        headers = None
        return headers, get_temp_response

    def make_curr_request(self, country):

        soap_request = """<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/' xmlns:coun='CountryService'>
   <soapenv:Header/>
   <soapenv:Body>
      <coun:GetCurrencyRequestget_currency>
         <country>{0}</country>
      </coun:GetCurrencyRequestget_currency>
   </soapenv:Body>
</soapenv:Envelope>""".format(country)

        headers = {'Content-Type': 'text/xml;charset=UTF-8', 'SOAPAction': '"http://localhost:8080/CountryService/get_currency"'}
        r = requests.post('http://localhost:8080/CountryService', data=soap_request, headers=headers)
        try:
            tree = etree.fromstring(r.content)
            currency = tree.xpath('//currency')
            message = currency[0].text
        except:
            message = "Failure"
        return message

这是web服务(get_currency & get_temp)的两个操作。所以SOAPUI点击get_temp,它向get_currency发出SOAP请求(通过make_curr_request和请求模块)。然后,结果应该被链式回发,并被发送回SOAPUI。

服务的实际操作是没有意义的(当询问温度时返回货币),但我只是想让功能正常工作,这就是我所拥有的操作。

EN

回答 2

Stack Overflow用户

发布于 2013-02-01 09:31:43

我不认为您的soap模块或请求是异步的。

我相信添加“异步装饰师”只是战斗的一半。现在,您没有在函数内部发出任何异步请求(每个请求都是阻塞的,这会将服务器绑定到方法完成为止)。

您可以通过使用tornados AsynHttpClient来切换。这几乎可以用作请求的准确替代。来自docoumentation示例:

代码语言:javascript
运行
AI代码解释
复制
class MainHandler(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    def get(self):
        http = tornado.httpclient.AsyncHTTPClient()
        http.fetch("http://friendfeed-api.com/v2/feed/bret",
                   callback=self.on_response)

    def on_response(self, response):
        if response.error: raise tornado.web.HTTPError(500)
        json = tornado.escape.json_decode(response.body)
        self.write("Fetched " + str(len(json["entries"])) + " entries "
                   "from the FriendFeed API")
        self.finish()

他们的方法是用异步来修饰的,他们正在发出asyn请求。这就是水流变得有点奇怪的地方。当您使用AsyncHttpClient时,它不会锁定事件循环(PLease我本周才开始使用龙卷风,如果我的所有术语都不正确的话,请放心)。这允许服务器自由地处理传入的请求。当您的异步请求完成后,将执行回调方法,在本例中是on_response

在这里,您可以很容易地用tornado客户机替换请求。然而,对于soap服务来说,事情可能要复杂得多。您可以围绕您的soap客户端进行本地the序列化,并使用tornado http客户端向其发出异步请求?

这将创建一些复杂的回调逻辑,可以使用 decorator进行修复。

票数 7
EN

Stack Overflow用户

发布于 2014-12-29 13:56:28

这个问题从昨天起就开始发行了。

请求:https://github.com/rancavil/tornado-webservices/pull/23

示例:这里是一个简单的webservice,它不接受参数并返回版本。注意你应该:

  • 方法声明:用@gen.coroutine装饰方法
  • 返回结果:使用raise gen.Return(data)

代码:

代码语言:javascript
运行
AI代码解释
复制
from tornado import gen
from tornadows.soaphandler import SoapHandler
...

class Example(SoapHandler):
    @gen.coroutine
    @webservice(_params=None, _returns=Version)
    def Version(self):
        _version = Version()
        # async stuff here, let's suppose you ask other rest service or resource for the version details.
        # ...
        # returns the result.
        raise gen.Return(_version)

干杯!

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

https://stackoverflow.com/questions/14586038

复制
相关文章
同步调用与异步调用
同步调用:提交完任务后,就在原地等待任务执行完毕,拿到运行结果/返回值后再执行下一步,同步调用下任务是串行执行。
全栈程序员站长
2022/09/08
1.2K0
Java方法的嵌套与递归调用
方法嵌套的概念其实比较好理解,就是在调用方法的过程中又遇到了方法的调用,在刚开始接触的时候虽然在逻辑上能够理解为什么运行结果是这样的,但是对于代码执行的过程还是感觉有些绕。
一头小山猪
2020/04/08
2.6K0
Java方法的嵌套与递归调用
函数(五)(函数的嵌套与递归调用)
C语言的函数定义是互相平行和独立的,但函数的调用是可以嵌套的,也就是说,在调用一个函数的过程中,又去调用另外一个函数。
pigeon
2022/04/11
1.6K0
函数(五)(函数的嵌套与递归调用)
Dubbo剖析-服务消费端异步调用
前面我们讲解的无论是正常调用还是泛化调用也好,都是进行同步调用的,也就是服务消费方发起一个远程调用后,调用线程要被阻塞挂起,直到服务提供方返回。本节来讲解下异步调用,异步调用是指服务消费方发起一个远程调用后,不等服务提供方返回结果,调用方法就返回了,也就是当前线程不会被阻塞,这就允许调用方同时调用多个远程方法。
加多
2018/09/06
5300
Dubbo剖析-服务消费端异步调用
C语言函数嵌套与递归调用-学习十八
本文最后更新于2022年02月12日,已超过16天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!
XG.孤梦
2022/03/01
1.7K0
C语言函数嵌套与递归调用-学习十八
异步调用
同步调用,即:程序按定义的顺序依次执行的过程,每一行代码执行过程必须等待上一行代码执行完毕后才执行。而异步调用指:程序在执行时,无需等待执行的返回值可继续执行后面的代码。回调。其主要是解决异步方法执行结果的处理方法,比如在希望异步调用结束时返回执行结果,这个时候就可以考虑使用回调机制。
全栈程序员站长
2022/09/07
1.7K0
java 异步调用方法_java异步调用方法有哪些?如何实现异步调用?
大家好,又见面了,我是你们的朋友全栈君。 你知道java异步调用方法都有哪些吗?下面的文章内容,就对这方面的问题做了一下整理,一起来看看java异步调用的方法吧! 1、利用Spring的异步方法去执行
全栈程序员站长
2022/09/14
4K0
6.4 嵌套和递归调用
C语言标准c89和c99中并不支持函数嵌套功能,它是GUN C的一个拓展,所以在gcc中是可以支持函数嵌套的
小林C语言
2019/08/19
6710
js 外部调用 嵌套函数
 在函外部直接调用函数的内部函数是不可以的 ,因为是向外查找的  所以不能直接内部函数
坚毅的小解同志的前端社区
2022/11/28
10.5K0
js 外部调用 嵌套函数
java 异步调用接口_Java接口异步调用[通俗易懂]
java接口调用从调用方式上可以分为3类:同步调用,异步调用,回调;同步调用基本不用说了,它是一种阻塞式的调用,就是A方法中直接调用方法B,从上往下依次执行。今天来说说异步调用。
全栈程序员站长
2022/09/08
5.7K0
服务框架多形式的服务调用:同步、异步、并用、泛化
同步服务调用是最常用的一种服务调用方式,它的工作原理和使用都非常简单,分布式服务框架默认都需要支持这种调用形式。
博文视点Broadview
2020/06/11
1.7K0
python基础之函数嵌套调用
  实际开发过程中,经常会遇到很多完全相同或者非常相似的操作,这时,可以将实现类似操作的代码封装为函数,然后在需要的地方调用该函数。这样不仅可以实现代码的复用,还可以使代码更有条理性,增加代码的可靠性。下面我们来介绍一下python的函数嵌套调用相关内容。
jiankang666
2022/12/05
5540
python基础之函数嵌套调用
SpringBoot异步请求和异步调用
可以先释放容器分配给请求的线程与相关资源,减轻系统负担,释放了容器所分配线程的请求,其响应将被延后,可以在耗时处理完成(例如长时间的运算)时再对客户端进行响应。
Ant丶
2022/03/01
2.2K0
thrift异步调用
关于异步,我找了很多资料,java方面的比较多,可c的少之又少,很多就是简单提一下,也么说怎么用,最后终于还是自己研究出来了
全栈程序员站长
2022/09/18
3.2K0
SpringBoot异步调用
除了异步请求,一般上我们用的比较多的应该是异步调用。通常在开发过程中,会遇到一个方法是和实际业务无关的,没有紧密性的。比如记录日志信息等业务。这个时候正常就是启一个新线程去做一些业务处理,让主线程异步的执行其他业务。
全栈程序员站长
2022/09/14
9640
SpringBoot异步调用
dubbo 异步调用
下图为dubbo的官方RPC效果图,相信使用过dubbo开发的同学对这张原理图并不陌生;
全栈程序员站长
2022/09/15
7880
dubbo 异步调用
C 异步调用
摘要:Matt Powell 介绍了如何在服务器端使用异步 Web 方法,来创建高性能的 Microsoft ASP.NET Web 服务。 简介
全栈程序员站长
2022/09/18
1.4K0
Web Service 客户端,调用服务方法
只是最简单的调用web service 服务,至于要传什么参数全看到业务了。
微风-- 轻许--
2022/04/13
1.3K0
web3与ethers调用对比
webkubor: https://learnblockchain.cn/people/2871
Tiny熊
2022/04/08
9610
同步调用和异步调用
对于同步与异步来说,好多人与我在初学的时候一样,肯定是一脸蒙x。不过没关系,慢慢来,我将我见到和理解的和大家分享一下,希望对大家有所帮助。
小闫同学啊
2019/07/18
1.5K0

相似问题

在龙卷风web服务器上定期调用异步函数?

14

使用异步调用调用Web服务与使用异步任务调用Web服务有什么区别

21

异步Web服务调用

12

异步Web服务调用

38

异步调用web服务

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文