- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个系统(带有 Spring Framework 的 Java),它使用 TServlet 类通过 HTTP 公开 7 个不同的 Apache Thrift servlet。目前,它们都需要自己的 Servlet、ServletMappings、处理器、处理程序等。因此实现客户端还必须保留不同服务的所有各种 URL 的内部列表。
我知道 Apache Thrift 在使用 TServer
及其派生产品时通过使用 TMultiplexingProcessor
支持多路复用,但是由于我使用 Spring 并且我的 Servlet、Handler 和 Processor 都是 Spring Bean 相互自动连接,我不确定如何继续。
以下是其中一项服务如何连接的示例:
UserServiceHandler.java
@Component
public class UserServiceHandler implements UserService.Iface {
@Override
public User getUser(String userId) throws TException {
// implementation logic goes here
}
}
UserServiceProcessor.java
@Component
public class UserServiceProcessor extends UserService.Processor<UserServiceHandler> {
private UserServiceHandler handler;
@Autowired
public UserServiceProcessor(UserServiceHandler iface) {
super(iface);
handler = iface;
}
public UserServiceHandler getHandler() {
return handler;
}
public void setHandler(UserServiceHandler handler) {
this.handler = handler;
}
}
UserServiceServlet.java
@Component
public class UserServiceServlet extends TServlet {
private UserServiceProcessor processor;
@Autowired
public UserServiceServlet(UserServiceProcessor p) {
super(p, new TBinaryProtocol.Factory());
processor = p;
}
}
Servlet 注册
ServletRegistration.Dynamic userService = servletContext.addServlet("UserServiceServlet", (UserServiceServlet) ctx.getBean("userServiceServlet"));
userService.setLoadOnStartup(1);
userService.addMapping("/api/UserService/*");
// This same block repeated 7 times for each *ServiceServlet with different mappings
我希望将所有 7 个服务处理程序映射到一个 URL,例如 /api/*
。这可能吗?我想我必须创建一个 servlet 和处理器,但我不确定它们应该是什么样子。我的处理器扩展了 UserService.Processor 等。
最佳答案
好的,明白了。可能不是最好的方法,欢迎批评指正。
这是我的粗略步骤:
TMultiplexedProcessor
的新类TServlet
的新类UserServiceProcessor
)都有一个handler
属性和相应的getter和setter这是我的ApiMultiplexingProcessor
:
@Component
public class ApiMultiplexingProcessor extends TMultiplexedProcessor {
UserServiceHandler userServiceHandler;
ReportServiceHandler reportServiceHandler;
// ... more service handlers can go here
@Autowired
public ApiMultiplexingProcessor(UserServiceProcessor userServiceProcessor, ReportServiceProcessor reportServiceProcessor) {
this.registerProcessor("UserService", userServiceProcessor);
this.registerProcessor("ReportService", reportServiceProcessor);
// add more registerProcessor lines here for additional services
userServiceHandler = userServiceProcessor.getHandler();
reportServiceHandler = reportServiceProcessor.getHandler();
// set any additional service handlers here
}
// getters and setters for the handlers
public UserServiceHandler getUserServiceHandler() {
return userServiceHandler;
}
public void setUserServiceHandler(UserServiceHandler userServiceHandler) {
this.userServiceHandler = userServiceHandler;
}
public ReportServiceHandler getReportServiceHandler() {
return reportServiceHandler;
}
public void setReportServiceHandler(ReportServiceHandler reportServiceHandler) {
this.reportServiceHandler = reportServiceHandler;
}
}
因此,稍微解释一下上面的内容,如果添加任何其他服务,则需要将 *ServiceHandler 类添加为此类上的字段,并创建 getter 和 setter 等。
现在我们已经有了它,我们可以创建一个新的单个 servlet,并将其添加到 servlet 上下文中。
这是我的ApiServlet
:
@Component
public class ApiServlet extends TServlet {
private ApiMultiplexingProcessor processor;
@Autowired
public ApiServlet(ApiMultiplexingProcessor p) {
super(p, new TBinaryProtocol.Factory());
processor = p;
}
}
然后您只需像以前一样将此 servlet 添加到 servlet 上下文(来自 bean)即可:
ServletRegistration.Dynamic api = servletContext.addServlet("ApiServlet", (ApiServlet) ctx.getBean("apiServlet"));
api.setLoadOnStartup(1);
api.addMapping("/api/*");
// yay now we have a single URL and a single servlet
这一切可能对其处于我这种情况的其他人有帮助,所以享受吧!
附注确保在调整客户端时使用 TMultiplexedProtocol
,以便在与服务器通信时可以传递服务名称,例如
TTransport transport = new THttpClient(new Uri("https://myapp.com/api/"));
TProtocol protocol = new TBinaryProtocol(transport);
TMultiplexedProtocol mp = new TMultiplexedProtocol(protocol, "UserService");
UserService.Client userServiceClient = new UserService.Client(mp);
关于java - 使用 Apache Thrift 和 TServlet 执行服务多路复用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24063686/
我正在使用 Ubuntu 10.04 LTS 机器,我在该机器上克隆了 Thrift 的 git 存储库并从源代码本地构建它。但是最新版本的 API 有一些变化,这导致应用程序的构建过程失败。 由于仅
尽管 Thrift 格式使用相对广泛(并且项目仍然存在),但我无法找到底层数据格式的规范。或格式,因为显然至少有两种格式;标准之一,紧凑的格式。 鉴于它的广泛使用,我希望它只是我可怜的 google-
每个参数(字段标识符)之前的数字的用途是什么?为什么从 5 跳到 16? struct Tweet { 1: required i32 userId; 2: required stri
我已经在 mac 中安装了 thrift。 从终端看起来 thrift 已成功安装但是当我尝试运行 thrift 命令时,我得到以下信息 Thrift: command not found 我从终端使
我在 c++ 中有一个结构,它存储这样的字节: struct RemoteData { /// some other fields here unsigned char* buf;
我想在 IDL 文件中定义几个结构。然后在服务中返回该结构类型的对象。为此,我必须导入该结构。如何在 IDL 中导入它们。 namespace java abc.xyz struct struct_{
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我使用thrift编译器(0.9.3)生成gen-go文件夹,同时编译器生成一个函数thrift.PrependError,在thrift 包(git.apache.org/thrift.git/li
假设我在包含两个字段的 Apache Thrift IDL 文件中定义了一个结构。例如: struct Thing { 1: optional string name, 2: optional
是否有可能使用 Thrift 来表示诸如 Java 类型 Map 之类的东西,其中 Map 中的值是已知的,例如是字符串还是整数? 换句话说,是否有任何方法来表示实际基类型仅在运行时已知但保证是一组预
我需要使用 Ruby 实现 Thrift API。 在生产环境中运行服务器有哪些选项? 最好的选择是什么? 目前我只是实例化一个 SimpleServer 并在其上调用 #serve。这显然是一个蹩脚
我正在查看 thirft 代码生成器的文档。它是这样开始的: Usage: thrift [options] file Options: -version Print the compile
所有教程和文档都建议每个 Thrift 服务器可以提供一项服务(1 个处理程序 1 个处理器 1 个服务器,全部在构造函数等中给出)。 从我的观点(优雅的设计)来看,如果许多或所有服务定义可以独立会更
我正在寻找 C++ 异步客户端和非阻塞 C++ 服务器实现。我在 apache 中看到一些邮件文件,但该事件是 2009 年末的。想知道最新的 thrift 是否支持它。我正在对 C++ 代码使用 c
我一直在研究使用 Apache Thrift,但发现文档有些缺乏。现在我有兴趣看到支持的目标语言以及每种语言支持的协议(protocol),是否有这样的矩阵? 最佳答案 试试这个: Thrift La
使用 C++ Apache Thrift 库,是否可以仅使用序列化/反序列化而不使用 RPC 服务? 据我了解 this页面,可以使用 Java 库来完成。但是,我找不到 C++ 库的类似类。 最佳答
Thrift 解析器有一个“注解”的定义: https://git-wip-us.apache.org/repos/asf?p=thrift.git;a=blob;f=compiler/cpp/src
我的组织设置了一个 Spark Thrift 服务器,该服务器配置为使用 HTTP 上的 SSL。目的是使 Power BI 能够通过 Spark 安全地检索数据。然而,仅仅检索架构信息可能需要长达
我正在我的 Mac 上运行一对使用 Apache Thrift 进行通信的客户端和服务器程序。在我们的生产系统中,我们可能最终会遇到客户端使用TJSONProtocol,服务端使用TBinaryPro
来自 Thrift website 的示例 int multiply(1:int n1, 2:int n2); 为什么我们必须使用标签 1:和 2:在变量名之前,这个标签的目的是什么? 最佳答案 这些
我是一名优秀的程序员,十分优秀!