Hi, can you raise a Jira in http://fusesource.com/issues/browse/STOMP with all these details. Reproducible test case would be great to have. Cheers -- Dejan Bosanac - http://twitter.com/dejanb Open Source Integration - http://fusesource.com/ ActiveMQ in Action - http://www.manning.com/snyder/ Blog - http://www.nighttale.net On Sun, Dec 20, 2009 at 10:37 PM, walec51 wrote: > > Hi, > > I think I stumbled upon a bug in the FUSE PHP Stomp Client 1.0. It seams > sometimes I get two messages in one readFrame. > > I have a PHP process subscribed  to several topics and one queue on ActiveMQ > 5.3. There are a dozens of remote JMS Java clients posting and listening to > those topics and one JMS Java client posting to the queue. From time to time > the the load gets high and readFrame returns two messages to one variable. > When I do something like this with that message: > > $msg = stomp->readFrame(); > echo $msg; > > I get: > > MESSAGE > message-id: ID:server.xxx.pl-46732-1260956689799-0:0:2:3:470 > destination: /queue/SITE.SERVER.REQ > timestamp: 1260987108641 > expires: 0 > priority: 4 > > # > #Wed Dec 16 19:11:48 CET 2009 > client.2.score=3 > client.1.id=4806 > cmd=game_ended > win.code=1 > game.time=30336 > client.won.id=283 > client.1.score=0 > game.id=14754 > client.2.id=283 > ^@ > MESSAGE > message-id:ID:Sylwek-PC-61394-1260986134487-0:0:1:5:171 > destination:/topic/LOBBY.EVENT.1 > timestamp:0 > expires:0 > priority:4 > > #^M > #Wed Dec 16 19:10:02 CET 2009^M > client.name=mlody^M > cmd=lobby_ping^M > client.id=4084^@ > > Note that ^M and ^@ are non printable chars shown in vim. This coses my PHP > client to stop listening to the LOBBY.EVENT.1 topic as I think ack only > accepts the upper message. > > My code that uses stomp looks something like this: > >        function run() { > >                try { > >                        $this->log->info("Inicjalizowanie procesu"); > >                        $this->allConnect(); >                        $this->connect_time = time(); > >                        $this->log->info("Rozpoczecie pracy ..."); > >                        while(!$this->stop) { > >                                if((mktime() % 3) == 0) >                                        $this->games->updateOnlinePlayers(); > >                                $msg = $this->con->readFrame(); >                                $msgItr = 0; >                                while($msg) { > >                                        $this->log->debug("Otrzymano wiadomoĹ?Ä? ($msg)"); >                                        $params_raw = preg_split("/\n/", $msg); >                                        $hash = array(); >                                        foreach($params_raw as $p) { >                                                if(preg_match("/\s*([^=\s]+)\s*=\s*(.*)/", >                                                $p, $matches) >                                                ) { >                                                        $hash[trim($matches[1])] = trim($matches[2]); >                                                } >                                        } >                                        $this->handleMessage($hash, $msg); >                                        $this->con->ack($msg); > >                                        if($msgItr == 20) { >                                                break; >                                        } >                                        $msg = $this->con->readFrame(); >                                        $msgItr += 1; >                                } > >                                $this->nonInviteLobbyControl(); > >                                if(time() - $this->connect_time > 60*60) { >                                        $this->log->info("Resetowanie poĹ?Ä?czenia"); >                                        $this->allDisconnect(); >                                        $this->allConnect(); >                                        $this->connect_time = time(); >                                } >                        } > >                        $this->log->info("Zakonczenie pracy"); > >                        $this->allDisconnect(); >                } >                catch(Exception $e) { >                        $this->log->fatal($e->getMessage(), $e); >                } >        } > >        function allConnect() { >                if(!$this->no_db) { > >                        $this->log->info("Laczenie z baza $this->mysql_url, $this->mysql_name, > $this->mysql_pass"); >                        $this->link = mysql_connect($this->mysql_url, $this->mysql_name, > $this->mysql_pass); >                        mysql_select_db($this->mysql_db, $this->link); >                        mysql_query('SET NAMES utf8 COLLATE utf8_general_ci;', $this->link); >                        $this->games = new mpg_games($this->link); >                        $this->params = new mpg_params($this->link); >                } >                else { >                        $this->games = new mpg_games_inmem(); >                } > >                $this->initStompConnection(); >                $this->initStompSubscription(); >        } > >        function allDisconnect() { >                if(!$this->no_db) { >                        mysql_close($this->link); >                } >                $this->con->disconnect(); >        } > >        function initStompConnection() { >                $this->con = new Stomp($this->stomp_url); >                $this->con->setReadTimeout(1, 0); >                $this->con->connect($this->stomp_name, $this->stomp_password); >        } > >        function initStompSubscription() { >                $this->con->subscribe("/queue/SITE.SERVER.REQ"); >                $this->con->subscribe("/queue/SITE.SERVER.RES"); >                $ls = $this->getLobbys(); >                foreach($ls as $l) { >                        $this->con->subscribe("/topic/LOBBY.EVENT.".$l); >                        $this->con->subscribe("/topic/LOBBY.SITE.EVENT.".$l); >                        $this->con->unsubscribe("/topic/LOBBY.SITE.EVENT.".$l); >                        $this->con->subscribe("/topic/LOBBY.CHAT.".$l); >                        $this->con->unsubscribe("/topic/LOBBY.CHAT.".$l); >                } >        } > > I think this is a concurrency problem as it happens more as the load gets > higher. I hope this info is of some help for the stomp developers. > > I've posted this message also on the FUSE forum. But just thought that some > people here might also be interested in this message. > -- > View this message in context: http://old.nabble.com/Bug-in-FUSE-PHP-Stomp-Client-1.0-working-with-ActiveMQ-tp26867492p26867492.html > Sent from the ActiveMQ - Dev mailing list archive at Nabble.com. > >