Случайная ошибка при подключении к SAP с помощью ERPConnect
Мы используем ERPConnect в нашем приложении ASP.NET, но иногда мы получаем некоторые сообщения об ошибках, когда пользователи пытаются подключиться к SAP через наше приложение.
CPIC-CALL: 'CMRCV: rc = 19 РАСПОЛОЖЕНИЕ SAP-шлюз на хосте SERVERNAME / sapgw10 ОШИБКА Разговор 53230591 не найден ВРЕМЯ СР 16 ноября 13:49:58 2011 РЕЛИЗ 701 КОМПОНЕНТНЫЙ SAP-шлюз ВЕРСИЯ 2 RC 728 МОДУЛЬ gwxxrd.c LINE 6278 СЧЕТЧИК 1277701
Это всегда происходит при открытии соединения с SAP через ERPConnect.
R3Connection connection = Connection;
connection.Open(); // the error occurs here
Это довольно случайно. В некоторые дни мы не получаем никаких сообщений об ошибках, в другие дни мы получаем 20 сообщений в день. ERPConnect использует librfc32.dll, определенный в папке System32, и имеет версию 7200.1.39.6461 (которая является последней версией).
Эта проблема не возникала на моей локальной машине для разработки (Windows 7 x86). Это всегда происходит на нашем производственном сервере (Windows Server 2008 R2).
Есть идеи, что может вызвать эту проблему?
Редактировать (добавлена выдержка из журнала ошибок):
* * LOCATION SAP-Gateway on host HERCULES / sapgw10 * ERROR partner 'hercules:sapgw01' not reached * * TIME Thu Nov 24 09:10:20 2011 * RELEASE 701 * COMPONENT NI (network interface) * VERSION 38 * RC -10 * MODULE nixxi.cpp * LINE 2835 * DETAIL NiPConnect2 * SYSTEM CALL connect * ERRNO 10061 * ERRNO TEXT WSAECONNREFUSED: Connection refused * COUNTER 1385122 * *****************************************************************************
GwTraceHdlInfo:
HANDLE = 137
TIME = Thu Nov 24 09:10:19 2011
SOCKET = 2108
STAT = NI_CONN_WAIT
TYPE = STREAM IPv4
OUT = 0 messages 0 bytes
IN = 0 messages 0 bytes
LOCAL = 0.0.0.0:1865
REMOTE = -
OPTIONS = BUFFERED
ni hdl = 137
type = CLIENT
net_stat = CONNECT_TO_REM_GW_PENDING
hostaddr = 100.100.103.15
accept_hostaddr = 100.100.103.15
opcode = NORMAL_CLIENT
conn opcode = REMOTE_GATEWAY
conn vers = 2
index = 10
data = 0000000000000000
ext_info = 000000000EF1D870
offset = 0
rest_len = 0
snc_forced = 0
remote gateway infos:
hostname =
hostaddr = 100.100.103.15
service = sapgw01
tpname = sapdp01
GwSelClear: clear RWC for hdl 137
NiICloseHandle: called for hdl 137 while waiting for connection
NiICloseHandle: shutdown and close hdl 137 / sock 2108
GwFreeHdlInfoMemory: free 000000000EF1D870 (ext info)
GwIFreeMemForLU_TP: freed memory for sys 10
GwListRemove: remove elem 10 from sys_r3_list
GwListRemove: 2 elems in sys_r3_list
GwListRemove: elem 10 not in sys_reg_list
GwListRemove: remove elem 10 from sys_inuse_list
GwListRemove: 104 elems in sys_inuse_list
GwUpdateClient: act_sys: 104
GwIDelR3Conn: send error message to client
GwSendRc3: send (appc_rc=CM_PRODUCT_SPECIFIC_ERROR / sap_rc=GW_CONNECT_FAILED) to client HERCULES / sapgw10 (0)
GwRqDpSendTo: (HERCULES / sapgw10, gw_id=0, appc_ca_blk=-1, len=335, comm_index=-1)
LOCK APPC ca_blk 3
DpGetCpicCommIdx: found index 3 via appc_hdr
found comm entry 3 (tid/uid/mode/conv_id/a_r: 158/13268/0/ /0)
GwIsAWaitingSWP: wp 1 waiting
GwSapWpWakeUp: send answer to sap wp 1
GwSapWpWakeUp: make wp 1 owner of appc_ca_blk 3
-OUT- tid -1 uid -1 mode 255
-OUT- appc_ca_blk 3 len 335 rq_id 43133
-OUT- wait_f_answ 0 cmd 0
NiIWrite: hdl 109 sent data (wrt=28,pac=1,MESG_IO)
GwIDelR3Conn: decrement conv_no of client 0: 5
GwFreeMemory: free 000000000EEF3480 (len=3700)
GwFreeMemory: act_overflow_size = 20352 (- 3700)
GwIDelR3Conn: idx/conv = ((-1/0) | (10/0)), delete conv 48 from conv-table
GwClearConn: conv_no/tcp_conv_no/sna_conv_no: 6/6/0
GwClearConn: free r3 conv info
GwClearConn: free buffer info
GwFiSearchConvId: deleted 27077110 local, conn=48
GwListInsert: insert elem 48 into conn_free_list (at begin)
GwListInsert: 494 elems in conn_free_list
GwListRemove: remove elem 48 from conn_search_list
GwListRemove: 0 elems in conn_search_list
GwListRemove: elem 48 not in conn_write_list
GwListRemove: remove elem 48 from conn_inuse_list
GwListRemove: 6 elems in conn_inuse_list
GwReadReqIndex: (process_id: -1)
GwReadReqIndex: no filled request-index-block
GwCheckClient: check clients
LOCK APPC ca_blk 4
GwCheckClient: raise timeout for conv 27059938 (intr/uid/mode/comm_idx=9/13261/0/90)
GwSendRcToDp: send appc_rc/sap_rc 10001/221 to dp
make DISP owner of appc_ca_blk 4
DpSemRq: key: 3, units: 1, timeout: -1
DpSemRel: key: 3, units: 1
DpRqPutIntoQueue: put request into queue (reqtype 0, prio LOW, rq_id 43134)
GwDispWakeUp: send wakeup with ni handle 2
NiIWrite: hdl 2 sent data (wrt=1,pac=1,MESG_IO)
-OUT- sender_id APPC_SERVER tid 165 wp_ca_blk -1 wp_id -1
-OUT- action SEND_TO_WP uid 13261 appc_ca_blk 4 type NOWP
-OUT- new_stat NO_CHANGE mode 0 len 80 rq_id 43134
GwListRemove: remove elem 90 from comm_wait_list
GwListRemove: 0 elems in comm_wait_list
GwListRemove: remove elem 90 from comm_wait_list
GwListRemove: 0 elems in comm_wait_list
Редактировать 2: добавлен пример кода
Я создал небольшой пример кода, и если заметил, что в конце одно соединение остается открытым. Если я начну пример снова, два соединения останутся открытыми в конце примера. Так что-то идет не так...
protected void SAP( object sender, EventArgs e ) {
ThreadStart threadStart1 = new ThreadStart( CreateSAP );
Thread thread = new Thread( threadStart1 );
Thread thread2 = new Thread( threadStart1 );
thread.Start();
Thread.Sleep( 2000 );
thread2.Start();
while ( thread2.IsAlive ) {
}
Response.Write( "done" );
}
private void CreateSAP() {
R3Connection conn = ERPConnection.Connection;
conn.MultithreadingEnvironment = true;
for ( int i = 0; i < 12; i++ ) {
try {
conn.Open();
Thread.Sleep( 1000 );
} finally {
conn.Close();
}
}
}
2 ответа
К сожалению, это было то, что я сделал в своем коде, что было не очень... э-э-э... хорошо. ERPConnect имеет объект R3Connection, и я использовал одноэлементное изображение во всем приложении.
Если пользователь использовал соединение, а другой пользователь также запросил соединение, объект R3Connection создал новое соединение (это можно проверить с помощью SM04-транзакции в SAP). Если оба пользователя, однако, закрыли соединение, одно из двух соединений оставалось открытым (я думаю, что это ошибка в ERPConnect, но мы не можем связаться с ними, потому что срок нашей поддержки истек). Предел соединений (определенный в SAP) быстро достигается в производственной среде.
Теперь я создаю объект R3Connection для каждого пользователя, поэтому я уверен, что соединение правильно закрыто в SAP-системе при вызове метода Close() (или с помощью оператора) в моем коде.
Код
public static R3Connection Connection {
get {
ERPConnect.LIC.SetLic( "MyLicenseKey" );
R3Connection connection = new R3Connection(
[set connection settings]
);
connection.MultithreadingEnvironment = true;
return connection;
}
}
Я выискиваю ответ на совершенно другую проблему, но, учитывая, что я наткнулся на вашу проблему, это очень похоже на конфигурацию сети - убедитесь, что у вашего сервера "hercules" есть порты 3210, 3310 и 3610 (я думаю, что они правы - это может быть 3201/3301/3601, что трудно сказать по журналам SMGW) открытое в брандмауэре Windows, что нет никаких других брандмауэров, блокирующих соответствующий трафик, и что шлюз по умолчанию на "hercules" установлен на устройство, которое может успешно маршрутизировать трафик на 100.100.103.15 (я предполагаю, из ваших журналов, что это IP-адрес вашего сервера, на котором работает приложение.NET), и что шлюз по умолчанию на 100.100.103.15 установлен на устройство, которое может успешно направлять трафик к "геркулесу". Кроме того, вам повезет больше, если вы используете полное доменное имя (например, hercules.sap.local) для подключения к своему серверу SAP, потому что тогда вы больше не будете полагаться на доисторические капризы NetBIOS для поиска своего Сервер SAP.