PHP开发者的BlazeDS和JMS指南文档格式.docx
- 文档编号:18391761
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:20
- 大小:31.21KB
PHP开发者的BlazeDS和JMS指南文档格式.docx
《PHP开发者的BlazeDS和JMS指南文档格式.docx》由会员分享,可在线阅读,更多相关《PHP开发者的BlazeDS和JMS指南文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
P2P点对点一对一方式
PS发布订阅一对多广播方式
在JMS中的消息客户端被称为JMS客户端;
而消息系统则被称为面向消息的中间件(MOM——MessagingOrientatedMiddleware),它也是JMS提供者。
另外,产生消息的JMS客户端被称为是生产者,而接收消息的JMS客户端被称为消费者。
P2P模型
P2P消息模型允许JMS客户端通过名为队列(Queue)的虚拟信道发送和接收消息。
JMS队列可视为消息的容器,就像一个邮箱。
JMS发送者推送一条消息到JMS消息队列就如同寄件人把一封信件放到了邮箱。
而后,接收者从邮箱中获得消息并对之采取某种动作。
就像邮箱中的信件,使用JMS队列从发件人发送的消息由单个接收者读取。
尽管JMS对于P2P也支持类似于发布/订阅模型所使用的“推”的方式,传统的P2P模型却是一个基于“拉”或基于“轮询”的模型,是从队列中请求消息,而不是把消息推送到客户端。
拉模型从队列中请求消息,不把消息推送到客户端
可能用到JMS消息和Flex客户端的一个实例是:
从Flex客户端初始化一个进程,该进程需要服务层花费一些时间才能完成,比如创建一个按需定制的PDF文件。
发布/订阅模式
在发布/订阅模式中,生产者可以通过名为主题(Topic)的虚拟信道发送一个信息给多个消费者。
主题与印刷杂志类似:
订阅者向出版商注册订阅,接收指定的杂志。
出版商定期向不同的订阅者发送同一杂志的副本。
发布/订阅模型总的来说是基于推的模型,消息被广播到消费者,而不是通过请求或拉的方式。
使用JMS主题,您可以从服务层一次发送信息到多个Flex客户端。
在Flex客户端使用JMS主题的一个例子是用户上线。
在这个例子中,当用户登录到该系统,服务层会经由JMS主题发送一个消息,告诉其他所有的Flex客户端该用户已上线。
推模型消息被广播到消费者
JMS消息
JMS提供一种方式来构建信息,使得主题和队列使用起来更加容易。
当编写Java代码时,JMSAPI提供的方法能以一致的方式来正确构建消息。
而使用BlazeDS的一个好处是,您不必担心怎样创建正确的信息,BlazeDS会辅助实现这一点的。
JMS的实现
JMS的实现有若干,既有开源项目也有商业项目。
本文使用的JMS实现是ActiveMQ,它是Apache软件基金会的一个开放源码的项目,以Apache许可证发布。
ActiveMQ除了提供一个JMS的实现外,还提供使用其它编程语言发送消息的功能,包括PHP。
其它的JMS实现还包括IBM的WebSphereMQ,JBoss的HornetQ(注:
前身是JBossMessaging,开放的消息队列),以及OpenJMS。
配置BlazeDS使用JMS
若要BlazeDS使用JMS,其配置包括:
建立正确的端点(endpoint)并在终点(destination)配置中设置JMS属性。
本文的示例用到了一个简单的Flex界面、BlazeDS库,以及ActiveMQ。
JMSAdapter
当消息到达MessageBrokerServlet后,BlazeDS使用JMSAdapter来完成Flex应用程序和JMS的实现之间的消息转换。
JMSAdapter在messages-config.xml文件中配置:
<
adapters>
<
adapter-definitionid="
actionscript"
class="
flex.messaging.services.messaging.adapters.ActionScriptAdapter"
default="
true"
/>
jms"
flex.messaging.services.messaging.adapters.JMSAdapter"
/adapters>
端点的不同
一定要记住,BlazeDS的Java库和MessageBrokerservlet需要进行配置并运行于Web容器。
由于MessageBroker必须处于运行状态,使用JMS适配器的终点(destination)仍要使用AMF(AdobeActionMessageFormat)通道。
在本例中使用的端点是:
?
xmlversion="
1.0"
encoding="
UTF-8"
>
services-config>
services>
service-includefile-path="
messaging-config.xml"
/services>
security/>
channels>
channel-definitionid="
my-amf"
mx.messaging.channels.AMFChannel"
endpointurl="
http:
//{server.name}:
8161/blazeds/messagebroker/amf"
flex.messaging.endpoints.AMFEndpoint"
/>
/channel-definition>
my-streaming-amf"
mx.messaging.channels.StreamingAMFChannel"
8161/blazeds/messagebroker/streamingamf"
flex.messaging.endpoints.StreamingAMFEndpoint"
my-polling-amf"
8161/blazeds/messagebroker/amfpolling"
properties>
polling-enabled>
true<
/polling-enabled>
polling-interval-seconds>
1<
/polling-interval-seconds>
/properties>
/channels>
/services-config>
JMS属性
JMS需要一些自己的配置,比如连接工厂用于建立JMS连接的JNDI(Java命名和目录接口)。
队列名或主题名也是使用JNDI进行解析的。
JNDI是一个JavaAPI,允许把资源的物理位置抽象成名字。
JNDI的常见用法是数据库命名,应用程序使用此JNDI名获得数据库连接。
除了连接工厂、主题或队列的JNDI名,JMS变量还允许您定义用户证书、消息类型、终点类型,等等。
下面展示的是在本例中使用的JMS属性:
destinationid="
my-jms-destination"
jms>
destination-type>
Topic<
/destination-type>
message-type>
javax.jms.TextMessage<
/message-type>
connection-factory>
ConnectionFactory<
/connection-factory>
destination-jndi-name>
dynamicTopics/MyTopic<
/destination-jndi-name>
delivery-mode>
NON_PERSISTENT<
/delivery-mode>
message-priority>
DEFAULT_PRIORITY<
/message-priority>
acknowledge-mode>
AUTO_ACKNOWLEDGE<
/acknowledge-mode>
initial-context-environment>
property>
name>
Context.INITIAL_CONTEXT_FACTORY<
/name>
value>
org.apache.activemq.jndi.ActiveMQInitialContextFactory<
/value>
/property>
Context.PROVIDER_URL<
tcp:
//localhost:
61616<
/initial-context-environment>
/jms>
channelref="
adapterref="
/destination>
您可以查看BlazeDS文档以获得进一步的属性解释。
从BlazeDS发送消息
要尝试本文的例子,请在创建您的测试Flex项目之前,按照下面的步骤行事。
下载ActiveMQ二进制发布包并解压,您可以启动ActiveMQ并完成ActiveMQ文档中的验证步骤,但在继续下一步之前请先关闭ActiveMQ。
下载BlazeDS二进制发布包
首先要下载BlazeDS二进制发布包:
将BlazeDS发布包blazeds.war解压到ActiveMQ的webapps目录下。
这么做可保证您运行的例子中只使用了ActiveMQ。
在Jetty服务器中建立Web应用上下文,Jetty是一个Web容器,ActiveMQ二进制发布包自带了Jetty。
如要增加上下文,需修改jetty.xml文件,它位于ActiveMQ目录下的conf目录:
webAppContextcontextPath="
/blazeds"
resourceBase="
${activemq.base}/webapps/blazeds"
logUrlOnStart="
启动ActiveMQ,在浏览器地址栏输入http:
8161/blazeds。
应该可以看到BlazeDS的目录列表。
这一步是验证你已经把BlazeDSWAR放在正确的位置,并配置正确。
创建一个Flex项目,它包含两个配置文件,配置文件位于src/WEB-INF/flex目录,分别为:
messaging-config.xml和services-config.xml。
使用文章前述的例子来设置JMS的终点,并添加JMSAdapter。
把Flex应用项目中的services-config.xml和messaging-config.xml文件复制到ActiveMQ的webapps/blazeds/WEB-INF/flex目录。
发送消息(示例)
为测试从Flex发送的消息,本文使用了ActiveMQ自带的命令行例子。
为从Flex应用程序中发送一条消息到命令行客户端,您可以在Flex代码中建立一个生产者(producer),然后用不同的参数运行命令行例子,并查看结果。
您需要在Flex应用程序中创建一个生产者来发送消息。
作为一个终点,这个新生产者将使用配置在messaging-config.xml文件中的my-jms-destination。
下面这个例子是一个非常简单的带有消息生产者(producer)的Flex表单:
utf-8"
mx:
Applicationxmlns:
mx="
layout="
absolute"
initialize="
consumer.subscribe()"
Script>
!
[CDATA[
importmx.messaging.messages.IMessage;
importmx.messaging.messages.AsyncMessage;
importmx.messaging.events.MessageEvent;
privatefunctionsendMessage(value:
String):
void
{
varmessage:
IMessage=newAsyncMessage();
message.body=value;
producer.send(message);
}
]]>
/mx:
Producerid="
producer"
channelConnect="
trace('
producerconnected'
)"
destination="
fault="
trace(event.faultDetail)"
VBox>
Form>
FormItemlabel="
Message:
"
TextInputid="
textInput"
FormItem>
Buttonid="
sendButton"
label="
SendMessage"
click="
sendMessage(textInput.text)"
Application>
界面上有一个按钮sendButton,点击此按钮会调用sendMessage()函数。
sendMessage()函数先创建一个AsyncMessage,其是IMessage接口的一个实现,然后使用producer的send()方法发送此消息。
赋值给fault属性的trace()方法会把给定的信息打印到控制台,从而帮助您调试任何可能发生的问题。
验证消息:
运行Flex应用程序;
切换到命令行,运行ActiveMQ自带的消费者(consumer)实例,脚本如下:
$antconsumer-Dtopic=true-Dsubject=MyTopic-Dmax=2
如果你输入框中输入消息,然后点击发送消息按钮,该消息会出现在消费者端的命令行上。
在收到两条消息后,消费者端的命令行例子会自动退出。
接收消息(示例)
要接收JMS消息,您需要构建一个使用JMS终点的消费者(consumer)。
在例子中为简单起见,消费者重用了生产者用来发送消息的终点。
创建消费者的代码大致如下:
Consumerid="
consumer"
consumerconnected'
channelFault="
message="
messageHandler(event)"
...
TextAreaid="
results"
width="
100%"
在<
代码块中处理消息的函数大致如下:
privatefunctionmessageHandler(event:
MessageEvent):
void{
results.text+=event.message.body+"
\n"
;
}
添加了代码后,启动Flex应用程序。
当Flex应用启动后,在命令行运行生产者的例子,脚本如下:
antproducer-Dtopic=true-Dsubject=MyTopic-Dmax=5
消息将出现在Flex的文本框中。
通过REST服务与PHP集成
Web服务是集成PHPWeb应用和Java的方法之一。
RESTWeb服务在Java中作为Servlets以及在PHP中作为脚本实现都比较容易。
REST概述
RESTWeb服务比SOAPWeb服务更为简单,因为RESTWeb服务没有一个标准的消息格式(例如,单个的网页可以是一个RESTWeb服务)。
URL地址就是服务端点(endpoint),而返回的Web页面则是该服务的响应。
编写RESTWeb服务的一个优点是可被多种类型的客户端使用。
RESTWeb服务示例如下,它作为一个JavaServlet,能被其它语言如PHP调用,而无需修改服务。
JavaServlet示例
本例使用了一个简单的JavaServlet来作为RESTWeb服务。
此Servlet处理PUT请求,从PUT请求的内容和各种参数中得到消息,例如:
得到目标对象(JMS终点的名字),此消息是否是一个主题,JMS连接使用的URL等。
packagecom.example.servlets;
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
import.URLDecoder;
importjavax.jms.Connection;
importjavax.jms.DeliveryMode;
importjavax.jms.Destination;
importjavax.jms.MessageProducer;
importjavax.jms.Session;
importjavax.jms.TextMessage;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importorg.apache.activemq.ActiveMQConnection;
importorg.apache.activemq.ActiveMQConnectionFactory;
importorg.apache.activemq.util.IndentPrinter;
publicclassMessageServiceextendsHttpServlet{
privatestaticfinallongserialVersionUID=-8129137144911681674L;
privateDestinationdestination;
privateStringuser=ActiveMQConnection.DEFAULT_USER;
privateStringpassword=ActiveMQConnection.DEFAULT_PASSWORD;
@Override
protectedvoiddoPut(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
Connectionconnection=null;
try{
booleanisTopic="
.equals(request.getParameter("
topic"
));
booleanisPersistent="
persistent"
Stringsubject=request.getParameter("
subject"
);
Stringurl=URLDecoder.decode(request.getParameter("
url"
),"
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PHP 开发者 BlazeDS JMS 指南