ONJava.com -- The Independent Source for Enterprise Java
oreilly.comSafari Books Online.Conferences.

advertisement

AddThis Social Bookmark Button

How to Use JMS with PHP How to Use JMS with PHP

by Amir Shevat
10/27/2004

JMS (Java Messaging Service) is an interface implemented by most J2EE containers in order to provide point-to-point queuing and topic-based (publish/subscribe) functionality. JMS is frequently used by enterprise and back-end applications for distributed communication and collaboration. PHP is a powerful scripting language popular for use with Apache's CGI facility. Although efforts are being made to develop PHP as a back-end scripting language, its use is still very much confined to front-end applications. Combining the strengths of PHP--easy and fast web development, and compatibility with many types of databases--with those of JMS, which is the standard for communication with back-end enterprise applications, creates a powerful and easy-to-use tool for both Java and PHP developers.

PHPMQ gives the PHP developer JMS-like abilities through the MantaRay messaging bus. This document gives an overview of PHPMQ and its use by the PHP developer.

Definitions

MantaRay: MantaRay is an open source, serverless transport layer designed specifically for heterogeneous, distributed, and high-traffic environments. It has a JMS API (1.1 and 1.02) as well as RMI, HTTP, and proprietary APIs. Compared to traditional messaging systems, such as busses or brokers, MantaRay provides a much higher level of robustness, better performance, and faster implementation by eliminating the need for a broker and bringing all functionality to the edges. MantaRay eliminates the single point of congestion and single point of failure of traditional models by using a peer-to-peer, serverless architecture. The distributed application is lightweight and agnostic to the operating system.

PHPMQ: PHPMQ is an open source serverless messaging toolkit for PHP, giving the PHP developer the ability to perform JMS operations such as sending and receiving messages on queues and topics while ensuring delivery and enabling persistent messaging.

PHP/JAVA integration: PHPMQ uses the PHP/Java integration extension of PHP. The Java extension provides a simple and effective means for creating and invoking methods on Java objects from within PHP. The JVM is created using JNI, and both the PHP script and the JVM run inside of the PHP process.

The PHP/Java integration is used to connect to the messaging bus via Remote Method Invocation (RMI); the PHPMQ Java client performs a lookup and retrieves the MantaRay RMI API, and messaging operations like enqueue and dequeue are performed on that API.

PHP in the World of Messaging

With PHPMQ, developers get the ability to communicate with other applications on the message bus, whether they are written in PHP, Java, or C++, using standard JMS-like messaging: enqueuing messages to queues and dequeuing them, and publishing messages to topics and subscribing for them.

Figure 1 show how PHP scripts connect to the world of messaging with PHPMQ.

Figure 1
Figure 1. PHP connects to the messaging world

PHPMQ runs a thin Java client that connects to the message bus and is the incoming and outgoing interface of the bus. The client uses the RMI API to communicate with a messaging interface located on the message bus. The interface exposes the messaging abilities of MantaRay and maintains a stateful session for the remote (PHP) client, in order to keep the PHP client as thin as possible, and to provide a long-lived messaging session despite using a short-lived script.

Figure 2 show the communication layers between the PHP script and the MantaRay message bus.

Figure 2
Figure 2. Communication between PHPMQ and MantaRay

An Example of a PHPMQ-Powered Application

The "Smart Banners" Example Application

Banners are advertisements added to an HTML page. They usually appear at the top of the page.

Suppose we have a banner management application written in Java. This application decides which banners should be displayed and at what frequency the banners should be changed. The Java application also categorizes these banners into subjects such as finance, entertainment, movies, etc. The Java application enqueues the URLs of the banner to queues named Finance, Entertainment, Movies, etc.

On the other side of the messaging bus is a PHP script whose role is to add the banner according to knowledge about the viewing user (e.g., if the user is a member of a finance forum, them the PHP should display a finance-related banner). The PHP script dequeues URLs from the appropriate queue(s) and displays the banners at the top of the HTML page.

Figure 3 shows the components in the "smart banners" example.

Figure 3
Figure 3. Smart banner components

The management application code might look something like this:

// decideProperURL() is the business logic method 
// that decides what URL should be displayed 
String BannerURL = decideProperURL(); 

// decideProperQueueName() is the business logic  
// method that decides to which queue the banner
// should be enqueued
String queueName = decideProperQueueName();

// Set up the JMS objects needed
QueueConnectionFactory conFactory = 
   (QueueConnectionFactory)
      new MantaQueueConnectionFactory();

javax.jms.QueueConnection con = 
   conFactory.createQueueConnection();

// This session is not transacted
javax.jms.QueueSession sendSession =(QueueSession)
   con.createQueueSession(false,
      Session.AUTO_ACKNOWLEDGE);

javax.jms.Queue sendQueue =
   sendSession.createQueue (queueName);
	 
javax.jms.QueueSender sender =
   sendSession.createSender(sendQueue);
 
// Send the URL of the banner to the queue
javax.jms.TextMessage msg = 
   sendSession.createTextMessage();
	 
msg.setText(BannerURL);
   sender.send(msg,
      javax.jms.DeliveryMode.NON_PERSISTENT,
         javax.jms.Message.DEFAULT_PRIORITY,
            MESSAGE_TTL);

The PHP code might look something like this:

<html>
<body>
...
<?php
include('./libraries/messaging.php');

// first parameter is the host name of the  
// MantaRay RMI registry(local is localhost),   
// second parameter is the port the RMI registry  
// is listening to
$msgAPI = new messaging('localhost',10005);

// the first parameter in the dequeue is a unique
// key of the PHP MantaRay session. The second 
// parameter is the name of the queue. Here, 
// we are in a Movie page.
$inmsg = $msgAPI->dequeue('amir', 'Movie');

?>
<!-- here we add the banner -->
<img src="<php echo $inmsg ?>" />
...
</body>
</html>

The "smart banner" separates the application into two tiers, a logic tier that manages the banners and enqueues them (Java), and a presentation tier that dequeues the banners from the queues based on user information (PHP).

Pages: 1, 2

Next Pagearrow