1

我公司目前正在研究 Thrift 和 ActiveMQ 的集成。我们想建立一个独立于语言的服务层,它运行在单个 http 服务器上,每个 thrift 服务都能够通过 ActiveMQ 与其他 thrift 服务进行通信。到目前为止,我一直无法找到任何其他试图实现这一点的人。我很好奇其他人如何实现这一点,以及是否有这样做的文档。

当前的原型使用一个简单的 python 服务器来托管各种 thrift 服务。在每个服务调用(即更新设置)中,都会创建一条 ActiveMQ 消息并将其发送到特定队列(即,一个应用程序的设置服务向另一个应用程序发送更新消息)。为设置服务的每个实现创建一个服务侦听器,该服务侦听器能够扫描适当的队列并检测何时发送相关消息。然后,此侦听器使用 Thrift 访问该特定应用程序的适当服务。

我试图找出一种方法来允许服务为 thrift 对象提供服务,但也可以在不需要创建这些侦听器的情况下接收 ActiveMQ 消息,但我一直无法为此找到任何资源。

谢谢!

4

1 回答 1

2

根据您的描述,您至少可以选择,恕我直言:

(1) 利用序列化部分,将序列化后的消息写入队列。侦听器将它们反序列化并将它们提供给(本地)处理器实例,该实例触发其余的处理。

(2) 为它编写一个专用的传输来支持ActiveMQ。它可能有助于更好地封装序列化/反序列化的东西,并为客户端/处理器提供通常的调用接口。

还有两个提示:

  • 看看THRIFT-812,它演示了与 ZeroMQ 的组合
  • 查看 Thrift 文档中的oneway方法。您会发现它们对于消息队列方案非常有用。

将传入数据输入本地处理器实例是什么意思?好的,这是我前段时间写的一段代码来证明这一点。它是用 Delphi 编写的,但应该足够简单以使您能够将其翻译成您选择的任何其他语言。在这种特殊情况下,请求数据以 JSON 形式传递和预期,因此是 JSON 协议。

class procedure TTextToolJsonServer.Process( const stmIn, stmOut : TStream);
var handler   : Samples.TTextTool.Iface;
    processor : IProcessor;
    protIn, protOut : IProtocol;
begin
  protIn  := TJSONProtocolImpl.Create(
               TStreamTransportImpl.Create(
                 TThriftStreamAdapterDelphi.Create( stmIn, FALSE), nil));

  protOut := TJSONProtocolImpl.Create(
               TStreamTransportImpl.Create(
                 nil, TThriftStreamAdapterDelphi.Create( stmOut, FALSE)));

  handler   := TTextToolHandler.Create;
  processor := Samples.TTextTool.TProcessorImpl.Create( handler);
  processor.Process( protIn, protOut);
end;
于 2013-10-23T21:19:32.233 回答