Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Запрос на другой сервер из EJB SessionBean / 16 сообщений из 16, страница 1 из 1
06.12.2013, 18:20:25
    #38492256
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на другой сервер из EJB SessionBean
Добрый день !
Как создать такой запрос :

Есть код который отлисно работает в Junit тесте - где создается запрос и получается ответ.

либа клиента commons-httpclient-3.1.jar

Как только я переношу этот код в SessionBean , который инджектится в сервлет.

И вызываю его - клиент httpclient "умирает" по TIMEOUT! ответа от сервера я получить не могу

Помогите понять в чем затык?

вызовы из SessionBean не проходят или что то еще ?


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
...
import org.apache.commons.httpclient.Credentials;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.StatusLine;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.methods.PostMethod;

@Stateless
public class MySessionBean {

   //  Регистрация инвойса 
    public Result registerRequest(RegisterRequest registeRequest) {

        Result result = null;
        try {

            OutputStream outputStream = new OutputStream() {
                private StringBuilder string = new StringBuilder();

                @Override
                public void write(int b) throws IOException {
                    this.string.append((char) b);
                }

                @Override
                public String toString() {
                    return this.string.toString();
                }
            };

            Utils.marshaller(registerRequest, outputStream);
            outputStream.close();


            HttpClient client = new HttpClient();
            client.getState().setCredentials(AuthScope.ANY, payment_credentials);

            PostMethod method = new PostMethod(fcgi_request);
            method.setRequestHeader("Content-Type", "text/html");
            method.setRequestBody(outputStream.toString());

            String out = null;

            int TIMEOUT_IN_MILLISECONDS = 3000;
            client.getParams().setSoTimeout(TIMEOUT_IN_MILLISECONDS);

            // TУТ ЗАТЫК!        
            client.executeMethod(method);

            int status = method.getStatusCode();
            StatusLine statusLine = method.getStatusLine();
            out = method.getResponseBodyAsString();

            result = new Result(status, statusLine, out);

            method.releaseConnection();
            method = null;
            client = null;

//        try {
//            InputStream is = new ByteArrayInputStream(result.getOut().getBytes(Charset.forName("UTF-8")));
//            RegisterIResult iResult = Utils.unmarshaller(RegisterResult.class, is);
//        } catch (Exception e) {
//        }




        } catch (Exception ex) {
               Logger.getLogger(InvoiceSessionBean.class.getName()).log(Level.SEVERE, null, ex);
        } finally {

            return result;
        }
    }

}



Utils.marshaller(registerRequest, outputStream); - перевод класса в XML
...
Рейтинг: 0 / 0
06.12.2013, 18:34:14
    #38492272
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на другой сервер из EJB SessionBean
OutputStream кривой с точки зрения Unicode.
Покажите stacktrace повисшего потока.

Это вообще гениальная комбинация.
Код: java
1.
2.
3.
finally {
            return result;
}



fcgi_request это вообще что и откуда?
...
Рейтинг: 0 / 0
06.12.2013, 18:47:26
    #38492286
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на другой сервер из EJB SessionBean
BlazkowiczOutputStream кривой с точки зрения Unicode.
Покажите stacktrace повисшего потока.

Это вообще гениальная комбинация.
Код: java
1.
2.
3.
finally {
            return result;
}


Да эпично вышло :)

fcgi_request это вообще что и откуда?

Старая версия клиента - такой метод уже не рекомендуется использовать - method.setRequestBody(outputStream.toString());

смысл OutputStream лишь в том чтобы превратить класс в xml представление и запихнуть его в строку.

Писалось на месте - если есть что предложить - буду рад.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    private static <T> Marshaller marshaller(T obj) throws JAXBException {
        JAXBContext context = JAXBContext.newInstance(obj.getClass());
        Marshaller m = context.createMarshaller();
        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
        return m;
    }

   public static <T> void marshaller(T obj, OutputStream os) throws JAXBException {
        marshaller(obj).marshal(obj, os);
    }




fcgi_request - внешний URI

public static final String fcgi_request = " http://test.it.office/fcgi/fcgi_request";
...
Рейтинг: 0 / 0
06.12.2013, 18:55:26
    #38492290
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на другой сервер из EJB SessionBean
Atum1,

Вот тут пример Request Streaming
http://hc.apache.org/httpclient-3.x/performance.html#Request_Response_entity_streaming
Чтобы не загонять XML целиком в память, а писать непосредственно маршаллером в запрос.
XML большой? Может серверу не хватает 3х секунд чтобы его распрарсить?
...
Рейтинг: 0 / 0
06.12.2013, 18:56:26
    #38492292
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на другой сервер из EJB SessionBean
Что говорят логи сервера, на который отправляется запрос?
...
Рейтинг: 0 / 0
06.12.2013, 19:13:06
    #38492305
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на другой сервер из EJB SessionBean
BlazkowiczЧто говорят логи сервера, на который отправляется запрос?

500 ошибка .

Обернул код httpclient клиента в простой класс - на писал тест - ему хватает и 1 секунды за глаза.

XML - маленький - 10 строк.

Не работает вызов именно из серлвета или SessionBean - и это очень странно , как будто контейнер не выпускает запросы (бред конечно)
...
Рейтинг: 0 / 0
06.12.2013, 19:20:35
    #38492308
WGA
WGA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на другой сервер из EJB SessionBean
Atum1,

еще можно включить протоколирование для commons-httpclient.
...
Рейтинг: 0 / 0
06.12.2013, 19:22:08
    #38492312
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на другой сервер из EJB SessionBean
BlazkowiczAtum1,

Вот тут пример Request Streaming
http://hc.apache.org/httpclient-3.x/performance.html#Request_Response_entity_streaming
Чтобы не загонять XML целиком в память, а писать непосредственно маршаллером в запрос.
XML большой? Может серверу не хватает 3х секунд чтобы его распрарсить?

тут для файла - у меня же схема другая (простая )- приходит "трансфер" от веб клиента - это набор полей
- он преобразуется в класс запроса - класс запроса маршалится в правильный xml -
тело xml вставляется а тело запроса клиента и перенаправляется на другой ресурс от которого я должен получить ответ .
...
Рейтинг: 0 / 0
06.12.2013, 19:28:57
    #38492324
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на другой сервер из EJB SessionBean
WGAAtum1,

еще можно включить протоколирование для commons-httpclient.

Да ,что то в Пятницу вечером - совсем плохо соображаю - логи показывают что ответ приходит в виде

401 Authorization Required

т.е. каким то образом не проходит авторизация ?! хотя в тесте все ок.
...
Рейтинг: 0 / 0
06.12.2013, 19:39:38
    #38492333
WGA
WGA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на другой сервер из EJB SessionBean
Atum1WGAAtum1,

еще можно включить протоколирование для commons-httpclient.

Да ,что то в Пятницу вечером - совсем плохо соображаю - логи показывают что ответ приходит в виде

401 Authorization Required

т.е. каким то образом не проходит авторизация ?! хотя в тесте все ок.Тут уж Вам виднее ) Вы же выдрали кусок кода и откуда берется payment_credentials отсюда не видно.
...
Рейтинг: 0 / 0
06.12.2013, 19:46:23
    #38492342
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на другой сервер из EJB SessionBean
WGAAtum1пропущено...


Да ,что то в Пятницу вечером - совсем плохо соображаю - логи показывают что ответ приходит в виде

401 Authorization Required

т.е. каким то образом не проходит авторизация ?! хотя в тесте все ок.Тут уж Вам виднее ) Вы же выдрали кусок кода и откуда берется payment_credentials отсюда не видно.

тут секретов нет:)
Код: java
1.
2.
3.
    private static final String invoice_login = "login";
    private static final String invoice_password = "password";
    private static final Credentials payment_credentials = new UsernamePasswordCredentials(invoice_login, invoice_password);



Кажется понял в чем ошибка - не все поля заполнены в xml :) а в тесте все :).
...
Рейтинг: 0 / 0
06.12.2013, 19:49:28
    #38492345
WGA
WGA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на другой сервер из EJB SessionBean
Atum1Кажется понял в чем ошибка - не все поля заполнены в xml :) а в тесте все :).Хороший у Вас сервер на той стороне - в логах пишет 500-ю, а отдает 401-ю. Чтобы враг не догадался...
...
Рейтинг: 0 / 0
06.12.2013, 19:53:23
    #38492349
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на другой сервер из EJB SessionBean
Atum1тут для файла - у меня же схема другая (простая )
Радикольно, другая схема. Прям разница - земля и небо.

Код: java
1.
2.
3.
4.
5.
public class MyJaxbRequestEntity implements RequestEntity {
   public void writeRequest(OutputStream out) throws IOException {
       Utils.marshaller(registerRequest, out);
   }
}
...
Рейтинг: 0 / 0
06.12.2013, 20:04:58
    #38492355
Sergunka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на другой сервер из EJB SessionBean
На будущее чтоб сильно не заморачиваться и иметь под рукой проверку - установите в chrome - https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo?utm_source=ha-en-na-us-webapp-Advanced Rest Client Application

Advanced REST client

после чего можете послать ваше сообщение вручную и посмотреть что прийдет. Вообще 500 ошибка довольна распростаненное явление когда клиент не авторизован.
...
Рейтинг: 0 / 0
06.12.2013, 20:11:55
    #38492360
WGA
WGA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на другой сервер из EJB SessionBean
SergunkaВообще 500 ошибка довольна распростаненное явление когда клиент не авторизован.Подумайте еще раз хорошенько. В ответ на HTTP-запрос возвращается один код возврата. Или 401, или 500, или... но никак не два.
...
Рейтинг: 0 / 0
06.12.2013, 21:19:00
    #38492412
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на другой сервер из EJB SessionBean
WGAAtum1Кажется понял в чем ошибка - не все поля заполнены в xml :) а в тесте все :).Хороший у Вас сервер на той стороне - в логах пишет 500-ю, а отдает 401-ю. Чтобы враг не догадался...

Не. Он 500 вернул когда клиент вылетает по таймауту.
401 когда ошибка в запросе.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Запрос на другой сервер из EJB SessionBean / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]