Мыльный вызов медленнее на удаленном сервере - PullRequest
1 голос
/ 17 апреля 2019

У меня есть приложение на сервере Java, которое выполняет некоторые вызовы Soap к другому удаленному серверу.

Я поместил свое приложение на сервере Java на удаленный сервер с tomcat 8.5.И когда я делаю вызовы Soap, это удваивает время, в то время как это быстрее с моей локальной машины с tomcat 8.5 на Eclipse.

Знаете ли вы, почему?

Вот код для моегомыльный клиент:

public class SoapHelper {

public String server   = "";
public String username = "";
public String password = "";
public String session  = "";  // this is the session id returned by the server upon successful login
private SOAPConnection con = null;
private MessageFactory mf = null;

public String service = "";
public String method  = "";
public String request  = "";  // this is what we send to the server
public String response = "";  // this is what the server return to us

public SoapHelper(String server) {
  this.server = server;
}

private String getURI() {
  return "https://" + this.server + this.session;
}

private SOAPMessage makeMessage(String nodeName, String xmlStr) throws Exception {

  SOAPMessage message = this.mf.createMessage();
  SOAPEnvelope envelope = message.getSOAPPart().getEnvelope();

  envelope.addNamespaceDeclaration("xsi", "http://www.w3.org/1999/XMLSchema-instance");
  envelope.addNamespaceDeclaration("xsd", "http://www.w3.org/1999/XMLSchema");

  SOAPBody body = envelope.getBody();

  SOAPElement element = body.addChildElement(envelope.createName("ns1:" + this.method));
  element.addAttribute(envelope.createName("xmlns:ns1"), "urn:" + this.service);
  element.addAttribute(envelope.createName("ns1"), "http://schemas.xmlsoap.org/soap/encoding");

  SOAPElement ele2 = element.addChildElement(envelope.createName(nodeName));
  ele2.addAttribute(envelope.createName("xsi:type"), "xsd:string");
  ele2.addTextNode(xmlStr);

  message.saveChanges();

  return message;
}

private void doConnect()
{
  try {
    SOAPConnectionFactory conFactory = SOAPConnectionFactory.newInstance();
    this.con = conFactory.createConnection();
    this.mf = MessageFactory.newInstance();
  } catch(Exception e) {}
}

public boolean doRequest(String service, String method, String xml) 
{
this.service = service;
this.method  = method;
this.request = "";
this.request = xml;

try {
    URL endpoint = new URL(this.getURI());
    SOAPMessage message = this.makeMessage("msgstr", this.request);
    SOAPMessage retval = this.con.call(message, endpoint);
    //extraction du XML en String lisible du message SOAP
    this.response = extractXML(retval);
} catch (Exception e) {
    this.response = e.getMessage();
}
return true;
}

private String extractXML(SOAPMessage message) throws Exception {

    ByteArrayOutputStream out = new ByteArrayOutputStream();
    message.writeTo(out);
    String returnxml = new String(out.toByteArray());
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document document = db.parse(new InputSource(new StringReader(returnxml)));
    Element root = document.getDocumentElement();
    Node msg = root.getLastChild();

    return msg.getTextContent();
  }

private String getSession() throws Exception {

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document document = db.parse(new InputSource(new StringReader(this.response)));
    Element root = document.getDocumentElement();

    return root.getAttribute("sessionid");
}

public void authenticate(String username, String password){

this.username = username;
this.password = password;

 try {
   String xml="<Message messageid='0'><Entity name='REF_LOGIN'>";
   xml+="<Property name='login_cd' value='" + this.username + "' type='string'/>";
   xml+="<Property name='password' value='" + this.password + "' type='string'/>";
   xml+="<Property name='machine_name' value='" + getMachineName() + "' type='string'/>";
   xml+="</Entity></Message>";
   doConnect();
   doRequest("Login","Authenticate",xml);
   this.session = this.getSession();
 }catch(Exception e)
 {
   this.session = e.getMessage();
 }
}

1 Ответ

0 голосов
/ 17 апреля 2019

Скорее всего, проблема пропускной способности сети (если не других), потому что при отправке сообщения SOAP с одного компьютера на другой удаленный компьютер, он должен перемещаться туда и обратно в сеть и, если размер сообщения огромен, пропускная способность сети должен быть проблемным и занимать много общего времени.

В качестве примера.

Если время в сети = 500 мс

SOAP servic = 400 мс

Тогда общее время для удаленного сервера = 400 + 500 мс (что ~ 2 * 400 мс).

Вот несколько советов, чтобы разобраться в этом.

1) Попробуйте записать, сколько времени сервер занимал обработкой, точкой входа в конец службы, если он точно такой же или близок к тому, что вы получаете в локальной сети, то это доказало, что проблема с сетью только .

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

2) Если это не описанный выше случай, возможно, вы пытаетесь подключиться к удаленной базе данных или к чему-то еще в службе SOAP, что опять может иметь проблему с пропускной способностью сети или что-то подобное (например, пропускная способность базы данных или индексы отсутствуют или огромные данные по сравнению с локально) иначе, но это доказывает, что это не проблема пропускной способности сети, и вам нужно решить эту проблему.

Надеюсь, что это дает некоторый контекст, хотя для получения точного ответа вам нужно добавить больше деталей к вашему вопросу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...