Имя: Пароль:
1C
1С v8
1C 8.3 Web-сервис + клиент на Java
,
0 satoru
 
11.01.17
00:27
Есть web-сервис написанный на 1С 8.3.9 и опубликованный на Apache2.2 (localhost/wsTest/ws/test.1cws?wsdl). Необходимо написать на Java клиента, который будет работать с данной ws-ссылкой. Брал пример с сайта ИТС Использование web-сервисов совместно с Java и .Net, получить данные через метод удалось, но как отключится от web-сервиса, чтобы Apache отключился от базы?. Помогите разобраться с данным вопросом.

Код Java:

       private void getOS()  {
            lbOS.setText("Подключение");
            // Создаем Jax-WS прокси на демо web-сервис 1С:Предприятия
            wsTest ws = new wsTest();
            
            // Получаем порт для вызова операции web-сервиса
            wsTestPortType portType = ws.getTestSoap();
            
            // Выполняем вызов web-сервиса
            String verOS = portType.take();
            
            //отключаем
            portType = null;
            
            lbOS.setText(verOS);
        }



lbOS - это надпись на форме, в которую выводится результат.

Так же интересует, если в базе есть пользователи, как провести авторизацию?
1 Юрий Лазаренко
 
11.01.17
00:29
Через 20 минут после последнего запроса сам отключится.
2 satoru
 
11.01.17
00:31
(1) 20 мин. слишком долго. Когда подключаюсь к ws-ссылке через 1С и после вызова метода присваиваю переменной значение Неопределено блокировка сразу снимается.
3 satoru
 
11.01.17
22:03
а что насчет авторизации?
4 satoru
 
11.01.17
23:27
На счет авторизации разобрался, помогла статья (https://toster.ru/q/352777 ответ №1).
5 satoru
 
11.01.17
23:32
Осталась проблема с отключением от web-сервиса. И раз подключение с web-сервисом можно отключить в 1С 8 присвоив Неопределено, думаю есть способ и для Java/
6 Gary417
 
12.01.17
00:33
должно быть чтототам.close

вообще посмотрел код...бл наркоманы чёртовы...ява код с русским языком
7 satoru
 
12.01.17
00:41
(6) К сожалению данного метода нет.
8 Torquader
 
12.01.17
00:53
С Java фокус может не пройти, так как соединение живо, пока жив объект, его вызвавший, но, в Java у нас есть только сборка мусора, и объект будет жить, пока его не уберут - соответственно, соединение будет оставаться рабочим.
P.S. если в объекте можно поменять настройки соединения, то нужно попробовать - после изменения настроек он отключится.
Как вариант, покопаться в конфигурации Apache и запретить его Keep-Alive, чтобы после получения ответа соединение сразу рвалось.
9 Fram
 
12.01.17
00:58
(8) +1 попробуй присовить null, потом вызвать сборку мусора принудительно Runtime.getRuntime().gc()
10 Fram
 
12.01.17
00:59
(1) а откуда эти 20 мин?
11 satoru
 
12.01.17
11:39
Проблема с отключение не воспроизводится, если база 1С серверная.
12 satoru
 
12.01.17
11:47
И ещё в метод take на web-сервисе добавил два параметра:
param1 (string входящий);
param2 (string выходящий).

И соответственно Java выдает ошибку:
Exception in thread "AWT-EventQueue-0" com.sun.xml.ws.fault.ServerSOAPFaultException: Client received SOAP Fault from server: SOAP message parsing error: unknown parameter.  Please see the server log to find more detail regarding exact cuase of the failure.
    at com.sun.xml.ws.fault.SOAP11Fault.getProtocolException(SOAP11Fault.java:193)
    at com.sun.xml.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:126)
    at com.sun.xml.ws.client.sei.StubHandler.readResponse(StubHandler.java:247)
    at com.sun.xml.ws.db.DatabindingImpl.deserializeResponse(DatabindingImpl.java:177)
    at com.sun.xml.ws.db.DatabindingImpl.deserializeResponse(DatabindingImpl.java:256)
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:128)
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:102)
    at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:151)
    at com.sun.proxy.$Proxy27.GetLicensed(Unknown Source)
    at webservice.testWS.getOS(testWS.java:123)
    at webservice.testWS.btnConnectActionPerformed(testWS.java:102)
    at webservice.testWS.access$000(testWS.java:16)
    at webservice.testWS$1.actionPerformed(testWS.java:52)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.Component.processMouseEvent(Component.java:6533)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
    at java.awt.Component.processEvent(Component.java:6298)
    at java.awt.Container.processEvent(Container.java:2236)
    at java.awt.Component.dispatchEventImpl(Component.java:4889)
    at java.awt.Container.dispatchEventImpl(Container.java:2294)
    at java.awt.Component.dispatchEvent(Component.java:4711)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
    at java.awt.Container.dispatchEventImpl(Container.java:2280)
    at java.awt.Window.dispatchEventImpl(Window.java:2746)
    at java.awt.Component.dispatchEvent(Component.java:4711)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
    at java.awt.EventQueue$4.run(EventQueue.java:731)
    at java.awt.EventQueue$4.run(EventQueue.java:729)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

Код Java:
       lbOS.setText("Подключение");
        // Создаем Jax-WS прокси на демо web-сервис 1С:Предприятия
        Authenticator  auth  = new Authenticator() {
            Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("admin", "1".toCharArray());
            }
        };
        // Создаем Jax-WS прокси на демо web-сервис 1С:Предприятия
        Authenticator.setDefault(auth);
        wsTest ws = new wsTest();
        
        // Получаем порт для вызова операции web-сервиса
        wsTestPortType portType = ws.getTestSoap();
        
        // Выполняем вызов web-сервиса
        String error = "";
        String verOS = portType.take("1234",error);
        
        //отключаем
        
        lbOS.setText(verOS);
    }
13 satoru
 
12.01.17
18:08
up
14 Fram
 
12.01.17
19:24
не уверен, но может надо апач рестартануть после обновления вебсервиса?
15 satoru
 
12.01.17
20:43
(14) Заново опубликовал и перезапустил, таже ошибка.
16 alexhtn
 
12.01.17
21:43
Почитай на ИТС или в документации описание файла default.vrd, в нем можно сделать элемент pool и уменьшить maxAge, который по умолчанию равен 20 минутам.
17 satoru
 
12.01.17
22:09
(16) данный вопрос решен, проблема, если метод на веб-сервисе с параметрами (12)
18 satoru
 
13.01.17
12:55
up!
19 Юрий Лазаренко
 
13.01.17
17:38
(10) В параметрах публикации базы 1С. По дефоллту 20 минут, но можно поставить свое значение.
20 satoru
 
14.01.17
20:08
Народ, ещё раз - вопрос с завершением сеанса РЕШЕН! Сейчас необходимо решить вопрос (12).
21 Неверный Параметр И
 
14.01.17
20:27
(20) Уменьши время жизни сеанса в пуле.
22 Неверный Параметр И
 
14.01.17
20:28
И расскажи классу wsTest про твои новые параметры
23 Курцвейл
 
14.01.17
21:12
(20) На класс порта поставь throw WebServiceException
На take

try {
String verOS = portType.take("1234",error);
}
catch(Exception e)
{
String s = e.getMessage();
System.out.println(s);
}
24 satoru
 
14.01.17
22:01
(23) Это не класс, а интерфейс:

    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    package webservice;
    
    import javax.jws.WebMethod;
    import javax.jws.WebResult;
    import javax.jws.WebService;
    import javax.xml.bind.annotation.XmlSeeAlso;
    import javax.xml.ws.RequestWrapper;
    import javax.xml.ws.ResponseWrapper;
    
    /**
     *
     * @author SERGEYRYLSKIY-PC
     */
    @WebService(name = "wsTestPortType", targetNamespace = "test")
    @XmlSeeAlso({
        ObjectFactory.class
    })
    public interface wsTestPortType {
        @WebMethod(operationName = "Take")
        @WebResult(targetNamespace = "test")
        @RequestWrapper(localName = "Take", targetNamespace = "test", className = "wsdemo.client.Take")
        @ResponseWrapper(localName = "TakeResponse", targetNamespace = "test", className = "wsdemo.client.TakeResponse")
        public String Take(String param1, String param2);
        
    }
25 satoru
 
14.01.17
22:07
(22) И как это сделать?
26 Курцвейл
 
14.01.17
22:21
(24) может объясните отличие интерфейса от абстрактного класса?:)
дело то не в этом, а в том что расследование подобных ситуаций начинают с try catch и подкласс интерфейс этого не запрещает.
27 satoru
 
15.01.17
14:06
(23) Сделал и что дальше?

private void getOS() throws WebServiceException {
        lbOS.setText("Подключение...");
        // Создаем Jax-WS прокси на демо web-сервис 1С:Предприятия
        Authenticator  auth  = new Authenticator() {
            Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("Admin", "1".toCharArray());
            }
        };
        // Создаем Jax-WS прокси на демо web-сервис 1С:Предприятия
        Authenticator.setDefault(auth);
        wsTest ws =  new wsTest();
        
        // Получаем порт для вызова операции web-сервиса
        wsTestPortType portType = ws.getTestSoap();
        
        // Выполняем вызов web-сервиса
        String error = "";
        String verOS = "";
        
        
        try {
            verOS = portType.take("1234",error);
        }
        catch(Exception e)
        {
            String s = e.getMessage();
            System.out.println(s);  
            verOS = "Ошибка подключения!";
        }
          
        lbOS.setText(verOS);
            
    }
28 Курцвейл
 
15.01.17
19:02
(27) И какую ошибку выдает?
29 satoru
 
15.01.17
19:06
Client received SOAP Fault from server: SOAP message parsing error: unknown parameter.  Please see the server log to find more detail regarding exact cuase of the failure.
30 Mauser
 
15.01.17
19:09
(28) См 12. Неожиданно, не правда-ли?
31 Mauser
 
15.01.17
19:10
(29) На ИТС русским по белому написано:

Если необходимо перегенерировать прокси web-сервиса, удалите каталог src/wsdemo/client и выполните следующую команду:

wsimport -keep -p wsdemo.client -s src -extension http://users.v8.1c.ru/ws/products.1cws?wsdl[/1C]

Не пробовал?
32 satoru
 
15.01.17
20:16
(31) Попробовал. Выдаёт ошибку:

"wsimport" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
33 satoru
 
16.01.17
10:47
up
34 Serginio1
 
16.01.17
11:30
Да и потом говорят, что .Net отстой
35 satoru
 
17.01.17
10:23
Проблему решил. Используя NetBeans IDE 8.2 добавил в проект новый файл "Веб службы - клиент веб-службы" и платформа сама сгенерировала все необходимые классы и интерфейсы.

Тема закрыта. Всё, кто помогал, спасибо!
Закон Брукера: Даже маленькая практика стоит большой теории.