为Java HttpServer类传递数据到/从java HttpHandler类传递数据的正确方法

时间:2012-07-25 17:56:20

标签: java multithreading messaging httphandler httpserver

我有一个用于测试应用程序的java HttpHandler。在HttpHandler中,每个http请求都在一个单独的线程中处理,并传递给HttpExchange。但是我需要从主线程和类(设置HttpServer和HttpHandler的那个)访问数据,以便HttpHandler可以为正在运行的当前测试发回正确的响应。如何通过HttpHandler类传递或访问此数据的最佳方法是什么?我无法在HttpHandler#handle中添加另一个参数,因为它是由HttpHandler&由HttpServer使用,我无法在主类中访问任何静态方法。我还需要将来自HttpHandler的消息推送回主类以进行记录。

由于

我的代码示例:

class RequestHandler implements HttpHandler {

    @Override
    public void handle(HttpExchange exchange)
     {
        // do a bunch of stuff with the request that come in.
    }
}


public class MainClass
{
    public static void main(String[] args)
    {
        HttpServer server;
        ExecutorService excutor;
        InetSocketAddress addr = new InetSocketAddress(ipAdd, ipPort);
        server = HttpServer.create(addr, 0);
        server.createContext("/", new RequestHandler());
        excutor = Executors.newCachedThreadPool();
        server.setExecutor(excutor);
        server.start();
       // do a bunch of stuff that uses the server
    }

1 个答案:

答案 0 :(得分:2)

根据评论,您说自己正在构建处理程序。将对象注入处理程序的典型方法就是将它们作为参数传递给构造函数。

例如:

public class RequestHandler implements HttpHandler {

    private final Object someObject;

    public RequestHandler(Object someObject) {
        // there is an implied super() here
        this.someObject = someObject;
    }

    public void handle(HttpExchange exchange) throws IOException {
       ...
       // you can then use someObject here
       ...
    }
}

然后你可以将对象传递给你的处理程序,如:

server.createContext("/", new RequestHandler(someObject));

就在处理程序之间传递的信息而言,您应该能够使用HttpExchange.setAttribute(...)方法来执行此操作。这是一种典型的方式。我建议使用以"_"开头的属性名称来区分它们与HTTP属性。