Consultor Eletrônico



Kbase P77071: Two AppServers start processing their own request almost 1000 ms after each other
Autor   Progress Software Corporation - Progress
Acesso   Público
Publicação   23/04/2004
Status: Unverified

FACT(s) (Environment):

Progress 9.1D

SYMPTOM(s):

Two AppServers start processing their own request almost 1000 ms after each other

AppServer code retrieves messages via the SonicMQ adapter

CAUSE:

Messages delivery delayed because of Sonic MQ 4.0.2 along with XQ 1.5 Build 185 and use of the SOAPInboundConfig.xml to receive messages over HTTP and place them into the queue and only using one inbound acceptor.

FIX:

4GL Sample Code which works properly:

/* Client Code */
DEFINE VARIABLE hAppSrv AS HANDLE NO-UNDO.
DEFINE VARIABLE ret AS LOGICAL NO-UNDO.
CREATE SERVER hAppSrv.
ret = hAppSrv:CONNECT ("-AppService asbroker -H pcprgrs2 -S 5162","Progress","").
IF NOT ret THEN
RETURN ERROR "Failed to connect to AppServer".

RUN test.p ON SERVER hAppSrv ("x_client").
PAUSE 1 NO-MESSAGE.
ret = hAppSrv:DISCONNECT().
DELETE OBJECT hAppSrv.
/* End Client Code */

/*AppServer Code: */
DEFINE INPUT PARAMETER sid AS CHAR.
DEFINE VARIABLE ptpsession AS HANDLE.
DEFINE VARIABLE consumerH AS HANDLE.
DEF VAR vstart AS INT.
DEF VAR jmsOK AS LOGICAL INITIAL TRUE.

RUN jms/ptpsession.p PERSISTENT SET ptpsession ("-H localhost -S 5162 ").
RUN setBrokerURL IN ptpsession ("localhost:2506").
RUN SETUSER IN ptpsession ("Administrator").
RUN setPassword IN ptpsession ("Administrator").

RUN setPrefetchCount IN ptpsession (1) .
RUN beginSession IN ptpsession.

RUN createMessageConsumer IN ptpsession (
THIS-PROCEDURE, /* This proc will handle it */
"messageHandler", /* name of internal procedure */
OUTPUT consumerH).

RUN receiveFromQueue IN ptpsession ("SampleQ1", /* request queue */
?, /* No message selector */
consumerH). /* Handles the messages */

/* Start receiving messages */
RUN startReceiveMessages IN ptpsession.
vstart = ETIME(YES).
RUN waitForMessages IN ptpsession ("inWait", THIS-PROCEDURE, ?).
IF NOT jmsOk THEN
DO:
RUN deleteSession IN ptpsession.
END.


PROCEDURE messageHandler:
DEFINE INPUT PARAMETER requestH AS HANDLE.
DEFINE INPUT PARAMETER msgConsumerH AS HANDLE.
DEFINE OUTPUT PARAMETER replyH AS HANDLE.
DEF VAR mtext AS CHAR.
DEF VAR mylog AS CHAR.
mylog = sid + "log.txt" .
OUTPUT TO value(mylog) APPEND.

mtext = DYNAMIC-FUNCTION('getText':U IN requestH).
IF mtext = "quit" THEN DO :
jmsOK = FALSE.
END.

PUT UNFORMATTED "Got message from Server : " SESSION:SERVER-CONNECTION-ID " with : " sid SKIP .
PUT UNFORMATTED "At: " String(TIME,"hh:mm:ss") " : " ETIME " text: " mtext SKIP.
OUTPUT CLOSE.

RUN deleteMessage IN requestH.

END.

FUNCTION inWait RETURNS LOGICAL.
RETURN jmsOK.
END.

/*End AppServer Code: */

/* 4GL code to send messages */
DEFINE VARIABLE ptpsession AS HANDLE.
DEFINE VARIABLE messageH AS HANDLE.
DEF VAR i AS INT INITIAL 1.

RUN jms/ptpsession.p PERSISTENT SET ptpsession ("-H localhost -S 5162 ").
RUN setBrokerURL IN ptpsession ("localhost:2506").
RUN SETUSER IN ptpsession ("Administrator").
RUN setPassword IN ptpsession ("Administrator").
RUN beginSession IN ptpsession.

DO WHILE i < 20.
RUN createTextMessage IN ptpsession (OUTPUT messageH).
IF i < 18 THEN RUN setText IN messageH ("test message " + STRING(i)).
ELSE RUN setText IN messageH ("quit").

RUN sendToQueue IN ptpsession ("SampleQ1", messageH, ?, ?, ?).
RUN deleteMessage IN messageH.
i = i + 1 .
END.

RUN deleteSession IN ptpsession.
/* End 4GL code to send messages */