You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@activemq.apache.org by walec51 <me...@adamwalczak.info> on 2009/12/20 22:37:18 UTC

Bug in FUSE PHP Stomp Client 1.0 working with ActiveMQ

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.


Re: Bug in FUSE PHP Stomp Client 1.0 working with ActiveMQ

Posted by Dejan Bosanac <de...@nighttale.net>.
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 <me...@adamwalczak.info> 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.
>
>