我想编写一个侦听Web服务端点的应用程序:
hostname:port
并截获该端口发出的任何响应。 (我稍后会将这些回复转化为事件并将其传递给esper以获得CEP。)最简单的方法是什么? (在Java中)
P.S。没有加密/安全/会话。只是一个暴露的端点,每当请求进入时都会吐出http / xml。
编辑:我没有部署Web服务,我正在编写一个客户端,它将监听并拦截其他客户端请求的所有和来自Web服务的http响应。我需要一个听众......
Edit2 / @Rami:我可以将其构建为我的ws堆栈中的过滤器,但是假设我有100x这样的web服务,我的目标,如上所述,是将数据路由到偶数处理器。我无法在每一个中构建一个过滤器,而其他人可能由供应商拥有,重点是,我有权使用我想听的网络服务,我只想监视最初未构建/设计的场景的响应在原始部署中
答案 0 :(得分:1)
您的问题的解决方案是编写自己的代理并通过该应用程序重定向所有流量。
您可以编写一个接收请求的应用程序并将其转发给其他服务器(您的端点),获取响应并将其发送回请求它的客户端。如下所示:
ServerSocket server = new ServerSocket(port);
Socket client = server.accept();
// Read input from client here using InputStream
Socket endpoint = new Socket(addressToEndpoint, endpointPort);
// Forward request to endpoint here
// Get reponse
// Do whatever you need with the response here
// Write response back to client
// close everything
除此之外,我可以看到唯一可行的方法是使用一些本机库与网络适配器通信来嗅探它。据我所知,Java没有任何东西可以让你的应用程序成为中间人。
答案 1 :(得分:0)
至于你的问题,我不知道如何执行它,因为某个端口已经被另一个应用程序保留了。如果您有REST客户端,也许可以使用某种日志过滤器扩展它。
----------------原始答案------------------
我建议使用正确的JAX-RS Web服务框架,而不是简单的servlet。它将使您的工作更易于管理,并使其成为“适当的”REST Web服务。我通常选择的武器是JBoss RestEasy,但你可以选择你喜欢的任何其他武器,比如Apache CXF。
Here是一个关于从RestEasy开始的很好的教程,但我强烈建议您阅读有关REST Web服务的内容。
另外,请记住,Esper必须在Web服务运行时始终保持不变。如果只是将它放在具有资源方法的类中,它将不会存在于调用范围之外。您可以将Esper作为单例并放入ServletContext并像这样调用它。