我有一个带有状态和非可序列化字段的对象,比如线程,我会调用它上面的函数,就像通过RMI但是通过http一样。我不想扩展,我在一个孤立的网络。我目前正在使用Jetty,就像这样:
public class ObjectHandler extends AbstractHandler {
MyStatefulObject obj;
public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
String action = request.getParameter("action");
switch (action) {
case "method1":
obj.method1(request.getParameter("some-parameter"));
break;
case "method2":
obj.method2(request.getParameter("some-other-parameter"));
break;
}
baseRequest.setHandled(true);
}
}
这有点奇怪。我想使用像Servlets这样的东西,并使用不同的方法来区分要执行的操作,或者使用JAX-RS来使用调用url来分辨要执行的操作。但是这两种方法都是无状态的,也就是说,我不能将一个对象传递给一个servlet,并且,至少在运动衫上,构造是用类来完成的,而不是它的实例,所以我无法控制构造MyStatefulObject
对象。那么,是否有一个库,比方说,注释一个对象并将其传递给服务器实例并开始收听请求?我想做这样的事情:
@Path("/")
public class MyStatefulObject {
MyStatefulObject(Parameter param1, Param) {
//some building stuff
}
@POST
@Path("/path1")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.APPLICATION_JSON + "; charset=UTF-8")
void method1(Parameter param) {}
@POST
@Path("/path2")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.APPLICATION_JSON + "; charset=UTF-8")
Object method2(Parameter param) {
return new Object();
}
}
在外面,我会:
Server server = new Server(8081);
server.setHandler(new MyStatefulObject(param));
server.start();
server.join();
是否有图书馆让我能够做到这一点?正如我之前所说,我不想扩展(这是在小型网络中运行)并且没有安全问题。我只是想“发布”一个对象。
答案 0 :(得分:0)
最后,Jersey确实允许发布有状态对象,使用带有对象的ResourceConfig类(而不是Class,这是我经常发现的用法)。 this question中有趣的原因他们想做的恰恰相反。我们只需在ResourceConfig中注册一个对象。
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import java.net.URI;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.glassfish.jersey.jetty.JettyHttpContainerFactory;
import org.glassfish.jersey.server.ResourceConfig;
import javax.inject.Singleton;
@Path("calculator")
public class Calculator {
int i = -1;
public Calculator(int i) {
this.i = i;
}
@GET
@Path("increment")
@Produces(MediaType.APPLICATION_JSON)
public String increment() {
i = i + 1;
return "" + i;
}
public static void main(String[] args) throws Exception {
ResourceConfig resourceConfig = new ResourceConfig();
resourceConfig.register(new Calculator(10));
Server server = JettyHttpContainerFactory.createServer(new URI("http://localhost:8080"), resourceConfig);
server.start();
}
}