SAM - Simple Asynchronous Messaging

Introduction

This extension provides access to the functionality of messaging and
queueing systems, such as the IBM WebSphere MQSeries family of products,
from PHP scripts. The interface is designed to make it extremely simple
to do the more commonly required tasks such as deliver simple text
messages to queues while still allowing skilled users to do more complex
messaging operations. For many users the complexities of setting up
numerous options can be simply ignored.

The SAM extension is a framework that provides a very simple API that can be used to
access a number of messaging middleware systems. Currently the package
includes built-in support for the MQTT (MQ Telemetry Transport) messaging protocol and support for the IBM
Messaging and Queuing middleware products. SAM is designed to be readily extended to
support other messaging systems and extension modules may be written in C or PHP.

Installation

The SAM framework and MQTT support can be built and used without any other prerequisites.
Support for protocols other than MQTT is provided via a set of libraries and some client
side code referred to as XMS.

If you only intend to use the built-in MQTT support then you can build and configure SAM as
an extension or simply refer to "php_sam.php" with a "requires" or "requires_once" clause
in your PHP script. In this case you need only install the code without building the
extension using the pear installer:

Prerequisites

The SAM extension interfaces to the IBM Messaging and Queuing
middleware products using a set of libraries and some client side code
referred to as XMS. This package is available as a free download in
the guise of IBM support pack IA94. There is a description of this
package and download links in the article »
Introducing XMS - The IBM Message Service API.

If you intend to use SAM to access the Messaging and Queuing
infrastructure within WebSphere MQ then you will also need to have
installed a local MQ queue manager or installed the WebSphere MQ
clients package. The clients package is freely available as a support
pack (» MQC6).

If you are only aiming to experiment with sending messages to and from
WebSphere Application Server queues using the WebSphere Platform
Messaging protocol (WPM) then you do not need to install the MQC6
package.

After installing these packages you will need to ensure the XMS binary
and, if you are using it, the MQ client bin directory are included in
the PATH environment variable so that Apache and PHP can find the
dependent .DLLs/libraries.

Linux installation steps

The sam extension is supplied as a PECL module, which
you should be able to download and install in one step as follows:

To work with the very latest source, you'll need to extract it from
cvs and build manually as above.

Windows installation steps

You will probably need to build the sam extension for Windows as there
are only a limited range of pre-built binaries available from the SAM website.
The extension can be built using the standard Windows extension build procedures.

You will need the PHP source tree for the version of PHP you wish to
build the SAM extension against which you can obtain from php.net.
This should be unpacked into a working directory of your choice.

You will also need the libraries and headers used by PHP extensions
available from http://www.php.net/extra/win32build.zip and this
should be unzipped so that is in your working directory.

You will need a compiler such as the free version of Visual Studio C++
Express from the Microsoft web site. Also you need the Microsoft
Windows Platform SDK which again can be downloaded from the Microsoft web site.

Obtain the SAM extension source using pear (pecl download sam) or by using
CVS and copy the files to a new "sam" directory under the "ext" directory
in your PHP source tree.

To build the extension open a build environment window by going to the
start menu->all programs->microsoft platform SDK for windows->
open build environment window->windows 200 build environment->
set windows 2000 build environment (retail)

This should open a command prompt with all the environment variables
set up to access the platform SDK etc. You then need to set the
environment variables for Visual Studio by issuing the command
"vcvars32.bat" in the window.

Change directory to your working directory e.g. cd c:\php-build. Then
make sure the win32build tools are accessible by adding them to the
PATH environment variable:

If you have used Visual Studio 2005 to build the DLLs please see below for additional steps that
must be carried out before proceeding further.

The DLLs created (php_sam.dll and optionally php_sam_xms.dll) can now be copied to the
subdirectory appropriate for your PHP set-up. Make sure that the module(s) are loaded by PHP, by adding following line to
php.ini
:

Additional steps for Visual Studio 2005

If you build the SAM extension with the Microsoft Visual Studio 2005
compiler and tools you need to perform an additional step in the build
process to ensure the php_sam.dll is able to link
with the C runtime libraries at runtime. This step includes the
dependancy manifest into the DLL. Switch to the directory where the
php_sam.dll has been generated (usually
Release_TS or Debug_TS below the php source directory) and issue the
following magic incantation:

If you build the SAM extension using the compiler and libaries from
Microsoft Visual Studio 2005 you will also need to ensure that the
runtime components are installed on the system on which you intend to
use SAM. This can be accomplished by installing Visual Studio 2005 or
by using the freely distributable
» runtime package.

Protocol support and mapping

The SAM framework can be extended to support other messaging protocols and connection mechanisms. To add
support for a new protocol or connection library a support class has to be defined, either as a C extension
or as a PHP script, and a "factory" script must be created. The support class must implement all the
methods of the SAMConnection class though it should not inherit from SAMConnection. The factory script
will be called by the SAM framework to create an instance of the implemented class. The way SAM chooses
which factory to call is based on the protocol specified as the first parameter of the "connect" call.

By default the built-in MQTT support will be used if a connect call specifies a protocol of SAM_MQTT ("mqtt"), for
any other protocol SAM will attempt to use the XMS support extension. To add support for additional
protocols or to modify the default behavior entries may be added to php.ini in the [sam] section. The
default mapping is equivalent to the following entries:

As can be seen from these examples the entries take the form of "sam.factory.pppp=xxx" where pppp is the protocol
string specified on the connect call and xxx is a factory suffix. Note: SAM defines constants for these protocol
strings such that SAM_WMQ=wmq, SAM_WPM=wpm, SAM_RTT=rtt, SAM_MQTT=mqtt, etc.

When identifying the support code to use on a connect call SAM looks up the protocol name in the php.ini entries
and then invokes a factory script named sam_factory_xxx.php. If no entry is found the support will default to XMS.

API Usage

Connections

In order to perform any messaging and queueing functions a connection
must be established with a messaging server by creating a SAMConnection
object and calling its "connect" method, with a set of connection
properties, to connect the PHP script to the messaging server. Until
such time as the SAMConnection object is destroyed the connection
will be maintained and available for use. All SAMConnection objects
are destroyed when the PHP script exits.

A set of default properties may be used in connecting to a messaging
server but as a minimum the PHP script must specify a protocol to be
used.

Example 2097. Creating a connection and connecting to an MQTT server

Messages

Messages sent to and received from queues are represented by the
SAMMessage object. The SAMMessage object encapsulates the body of
the message (if one exists) and the header properties associated with
the message. A SAMMessage object is either supplied as a parameter to
a messaging operation or returned as a result.

Example 2098. Creating a message with a simple text body

Messages may have header properties associated with them that provide
control over the transport of the message or further information to the
receiving application. By default message properties are delivered to
the underlying messaging system as strings and in this case they may be
set with the following simple syntax:

Example 2101. Retrieving a property from a message header

Messaging operations

All messaging operations are performed through calls to methods on the
connection object.
To add a message to a queue the "send" method is used, to obtain a
message from a queue the "receive" method is used. Other methods
provide publish and subscribe functionality and control of transaction
boundaries.

Publish/Subscribe and suscriptions to topics

SAM allows messages to be sent either to queues or, for WebSphere MQ
and WPM, to publish/subscribe topics.
A topic desintation is specified to SAM in the usual way, i.e. in the
form 'topic://fred', rather than the form 'queue://AQUEUE' used for
point to point operation. To use publish/subscribe it is simply
necessary to specify the correct broker name on the SAMConnect
"connect" call and the desired topic in the destination argument to
the SAMConnect "send" and "receive" calls. The PHP interface is
otherwise identical to the point to point model.

By default, SAM creates non-durable subscriptions when using
publish/subscribe. This means that if a client application is
inactive when messages are published to a topic, then it will not
receive them when it subsequently restarted. SAM does also allow
durable subscriptions to be made to topics when using WPM or WebSphere
MQ publish/subscribe. The purpose of these subscriptions is to allow
data to be received by a client application even if that client was not
active at the time the data was published.

Durable subscriptions are specified by using the SAMConnect "subscribe"
call. This method takes the destination topic as an input parameter and
returns a subscription identifier that may be used on subsequent
"receive" calls. When the subscription is no longer required the
SAMConnection "unsubscribe" method should be used to delete the
subscription.

Example 2104. Subscribing to a topic using a WebSphere Platform Messaging (WPM) server

<?php
$conn = new SAMConnection();// Note: For pub/sub on WPM, when connecting the name of a messaging engine
// to hold the durable subscription (SAM_WPM_DUR_SUB_HOME) must be specified.$conn->connect(SAM_WMQ, array(SAM_ENDPOINTS => 'localhost:7278:BootstrapBasicMessaging',SAM_BUS => 'Bus1',SAM_TARGETCHAIN => 'InboundBasicMessaging'SAM_WPM_DUR_SUB_HOME => 'MyMachineNode01.server1-Bus1'));

Example 2106. Deleting a durable subscription to a topic

Error handling

All SAMConnection methods that provide access to messaging operations
return FALSE if an error occurred in processing the request.
In addition the SAMConnection object has two properties, "errno"
and "error", that provide respectively the error number and
text description of the last error to occur on the connection.

Optional connect option to indicate to an MQTT server that all previous connection data
for this client should be removed and that subscriptions should be deleted when the client
disconnects explicitly or unexpectedly.

SAM_NON_PERSISTENT
(string)

Connect attribute value used to request messages are not made persistent
on the messaging server.

SAM_PASSWORD
(string)

Connect attribute used to define the password to be used for the user
account being used to connect to a messaging server that requires
authorisation for connections.

SAM_PERSISTENT
(string)

Connect attribute value used to request messages are made persistent
on the messaging server to protect against loss of messages in the
event of failure.

SAM_PORT
(string)

Connect attribute used to set the port number on which to communicate
with the messaging server.

SAM_PRIORITY
(string)

Option name used on send requests to specify a delivery priority value.

SAM_REPLY_TO
(string)

Message propery used to specify the queue identity on to which the
script expects response or reply messages to be posted.

SAM_RTT
(string)

Connect protocol definition for selecting the IBM Realtime Transport
protocol for communication with a business integration messaging server.

SAM_STRING
(string)

Type specifier used when setting properties on SAM_Message objects.

SAM_TARGETCHAIN
(string)

Connection attribute used to set the required target chain identifier.

SAM_TEXT
(string)

Message body type descriptor.

SAM_TIMETOLIVE
(string)

Message send option name used to specify the length of time a message
should be retained in milliseconds.

SAM_TRANSACTIONS
(string)

Connection attribute used to set required transactional behaviour. May
be set to SAM_AUTO (default) or SAM_MANUAL.

SAM_USERID
(string)

Connect attribute used to define the account to being used to
connect to a messaging server that requires authorisation for connections.

SAM_WAIT
(string)

Receive property used to specify the wait timeout to be used when
receiving a message from a queue or subscription.

Option name used on send requests to specify the target client mode.
This can either be default to 'jms' or 'mq'. The default is 'jms' which
means an RFH2 header is sent with the message whereas the 'mq' setting
means no RFH2 is included.