Использование Elasticsearch с джетти - PullRequest
0 голосов
/ 24 апреля 2018

Я использую Elastic search, и он работает хорошо, но не тогда, когда я пытаюсь использовать его с веб-сервисом с молой и джерси.

Вот пример функции, которую я хочу использовать:

public boolean insertUser(RestHighLevelClient client, User user) throws IOException
    {
        java.util.Map<String, Object> jsonMap = new HashMap<String, Object>();
        jsonMap.put("username", user.username);
        jsonMap.put("password", user.password);
        jsonMap.put("mail", user.mail);
        jsonMap.put("friends", user.friends);
        jsonMap.put("maps", user.maps);
        System.out.println("insertUser");
        IndexRequest indexRequest = new IndexRequest("users", "doc",user.username)
                .source(jsonMap);

        try {
            IndexResponse indexResponse = client.index(indexRequest);
            System.out.println("insertUser 222");
            if (indexResponse.getResult() == DocWriteResponse.Result.CREATED) {
                System.out.println("user "+user.username+" créé");
            }
            else if (indexResponse.getResult() == DocWriteResponse.Result.UPDATED) {
                System.out.println("user "+user.username+" update dans insertUser (pas normal)");
            }
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

Эта функция хорошо работает, когда я пробую ее внутри тестового класса. Но если я запускаю свой сервер так:

Server server = new Server();

        // Add a connector
        ServerConnector connector = new ServerConnector(server);
        connector.setHost("0.0.0.0");
        connector.setPort(8081);
        connector.setIdleTimeout(30000);
        server.addConnector(connector);
        DAO.ClientConnection("0.0.0.0",8081);
        // Configure Jersey
        ResourceConfig rc = new ResourceConfig();
        rc.packages(true, "com.example.jetty_jersey.ws");
        rc.register(JacksonFeature.class);

        // Add a servlet handler for web services (/ws/*)
        ServletHolder servletHolder = new ServletHolder(new ServletContainer(rc));
        ServletContextHandler handlerWebServices = new ServletContextHandler(ServletContextHandler.SESSIONS);
        handlerWebServices.setContextPath("/ws");
        handlerWebServices.addServlet(servletHolder, "/*");

        // Add a handler for resources (/*)
        ResourceHandler handlerPortal = new ResourceHandler();
        handlerPortal.setResourceBase("src/main/webapp/temporary-work");
        handlerPortal.setDirectoriesListed(false);
        handlerPortal.setWelcomeFiles(new String[] { "homepage.html" });
        ContextHandler handlerPortalCtx = new ContextHandler();
        handlerPortalCtx.setContextPath("/");
        handlerPortalCtx.setHandler(handlerPortal);

        // Activate handlers
        ContextHandlerCollection contexts = new ContextHandlerCollection();
        contexts.setHandlers(new Handler[] { handlerWebServices, handlerPortalCtx });
        server.setHandler(contexts);

        // Start server
        server.start();

А когда я вхожу в форму, тогда звоню в этот веб-сервис:

@POST
    @Path("/signup")
    @Produces(MediaType.APPLICATION_JSON)
    // @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    public SimpleResponse signup(@Context HttpServletRequest httpRequest,
                                 @FormParam("username") String username,
                                 @FormParam("email") String email,
                                 @FormParam("password") String password,
                                 @FormParam("passwordConfirm") String passwordConfirm) {
        System.out.println("k");
        //if (httpRequest.getSession().getAttribute("user") != null) { //httpRequest.getUserPrincipal() == null) {
            try {
                if (password.equals(passwordConfirm)) {
                    User user = new User("jeanOknewmail@gmail.com", "abc");
                    user.username = "jeanok";
                    user.maps = new ArrayList<String>();
                    user.friends = new ArrayList<String>();
                    System.out.println(user);
                    System.out.println("avant insert");
                    DAO.getActionUser().createIndexUser();
                    //System.out.println(DAO.getActionUser().getOneUser(DAO.client, "joe"));
                    System.out.println("rdctfygbhunji,k");
                    DAO.getActionUser().insertUser(DAO.client, user);
                    System.out.println("après insert");
                    return new SimpleResponse(true);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        //}
        return new SimpleResponse(false);
    }

Я получаю много ошибок:

avax.servlet.ServletException: ElasticsearchStatusException[Unable to parse response body]; nested: ResponseException[method [PUT], host [http://0.0.0.0:8081], URI [/users/doc/jeanok?timeout=1m], status line [HTTP/1.1 404 Not Found]|];
...
Caused by: 
ElasticsearchStatusException[Unable to parse response body]; nested: ResponseException[method [PUT], host [http://0.0.0.0:8081], URI [/users/doc/jeanok?timeout=1m], status line [HTTP/1.1 404 Not Found]|];
    at org.elasticsearch.client.RestHighLevelClient.parseResponseException(RestHighLevelClient.java:598)
    at org.elasticsearch.client.RestHighLevelClient.performRequest(RestHighLevelClient.java:501)
    at org.elasticsearch.client.RestHighLevelClient.performRequestAndParseEntity(RestHighLevelClient.java:474)
    at org.elasticsearch.client.RestHighLevelClient.index(RestHighLevelClient.java:335)
    at DAO.UserDAO.insertUser(UserDAO.java:160)

Есть ли у вас идеи, почему поведение моей функции не одинаково при запуске моего сервера? И почему эта ошибка? Спасибо за вашу помощь

1 Ответ

0 голосов
/ 24 апреля 2018

Я не был связан с упругим поиском. Мой клиент был подключен не к тому порту. Теперь это работает

...