专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »PHP教程 » PHP开发者的BlazeDS和JMS指南 第 2部分 »正文

PHP开发者的BlazeDS和JMS指南 第 2部分

来源: 发布时间:星期五, 2010年8月20日 浏览:8次 评论:0
  本系列第1部分主要描述了通过使用BlazeDS将Java服务、PHP以及Adobe Flash Builder用户界面和JMS相集成文章展示了只需区区几处配置改动您就可以使用BlazeDS通过MessageBroker servlet把Flash Builder所建立用户界面和JMS消息队列相连接文章还涉及了整合PHP和Java及JMS种思路方法:使用 REST(Representational State Transfer)Web服务把消息发送到JMS队列

  本系列第2部分则讨论整合PHP和Java另外两个思路方法种思路方法——桥接(bridging)让您可以在PHP中使用Java对象从 PHP中通过Java曝露思路方法把消息发送到JMS消息队列第 2种集成思路方法是利用STOMP(Streaming Text Orientated Messaging Protocol)协议和ActiveMQ(JMS实现的)进行通信当ActiveMQ接收到消息ActiveMQ会把消息放入JMS队列Adobe Flex应用则从队列中接收消息

  通过桥接和PHP集成

  本系列第1部分介绍说明了如何使用BlazeDS和JMS在Java和Flex的间传递消息其他技术也能够完成PHP和Java集成让您间接地把消息放入JMS队列Java/PHP桥就是这些技术它允许您使用已配置好、运行于ActiveMQ上个JMS队列使用Java/PHP桥您可以写PHP脚本来Java类中思路方法此思路方法会把JMS消息放入消息队列Flex用户界面则使用BlazeDS来连接JMS队列从队列中接收消息正如它在REST Web服务中做那样

  PHP/Java桥发布包里面有个JavaBridge.war文件解压此WAR包把解压后文件放进ActiveMQwebapps /JavaBridge目录下并在conf/jetty.xml配置文件中添加此应用此JavaBridge Web应用包含了从PHP脚本接收消息Servlets处理消息然后运行Java类

  Java举例

  由于PHP脚本和Java类的间通信可能会很慢因此需创建个Java类个思路方法中来处理这种做法就是著名Fa?ade设计模式——在所暴露简单思路方法背后隐藏了复杂功能

  下面是Java例子Fa?ade类类名为MessageHelper包名为com.example.bridge

import javax.jms.Connection; 
import javax.jms.DeliveryMode; 
import javax.jms.Destination; 
import javax.jms.MessageProducer; 
import javax.jms.Session; 
import javax.jms.TextMessage; 
 
import org.apache.activemq.ActiveMQConnection; 
import org.apache.activemq.ActiveMQConnectionFactory; 
import org.apache.activemq.util.IndentPrer; 
 
public  MessageHelper { 
   
  private Destination destination; 
  private String user = ActiveMQConnection.DEFAULT_USER; 
  private String password = ActiveMQConnection.DEFAULT_PASSWORD; 
   
  public void sendMessage(String url, String subject, String messageText) { 
     
    Connection connection = null;       
  
    try { 
      boolean isTopic = true; 
      boolean isPersistent = false; 
       
      .out.prln("Using URL: <" + url + ">"); 
      .out.prln("Using Subject: <" + subject + ">"); 
      .out.prln("Sending Message Text: <" + messageText + ">"); 
       
      ActiveMQConnectionFactory connectionFactory =  ActiveMQConnectionFactory(user, password, url); 
      connection = connectionFactory.createConnection; 
      connection.start; 
 
      Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
 
       (isTopic) { 
        destination = session.createTopic(subject); 
      }  { 
        destination = session.createQueue(subject); 
      } 
 
      // Create the producer. 
      MessageProducer producer = session.createProducer(destination); 
       (isPersistent) { 
        producer.DeliveryMode(DeliveryMode.PERSISTENT); 
      }  { 
        producer.DeliveryMode(DeliveryMode.NON_PERSISTENT); 
      } 
 
      TextMessage message = session.createTextMessage(messageText); 
       
      producer.send(message); 
 
      .out.prln("Done."); 
 
      // Use the ActiveMQConnection erface to dump the connection 
      // stats. 
      ActiveMQConnection c = (ActiveMQConnection)connection; 
      c.getConnectionStats.dump( IndentPrer); 
 
    } catch (Exception e) { 
      .out.prln("Caught: " + e); 
      e.prStackTrace; 
    } finally { 
      try { 
        connection.close; 
      } catch (Throwable ignore) { 
      } 
    } 
     
  } 
} 


  此Java类只有个思路方法——sendMessage该思路方法有 3个参数:JMS地URL地址、所使用Topic名及消息内容

  把以上写好类放入个JAR文件中然后把此JAR文件放入JavaBridge Web应用WEB-INF/lib文件夹下面的所以要把该JAR文件放在JavaBridge Web应用类路径(lib目录)下JavaBridge Web应用实际负责例子化JAR包中Java类MessageHelper类思路方法和Web Server是在同个虚拟机中执行——在本例中就是执行Jetty例子和ActiveMQ那个虚拟机

  PHP举例

  下面PHP脚本使用了Java.inc文件它是PHP/Java桥自带文件然后PHP脚本创建Java对象并其思路方法:

<?php 
require_once ("java/Java.inc"); 
 
java_autoload('messageHelper.jar'); 
 
$helper = java('com.example.bridge.MessageHelper'); 
 
$url = 'tcp://localhost:61616'; 
$subject = '/topic/MyTopic/'; 
$message = 'Hello, world!!'; 
 
$helper->sendMessage($url, $subject, $message); 
 
echo "Message sent"; 
?> 


  在PHP脚本中java_autoload思路方法加载JAR文件java思路方法使用Java对象全名来载入Java对象 Java对象加载后PHP脚本通过为Java/PHP桥配置端点SendMessage思路方法

  为Java/PHP桥配置端点需要在java目录java.inc文件中进行配置通过改变端点您可以在区别Web服务器中执行PHP脚本如果您已经有个配置了PHPWeb服务器您可以把该校本放在个Web Document目录下并执行它要让您PHP脚本运行正常您还必须将发布包中java目录放在和PHP脚本相同目录下(查看PHP/Java Bridge以了解详情)

  在上例中桥接只建于PHP和Java的间使得PHP代码可以Java对象而例子中不需要从Java到PHP桥接

  实战例子:用BlazeDS发送和接收消息

  要看实战例子先要启动Flex应用在另个浏览器中运行连接到PHP/Java桥PHP脚本您会在Flex用户界面上看到“Hello, world”消息

  使用STOMP协议和PHP集成

  STOMP是另种技术您可以用它来弥合PHP和ActiveMQ JMS的间鸿沟在这个例子中ActiveMQ使用STOMP协议从PHP脚本接收消息然后把消息路由到JMS TopicFlex应用接收消息并在界面上显示消息

  STOMP概述

  STOMP是个协议它可以使用多种区别客户端发送消息尽管ActiveMQ已内建了对STOMP支持你还是可以使用类似 StompConnect这样STOMP类库和JMS通信

  下面例子介绍说明了如何在ActiveMQ中使用内建STOMP协议支持和STOMP起工作消息代理(message broker)需要在conf/activemq.xml配置文件中打开:

<transportConnectors> 
  <transportConnector name="openwire" uri="tcp://0.0.0.0:61616" /> 
  <transportConnector name="stomp" uri="stomp://0.0.0.0:61613" /> 
</transportConnectors> 


  添加了STOMP代理配置后重启ActiveMQ当ActiveMQ启动时它会把“STOMP连接器已经启动”消息写入日志文件:

  INFO | Connector openwire Started

  INFO | Listening for connections at: stomp://silverstreak.local:61613

  从PHP脚本经由STOMP发送消息被ActiveMQ接收接收到消息被放入JMS主题或JMS队列由相同消费者接收经由STOMP发送消息还使得Flex界面无需修改代码或配置就能接收同样消息在这种方式下利用STOMP将消息发送到ActiveMQ对应用其它部分来说是相当透明

  PHP代码

  您可以使用下面PHP脚本利用STOMP来把消息发送到和前面例子相同MyTopic JMS主题(本文直在使用)代码使用Stomp.php类来自于FuseSourceStomp.php类提供了个从PHP发送消息简单思路方法要使用这个类你必须下载该发布包并将其文件复制到举例脚本相同目录中:

try { 
  //  a library 
  require_once("Stomp.php"); 
  // make a connection 
  $con =  Stomp("tcp://localhost:61613"); 
  // connect 
  $con->connect; 
  // send a message to the queue 
  $con->send("/topic/MyTopic", "Hello, world"); 
  echo "Sent message with body 'test'\n"; 
  $con->disconnect; 
 
} catch (Exception $e) { 
  var_dump($e->getMessage); 
} 
 
?> 


  此代码连接到ActiveMQ服务器61613端口并发送个很短文本消息(“Hello, world”)然后它从STOMP连接器断开连接

  ActiveMQ把消息路由到相应JMS主题Flex应用能够接收到这个消息Flex订阅了此主题

  实战例子

  要看到实战例子请再次打开Flex应用另外打开个浏览器运行您刚才创建PHP脚本“Hello, world”消息将会显示到Flex应用界面上

  使用JNDI

  为简单起见本系列所有例子均直接使用了队列名和主题名(比如:/topic/MyTopic)然而在使用JMS生产环境中JMS主题名或队列名般是使用JNDI(Java Naming and Directory Interface)进行配置而不会采用硬编码方式

  JNDI是个Java标准它允许你抽象JMS队列名、主题名、甚至是主机名实际名称JNDI有点像域名系统(DNS)使您能够使用主机名而不是IP地址来识别主机使用JNDI可以让您随时调整服务器上JMS主题或队列位置和实现而不必修改您代码

  除了抽象主题名和队列名的外JNDI还提供了另个有用功能:能够使用Java EEJMS对象接口来编写代码使用接口而不是具体实现可以使您Java代码不依赖于特定供应商

  看看下面Java代码例子:

javax.naming.Context ctx =  javax.naming.InitialContext; 
javax.jms.ConnectionFactory factory = (javax.jms.ConnectionFactory)ctx.lookup("ConnectionFactory"); 
javax.jms.Connection conn = factory.createConnection; 
javax.jms.Destination destination = (javax.jms.Destination)jndiContext.lookup("MyTopic"); 
javax.jms.Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); 
// send the message... 
javax.jms.MessageProducer producer = session.createProducer(destination); 
javax.jms.TextMessage message = session.createTextMessage; 
message.Text("Hello, world!"); 
producer.send(message); 
conn.close; 


  以上Java代码没有使用ActiveMQConnectionFactory具体实现而是使用了InitialContext对象来“查找(lookup)”指定连接器工厂实现然后代码使用InitialContext对象上相同查询思路方法(lookup)来获取JMS主题引用这样本例代码中就不会包含对ActiveMQ直接引用

  使用JNDI缺点——除了要学习如何在Java代码中使用JNDI的外还需要提供些额外配置以获取JDNI上下文对于前者ActiveMQ提供了个简单JNDI InitialContextFactory以方便使用至于需要额外配置无需修改代码即可在区别厂商提供应用服务器上部署和执行这优点可以抵消掉这瑕疵如果您环境有可能切换到区别供应商您可以考虑使用JNDI来帮助抽象细节

  网络考虑原因

  此集成解决方案提供了PHP和Flex客户端通过Java/JMS技术在网络上进行通信功能您可以把区别内容部署到区别Web服务器在评估集成技术时还需考虑网络访问些原因

  如果在PHP、Flex和Java/JMS服务的间存在防火墙防火墙开放端口可能会影响您选择用于集成思路方法由于BlazeDS是通过 MessageBroker Servlet将Flex界面连接到JMS因此服务器只需标准80端口(或Web应用服务器绑定任何端口)能够访问即可

  ActiveMQ使用非标准端口来监听消息但如果ActiveMQ和BlazeDS作为Web应用服务器运行在同台机器上时端口(“openwire”连接器61616端口)问题只受限于本地接口而不是公开暴露出来

  您Web应用服务器可以在80端口暴露REST Web服务使得跨网络和服务器进行集成相对简单基于这个原因许多人会选择Web Services

  PHP/Java桥使用了部署在JavaBridge Web应用个Servlet通过XML流机制暴露Java类给PHP这个桥接是作为个Servlet安装所以也可以从Web服务器标准端口访问

  但是使用STOMP协议需要在PHP脚本和(ActiveMQ)STOMP消息代理的间开放个非标准端口上面例子中开放端口是 61613端口如果限制了从网络访问这个端口那么STOMP或许并不是集成PHP脚本、Flex界面及Java/JMS服务个好解决方案



  小结

  JMS是个消息传递服务支持主题和队列其很多特性使其成为稳定消息传递个很好选择BlazeDS使得您无需付出很多工作量即可让Flex应用从Flex客户端发送消息到JMS

  本系列第1部分介绍了JMS消息传递并示范了如何配置BlazeDS和JMS队列进行通信文章还介绍了使用Java实现REST Web服务来集成PHP应用和JMS思路方法让您Flex用户界面可以从PHP脚本收到消息

  本文则介绍了从PHP发送消息到JMS主题或队列另外两种思路方法PHP/Java Bridge是个开源项目提供了个从PHP脚本Java类框架通过编写单个Java类——即所谓Fa?ade模式PHP脚本就能够将消息发送到JMS并且从Flex界面接收到此消息STOMP是个协议它有多种语言支持库利用STOMP您可以在Flex应用中和JMS 消息代理通信并接收消息

  总的这些区别技术提供了整合PHP、Flex或Java 应用区别选项整合现有应用而不是重新开发它们可以节省您时间和精力而且您也能自由选择适合您需要最佳实现



标签:
0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: