[6.2] HTTP status code 504: Gateway Time-out

Основная часть программы и общие вопросы по модулям. Установка и настройка BGBillingServer, BGBillingClient.

[6.2] HTTP status code 504: Gateway Time-out

Сообщение maxst-net » 29 дек 2018, 16:16

Уровень знаний Java чуть ниже чем начальный, посему большая просьба не пинать.
Написан скрипт для снятия Z-отчетов с кассовых аппаратов PAY VKP-80K-ФА через Сервер CashCheck

Скрипт:
$this->bbcode_second_pass_code('', '
package ru.bizbi.bgbilling;

import bitel.billing.server.util.MailMsg;
import org.apache.log4j.Logger;
import ru.bitel.bgbilling.common.BGException;
import ru.bitel.bgbilling.kernel.script.server.dev.GlobalScriptBase;
import ru.bitel.bgbilling.plugins.cashcheck.server.CashCheckUtils;
import ru.bitel.bgbilling.server.util.Setup;
import ru.bitel.common.sql.ConnectionSet;
import ru.bitel.frk.client.CmdProtocolClient;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.TimeUnit;

public class STNZReport extends GlobalScriptBase {

private static final Logger logger = Logger.getLogger( STNZReport.class );

static List kkmList = new ArrayList();

static {

Kkm kkm1 = new Kkm();
kkm1.kkmNum = 1;
kkm1.ip = "10.10.10.216";
kkm1.title = " N1";

kkmList.add(kkm1);

Kkm kkm2 = new Kkm();
kkm2.kkmNum = 2;
kkm2.ip = "10.10.10.97";
kkm2.title = " N2";

kkmList.add(kkm2);

Kkm kkm3 = new Kkm();
kkm3.kkmNum = 3;
kkm3.ip = "192.168.200.5";
kkm3.title = " N3";

kkmList.add(kkm3);

Kkm kkm4 = new Kkm();

kkm4.kkmNum = 4;
kkm4.ip = "192.168.200.34";
kkm4.title = " N4";

kkmList.add(kkm4);

Kkm kkm5 = new Kkm();

kkm5.kkmNum = 5;
kkm5.ip = "192.168.200.66";
kkm5.title = " N5";

kkmList.add(kkm5);
}

private String[] EMAILS = {"xxxx@xxx.ru"};

public void printZReport(Setup setup, int kkmNum, String ipAddrkkm, String textMsg, ConnectionSet con) throws IOException, BGException {

int kkmPass = 30;
CmdProtocolClient cpc = null;

try {
cpc = new CmdProtocolClient(ipAddrkkm,9876 );
cpc.connect();

String printServerStatus = cpc.getServerStatus();

logger.info( "PrintServer Status ip:"+ipAddrkkm + "= " + printServerStatus );

if( printServerStatus != null ) {
try
{
CashCheckUtils.ZReport(CashCheckUtils.getPrinter( kkmNum ), kkmPass);
print( "CashCheck Autoprint: Успешно напечатан Z-отчет с ККМ № " + String.valueOf(kkmNum) );
logger.info("CashCheck Autoprint: Успешно напечатан Z-отчет с ККМ № " + String.valueOf(kkmNum));
sendMails(setup,"CashCheck: [ ZReport Success] ", "Успешно напечатан Z-отчет с ККМ № " + String.valueOf(kkmNum) + textMsg);
}
catch(BGException e)
{
print( "CashCheck Autoprint: ZReport ERROR: " + e.getMessage() );
logger.info( "CashCheck Autoprint: ZReport ERROR: " + e.getMessage() );
sendMails( setup,"CashCheck [ ZReport ERROR ]", "Ошибка печати Z-отчета на KKM № " + String.valueOf(kkmNum) + textMsg );
}

try
{
CashCheckUtils.openDay(CashCheckUtils.getPrinter( kkmNum ), kkmPass);
logger.info("CashCheck Autoprint: Успешно напечатан чек открытия смены " + String.valueOf(kkmNum));
print( "CashCheck Autoprint: Успешно напечатан чек открытия смены " + String.valueOf(kkmNum) );
sendMails(setup,"CashCheck: [ Open day Success] ", "Успешно напечатан чек открытия смены с ККМ № " + String.valueOf(kkmNum) + textMsg );
} catch (BGException e)
{
logger.info( "CashCheck Autoprint: ZReport ERROR: " + e.getMessage() );
print( "CashCheck Autoprint: ZReport ERROR: " + e.getMessage() );
sendMails( setup,"CashCheck: [ Open day ERROR] ", "Ошибка печати чека открытия смены с ККМ № " + String.valueOf(kkmNum) + textMsg );

}

}else {

logger.info( "Не удалось получить статус сервера печати с ККМ № " + kkmNum + textMsg );
print( "Не удалось получить статус сервера печати с ККМ № " + kkmNum + textMsg );
sendMails( setup,"CashCheck: [ ERROR GET STATUS PRINT SERVER ] ", "Ошибка получения статуса сервера печати для ККМ № " + String.valueOf(kkmNum) + textMsg );

}
} catch (IOException e) {
logger.info( "CashCheck: [ Sent email wiht PRINT SERVER ERROR]" + e.getMessage());
sendMails( setup,"CashCheck: [ Не удалось снять Z-отчет ] ", "Не удалось снять Z-отчет. Ошибка создания сокета для сервера печати ККМ № " + String.valueOf(kkmNum) + textMsg );
throw new BGException( e.getMessage() );
} finally {
try {
cpc.disconnect();
} catch ( Exception e ) {

}

}
}

@Override
public void execute(Setup setup, ConnectionSet set)
throws Exception {

for( Iterator i = kkmList.iterator(); i.hasNext(); ) {
Thread.sleep(10000);
Kkm kkm = (Kkm) i.next();
try {
logger.info("Попытка снятия отчета с кассы № " + kkm.kkmNum + " IP:" + kkm.ip);
printZReport(setup, kkm.kkmNum, kkm.ip , kkm.title, set);
} catch (Exception e) {
logger.info("[Print Server IP:] " + kkm.ip + " | " + e.toString() );
e.printStackTrace();
}

}

}

private void sendMails(Setup setup, String subject, String body)
{
MailMsg mailmsg = new MailMsg(setup);
for(String email : EMAILS)
{
try
{
mailmsg.sendMessage(email, subject, body);
}
catch (Exception e)
{
logger.info("[Error send e-mail:] " + e.toString() );
}
}
}

}
')

Если запускать скрипт указывая только ОДНУ ККМ (по очереди) - все работает. Но вот если указать сразу ПЯТЬ аппаратов, то после успешного прохода по ТРЁМ аппаратам возникает ошибка 504

Текст ошибки:
$this->bbcode_second_pass_code('', '
com.sun.xml.ws.client.ClientTransportException: The server sent HTTP status code 504: Gateway Time-out
at com.sun.xml.ws.transport.http.client.HttpTransportPipe.checkStatusCode(HttpTransportPipe.java:358)
at com.sun.xml.ws.transport.http.client.HttpTransportPipe.createResponsePacket(HttpTransportPipe.java:307)
at com.sun.xml.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:265)
at com.sun.xml.ws.transport.http.client.HttpTransportPipe.processRequest(HttpTransportPipe.java:184)
at com.sun.xml.ws.transport.DeferredTransportPipe.processRequest(DeferredTransportPipe.java:137)
at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:641)
at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:600)
at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:585)
at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:482)
at com.sun.xml.ws.client.Stub.process(Stub.java:323)
at com.sun.xml.ws.client.sei.SEIStub.doProcess(SEIStub.java:161)
at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:113)
at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:93)
at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:144)
at com.sun.proxy.$Proxy36.run(Unknown Source)
at ru.bitel.bgbilling.kernel.dynamic.client.DynamicCodeLibraryPanel$16.actionPerformedImpl(DynamicCodeLibraryPanel.java:565)
at ru.bitel.common.client.AbstractBGUPanel.actionPerformed(AbstractBGUPanel.java:237)
at ru.bitel.common.client.AbstractBGUPanel$DefaultAction.actionPerformed(AbstractBGUPanel.java:91)
at ru.bitel.common.client.AbstractBGUPanel.performAction(AbstractBGUPanel.java:541)
at ru.bitel.common.client.AbstractBGUPanel.performAction(AbstractBGUPanel.java:522)
at ru.bitel.common.client.AbstractBGUPanel.performAction(AbstractBGUPanel.java:517)
at ru.bitel.bgbilling.kernel.dynamic.client.DynamicCodeLibraryPanel$8.actionPerformed(DynamicCodeLibraryPanel.java:311)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
')

Можно конечно сделать два скрипта и указывать в одном 3 аппарата в другом 2, но это не совсем красиво.



О программе:
$this->bbcode_second_pass_code('', '
Информация о версии:

Клиент: вер. 6.2.849 / 22.12.2016 16:31:48
os: Windows 10; java: Java HotSpot(TM) Client VM, v.1.8.0_151
Сервер: вер. 6.2.1149 / 22.12.2016 16:33:23
os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_77

assist: вер. 6.2.88 / 09.11.2016 15:23:35
bill: вер. 6.2.97 / 14.12.2016 14:33:00
bvcom: вер. 6.2.95 / 14.07.2016 14:11:19
card: вер. 6.2.39 / 26.05.2016 14:50:45
dialup: вер. 6.2.315 / 01.03.2016 00:17:59
email: вер. 6.2.177 / 14.12.2016 14:27:42
inet: вер. 6.2.704 / 19.12.2016 21:03:04
ipn: вер. 6.2.262 / 19.12.2016 21:02:58
mps: вер. 6.2.221 / 04.10.2016 19:16:15
npay: вер. 6.2.197 / 04.10.2016 19:12:21
phone: вер. 6.2.287 / 19.12.2016 21:03:24
rentsoft: вер. 6.2.63 / 04.10.2016 19:16:26
reports: вер. 6.2.213 / 03.10.2016 16:59:27
rscm: вер. 6.2.178 / 04.10.2016 19:16:30
ru.bitel.bgbilling.plugins.bonus: вер. 6.2.122 / 28.11.2016 20:59:09
ru.bitel.bgbilling.plugins.cashcheck: вер. 6.2.114 / 25.07.2017 14:33:27
ВНИМАНИЕ: клиентская версия: 6.2.107 / 15.07.2016 13:25:39
ru.bitel.bgbilling.plugins.crm: вер. 6.2.195 / 04.10.2016 19:16:05
ru.bitel.bgbilling.plugins.dispatch: вер. 6.2.95 / 14.12.2016 14:33:16
ru.bitel.bgbilling.plugins.documents: вер. 6.2.176 / 14.12.2016 14:33:16
ru.bitel.bgbilling.plugins.helpdesk: вер. 6.2.182 / 04.10.2016 19:16:06
ru.bitel.bgbilling.plugins.organizer: вер. 6.2.72 / 04.10.2016 19:16:19
sberbank: вер. 6.2.66 / 16.03.2018 00:59:33
subscription: вер. 6.2.40 / 04.10.2016 19:16:37
trayinfo: вер. 6.2.170 / 02.02.2016 17:42:09
tv: вер. 6.2.238 / 30.11.2016 17:54:27
voiceip: вер. 6.2.191 / 14.12.2016 14:29:33
wm: вер. 6.2.189 / 04.10.2016 19:16:46
yamoney: вер. 6.2.58 / 04.10.2016 19:16:49

Окружение:

Клиент:
os: Windows 10 x86, 10.0
java: Java HotSpot(TM) Client VM, v.1.8.0_151
jre home: C:\Program Files (x86)\Java\jre1.8.0_151
default tz: 29.12.2018 13:23 MSK +0300 (Europe/Moscow)
user tz: 29.12.2018 13:23 MSK +0300 (Europe/Moscow)
locale: ru_RU
Сервер:
os: Linux amd64, 4.9.0-3-amd64
java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_77
jre home: /opt/java/java-8-oracle/jre
default tz: 29.12.2018 13:23 MSK +0300 (Europe/Moscow)
db time: master: 29.12.2018 13:23 MSK
db charset: connection: cp1251(cp1251_general_ci), database: cp1251(cp1251_general_ci)
locale: ru_RU
uptime: Started: 20.12.2018 16:07:23 Uptime: 8 d 21:16:34

Третьи стороны:

Fugue Icons. Copyright © 2011 Yusuke Kamiyamane. All rights reserved.
http://p.yusukekamiyamane.com/
Silk icon set. Copyright © Mark James. All rights reserved.
http://www.famfamfam.com/lab/icons/silk/
')
maxst-net
 
Сообщения: 127
Зарегистрирован: 23 ноя 2015, 15:15

Re: [6.2] HTTP status code 504: Gateway Time-out

Сообщение dimOn » 29 дек 2018, 18:08

но это вам просто клиент же пишет потому что отвалился от сервера - слишком долго снимается отчёт, вот и всё.
по идее код должен до конца выполниться и все отчёты сняться, просто вы это не увидите в клиенте (но в логах сервера всё написано будет).
вы же этот код судя по стеку запускаете тупо через F9, а не из шедулера.
dimOn
 
Сообщения: 5918
Зарегистрирован: 30 май 2008, 15:51

Re: [6.2] HTTP status code 504: Gateway Time-out

Сообщение dimOn » 29 дек 2018, 18:10

почему: у вас в nginx просто слишком малый таймаут на отклик по http стоит, потому долгие операции у вас их клиента все падать будут
как решать: забить или лучше сделать таймаут больше
dimOn
 
Сообщения: 5918
Зарегистрирован: 30 май 2008, 15:51

Re: [6.2] HTTP status code 504: Gateway Time-out

Сообщение dimOn » 29 дек 2018, 18:10

плюс сильно не помешает обновить биллинг, это слишком старый, кешчек у вас от 2016 вообще не работать по идее должен, просто у вас он отдельно новее, чем всё остальное, что тоже делать нельзя
dimOn
 
Сообщения: 5918
Зарегистрирован: 30 май 2008, 15:51


Вернуться в Ядро системы

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 1