0

この回答に基づいて、2 つの Web サービスを作成してデプロイすることができました。ただし、あるサービスが別のサービスを呼び出そうとすると、タイムアウトになるまでハングしていました。

私のコードは次のとおりです。

from wsgiref.simple_server import make_server
from spyne.application import Application
from spyne.protocol.soap import Soap11
from spyne.util.wsgi_wrapper import WsgiMounter
from suds.client import Client
from spyne.decorator import srpc
from spyne.service import ServiceBase
from spyne.model.primitive import Unicode

class Service_Caller(ServiceBase):
  @srpc(_returns=Unicode)
  def call_service():
    client = Client("http://localhost:8000/hello?wsdl")
    result = client.service.say_hello('world')
    return result

class HelloWorldService(ServiceBase):
  @srpc(Unicode, _returns=Unicode)
  def say_hello(name):
      return [u'Hello, %s' % name]

if __name__ == '__main__':
  app1 = Application([Service_Caller], 'example1',
        in_protocol=Soap11(), out_protocol=Soap11())
  app2 = Application([HelloWorldService], 'example2',
        in_protocol=Soap11(), out_protocol=Soap11())
  wsgi_app = WsgiMounter({"caller":app1, "hello":app2})
  server = make_server('0.0.0.0', 8000, wsgi_app)
  server.serve_forever()

サービスは次を使用して呼び出されます。

from suds.client import Client
client = Client('http://localhost:8000/caller?wsdl')
client.service.call_service()

現時点では、私のコードが機能する唯一の方法は、2 つのサービスを異なるドメインまたは異なるポートにデプロイすることです。誰かが同じ問題を抱えていて、回避策を知っているのだろうか。ありがとう。

4

1 に答える 1

1

これは、使用している WSGI 実装が原因です( wsgiref)。wsgirefは参照用の Wsgi 実装であり、同時実行性はサポートされていません。本番環境で使用する場合は、mod_wsgi、CherryPy、twisted などの適切な wsgi コンテナーに切り替えて、決して使用しないでwsgirefください。

繰り返しますが、これを十分に強調することはできません。本番環境で使用しないでください。wsgiref

そうは言っても、あるサービスを別のサービスから呼び出したいだけなら、もっと良い方法があります。

from spyne.util.appreg import get_application

app = get_application('example2', 'Application').null
print app.service.say_hello('world')

完全に機能する例を次に示します。

from spyne.application import Application
from spyne.protocol.soap import Soap11
from spyne.util.wsgi_wrapper import WsgiMounter
from spyne.decorator import srpc
from spyne.service import ServiceBase
from spyne.model.primitive import Unicode
from spyne.util.appreg import get_application

class Service_Caller(ServiceBase):
  @srpc(_returns=Unicode)
  def call_service():
    # 'Application' is the default when you omit the `name` argument to the
    # `Application` initializer.
    app1 = get_application('example2', 'Application').null
    result = '\n'.join(app1.service.say_hello('world'))

    return result

class HelloWorldService(ServiceBase):
  @srpc(Unicode, _returns=Unicode)
  def say_hello(name):
      return [u'Hello, %s' % name]

if __name__ == '__main__':
  import logging
  logging.basicConfig(level=logging.DEBUG)
  app1 = Application([Service_Caller], 'example1',
        in_protocol=Soap11(), out_protocol=Soap11())
  app2 = Application([HelloWorldService], 'example2',
        in_protocol=Soap11(), out_protocol=Soap11())
  wsgi_app = WsgiMounter({"caller":app1, "hello":app2})

  from wsgiref.simple_server import make_server
  server = make_server('0.0.0.0', 8000, wsgi_app)
  server.serve_forever()

それが役立つことを願っています。

于 2013-12-01T22:20:13.370 に答える