通过 Applet使用BEA WebLogic JMS

简介
以下是设置及运行使用JMS的applet所涉及的各个领域的配置示例和文档指南。本文只是简单地演示了如何在applet中使用JMS,其中包括使用异步JMS消费者、AWT GUI、普通和瘦客户端jars、Java Web Start、applet viewer等等。
本例子假定读者正在使用标准的WebLogic Server 8.1,并安装在D驱动器的D:\bea目录 中。这篇指南是针对Windows的(在其它操作系统上路径和命令会有些许不同)。

关于在WebLogic Server上使用applet的文档请参见 http://e-docs.bea.com/wls/docs81/applets/index.html
用WLS 8.1 GA 和8.1 SP1运行这个例子会有一些问题;请参见 附件4

Java Plug-in
applets的推荐运行方法是通过Java Plug-In在浏览器中运行。"这可以保证在任何支持 plug-in的浏览器中都是一致的,也就是说您的applet具备了兼容性和可靠性。plug-in还使您能够方便地判断客户端使用的是哪种JRE"。想要了解更多plug-in的知识,请访问http://www.java.sun.com/products/plugin/index.html (该页面中还可以找到许多关于开发applet的链接)。Plug-In作为Java运行时环境(JRE)的一部分被安装。WebLogic Server 8.1需要JRE 1.4.1.03--请参见前面网页中的安装指南。

协议和术语
为了帮助理解本文后面的部分,本节介绍了一些协议及相关术语。
WebLogic Server通过远程方法调用(RMI)在Java虚拟机(JVMs)之间进行通信。在本指南中,RMI被用于applet和服务器之间的通信。
RMI可以使用多种有线协议。对WebLogic Server来说,效率和扩展性最好的协议是t3。如果没有其它限制,t3将是您使用的默认协议。按照"t3://hostname:7001/…"这样的格式指定一个初始化上下文URL就可以使用t3协议了。
您可能需要使用HTTP隧道(tunneling),它会把所有消息包装到HTTP中。这使得消息可以轻松地穿过防火墙,因为大多防火墙被配置成允许HTTP协议通过。此时,URL的格式是"http://hostname:7001/…"。使用HTTP隧道(tunneling)协议您将付出性能上的代价,所以请在真正需要的时候才用它。
WebLogic Server8.1中可以运行标准jar或客户端jar。标准jar,即weblogic.jar包含运行WebLogic Server的所有软件并提供完整的功能(既有客户端功能也有服务器功能)。不过它的文件比较大(超过37MB)。该文件适用于服务器端应用程序,在applet中使用它将会导致下载一个很大的文件。客户端jar要小的多。基本客户端jar ,wlclient.jar大约300 KB大小。带有JMS支持的扩展jar,wljmsclient.jar大约400KB大小。它可以被用于只带有某些客户端功能限制的(不支持JDBC 和JMX)较小的客户端应用范围。为了运行客户端jar,必须使用基于Internet Inter-ORB协议(IIOP协议)。此时,URL的格式是"iiop://hostname:7001/…" ,客户端jar十分智能足以把 "t3:" 或 "http:" 自动转换成IIOP 协议(所以不必修改程序)。更多信息请参见WebLogic JMS程序设计中的WebLogic JMS 瘦客户端
另外一种选择是采用安全套接层(SSL)。为此URL前缀中必须含有一个"s"后缀,例如"t3s"、 "iiops"、 或 "https"。本指南没有深入讨论如何配置系统使用SSL。更多相关信息请参见http://e-docs.bea.com/wls/docs81/security/SSL_client.html#1046397

运行示例服务器
本指南多处都需要运行WebLogic Server示例服务器。通过以下开始菜单链接您可以运行它:
程序/BEA WebLogic Platform 8.1/Examples/Weblogic Server Examples/Launch WebLogic Server Examples

WebLogic 服务器配置
为了使用JMS和一些可能需要使用的协议,需要对WebLogic Server 配置进行一些修改。通过使用控制台(推荐)或直接编辑配置文件可以进行这样的修改。
想要使用控制台,请按照前面提到的方法启动示例服务器。然后使用以下URL并输入您的用户名和密码(默认是weblogic/weblogic)从而在Web浏览器中运行控制台:
http://localhost:7001/console
首先,您可能希望为服务设置一个单独的监听地址,即服务器用来监听进入连接的IP地址和DNS名称。如果在多宿主机器上运行服务器,您需要对此进行配置。对本指南来说更为重要的是:如果使用IIOP协议您就需要对此进行配置。
1. 在右边面板上,选择Domains Configuration下的Servers。
2. 从表格中选择 "examplesServer" 并选择 General 选项卡。
3. 在Listen Address框中,输入计算机的DNS名称或者计算机的地址。
4. 为了使设置生效您需要重启服务器,当然也可以先完成其它配置任务。
您可能需要使用HTTP隧道(tunneling)协议。
1. 在examplesServer 页中选择Protocols 选项卡。
2. 单击Advanced Options Show链接。
3. 选择"Enable Tunneling"。
4. 单击Apply。
修改配置来定义JMS服务器以及applet将要用到的JMS队列,这样就配置好了WebLogic Server 使其能够和JMS一起工作。
1. 单击右上角的home图标,返回控制台主页面。
2. 在页面右边,选择JMS下的Servers。
3. 选择Configure a New JMS Server。
4. 输入TestJMSServer作为Name。
5. 单击Create。
6. 选择 examplesServer作为Target。
7. 单击Apply。
8. 单击Configuration选项卡。
9. 单击底部的Configure Destinations。
10. 单击Configure a New JMS Queue。
11. 输入TestQueue1作为Name。
12. 输入 jms.queue.TestQueue1作为JNDI Name。
13. 单击Create。
控制台配置结束。如果修改了监听地址,请关闭并重启WebLogic服务器。

使用标准8.1安装版,请执行以下命令直接修改config.xml文件(假定我们使用现有示例的配置):
cd D:\bea\weblogic81\samples\domains\examples
为了创建JMS服务器和队列,请在最后一行之前插入:

<JMSServer Name="TestJMSServer" Targets="examplesServer" >
  <JMSQueue Name="TestQueue1" JNDIName="jms.queue.TestQueue1" />
</JMSServer>

想要设置监听地址,请修改<Server 成为 <Server ListenAddress="MYhostname"。

想要激活HTTP隧道,请修改<Server 成为 <Server TunnelingEnabled="true"。

设置Applet
接着,设置运行applet所需的HTML、class、和jar文件:
cd D:\bea\weblogic81\samples\server\examples\build\examplesWebApp
这是作为Web服务器运行的WebLogic Server的文档根目录,在控制台主页右边的Web Application Modules下可以找到它。在config.xml文件中修改下面的web应用条目可以对其进行修改:

<Application Deployed="true" Name="examplesWebApp"
  Path="D:\bea\weblogic81\samples\server\examples\build"
  TwoPhase="true">
  <WebAppComponent Name="examplesWebApp"
   Targets="examplesServer" URI="examplesWebApp"/>
</Application>

本指南中不必对其进行修改。

如果使用标准jar,需要使weblogic.jar可用,请把它复制到以下目录中(在HTML文件中定义CODEBASE就不需要复制了,但复制这个方法也很好用,请把jar文件放到和HTML、applet类文件相同的目录下):
  copy D:\bea\weblogic81\server\lib\weblogic.jar
注意:weblogic.jar 需要的文件清单包括了许多应用要用到的jar文件(目前,列表包括common/perf/java/AgtMX.jar、common/perf/java/dirig.jar、common/perf/java/dsJMX.jar、EccpressoAsn1.jar、 EccpressoCore.jar、EccpressoJcae.jar、ant/ant.jar、ant/jakarta-oro-2.0.4.jar、ant/optional.jar、 ojdbc14.jar、 webservices.jar、wlbase.jar、wlcipher.jar、WebLogic Serverqlserver.jar、wlutil.jar和xmlx.jar)。它们将会引起Java控制台上显示file-not-found errors错误。但它们并不阻碍applet运行,除非applet的确引用到了这些jar文件中的某些东西;这种情况下,请复制所需的jar文件。

为测试applet 而创建的HTML文件:applet.htm;请参见附件 1。

OBJECT 标签(使用CLASSID、CODEBASE、和type值) 用于IE 4.X 及更高版本,EMBED 标签 (使用type和plugins page值)用于在Netscape中定义Java plug-in。applet由CODE 值定义。ARCHIVE 值使得 weblogic.jar 中的类可用。appletviewer文档 中提供了一些这方面的实用信息。 本例使用1.4.1.03 版的plug-in (注意:codebase 目录,Version、甚至 classid 都依赖于版本)。

生成Applet1.java;请参见 附录2。 使用javac Applet1.java命令进行编译。注意:这个applet对JMS连接工厂、JMS队列名称等采取了硬编码,比如协议被硬编码为"t3:",您也可以传递它们到HTML中的applet。这个Applet含有一个文本字段,用户可以在里面输入一行数据。单击回车之后,文本将被发送到JMS队列。Applet被设置成异步从JMS队列中接收消息。收到消息后将其添加到一个文本域中从而记录所有接收到的消息。它十分简单,但足以演示如何在applet中使用JMS。

运行Applet
按照前面提到的方法启动WebLogic ServerExamples server。通过http://hostname:7001/examplesWebApp/applet.htm可以访问这个applet。

使用WebLogic Server瘦客户端
另外一种方式是运行瘦客户端。这是运行applet的推荐方式,因为它显著降低了applet启动时需要下载的jar的大小。修改applet.htm 中的 "weblogic.jar" 为 "wlclient.jar, wljmsclient.jar"并复制这两个jar文件(要小的多)到根目录替换 weblogic.jar。

像上面那样再运行一次applet。下载jar文件的过程将会快很多。

使用Appletviewer
如果想要用appletviewer测试applet,请确保在PATH中已安装了JRE。如果机器上装了WebLogic Server只需简单执行以下命令即可:
  cd D:\bea\weblogic81\config\mydomain
  setExamplesEnv.cmd
然后,使用指向Web服务器的URL运行applletviewer。
  appletviewer http://hostname:7001/examplesWebApp/applet.htm

其它配置项目

如果不想在URL中指定 ":7001",请在server部分定义ListenPort="80" ,并在Applet1.java中把":7001" 修改为 ":80",这样就修改了配置使其使用标准的80端口。

想要使用HTTP隧道(tunneling)协议,请把Applet1.java中的URL从t3: 修改为http: ,并在WebLogic Server上激活它(如同前面提到的那样)。

使用Java Web Start
"Java Web Start是一个Web浏览器的辅助应用程序。当用户点击一个特殊启动文件(JNLP 文件)链接的时候,浏览器会启动Java Web Start,它将自动下载、缓冲、并运行特定的基于Java技术的应用。Java Web Start启动的应用在本地进行缓冲,因此一个已下载的应用可以和普通安装应用一样被启动。"更多信息请参见http://java.sun.com/products/javawebstart/developers.html

想要使用Java WebStart运行applet,您需要创建一个JNLP文件;请参见附件 3。在examplesWebApp(根目录)中把该文件保存为 applet.jnlp 。执行以下命令为applet创建一个jar文件:
  jar -cvf Applet1.jar Applet1.class
在浏览器中运行:
  http://hostname:7001/examplesWebApp/applet.jnlp

附件 1: applet.htm
<html>
<head>
  <title>Applet sample</title>
</head>

<body>
<h1>Applet Sample</h1>

<hr>

<!--"CONVERTED_APPLET"-->
<!-- HTML CONVERTER -->
<OBJECT
  classid = "clsid:CAFEEFAC-0014-0001-0003-ABCDEFFEDCBA"
  codebase = "http://java.sun.com/products/plugin/autodl/jinstall-
1_4_1_03-windows-i586.cab#Version=1,4,1,3"
  WIDTH = 600 HEIGHT = 300 >
  <PARAM NAME = CODE VALUE = Applet1.class >
  <PARAM NAME = ARCHIVE VALUE = "weblogic.jar">
  <PARAM NAME = "type" VALUE = "application/x-java-applet;jpiversion=
1.4.1.03">
  <PARAM NAME = "scriptable" VALUE = "false">

 <COMMENT>
  <EMBED
   type = "application/x-java-applet;jpi-version=1.4.1.03" \
   CODE = Applet1.class \
   ARCHIVE = "weblogic.jar"
   WIDTH = 600 \
   HEIGHT = 300 \
   scriptable = false \
   pluginspage =
"http://java.sun.com/products/plugin/index.html#download">
   <NOEMBED>
   alt="Your browser understands the <APPLET> tag but isn't
running the applet, for some reason."
   Your browser is completely ignoring the <APPLET> tag!
   </NOEMBED>
  </EMBED>
 </COMMENT>
</OBJECT>

<!--
<APPLET CODE = Applet1.class ARCHIVE = "weblogic.jar" WIDTH = 600
HEIGHT = 300>
alt="Your browser understands the <APPLET> tag but isn't running
the applet, for some reason."
   Your browser is completely ignoring the <APPLET> tag!
</APPLET>
-->
<!--"END_CONVERTED_APPLET"-->
</body>
</html>


附件 2: applet1.java
import java.awt.*;
import java.applet.*;
import java.net.*;
import java.util.*;
import javax.naming.*;
import javax.jms.*;

public class Applet1 extends Applet implements MessageListener {
  private boolean started = false;

// JMS Stuff
private InitialContext jmsContext = null;
private QueueConnectionFactory jmsConnFactory = null;
private QueueConnection jmsConnection = null;
private Queue jmsQueue = null;
private QueueSession jmsSession = null;
private QueueSender jmsSender = null;
private QueueReceiver jmsReceiver = null;

// init - called to inform this applet that it has been
// loaded into the system
public void init() {
  // Initialize Controls
  setLayout(null);
  setSize(426,266);
  jmslabel.setText("JMS Applet");
  add(jmslabel);
  jmslabel.setBounds(144,12,148,24);
  textArea1.setEnabled(false);
  add(textArea1);
  textArea1.setBounds(24,36,375,100);
  jmsleaveButton.setLabel("Leave");
  add(jmsleaveButton);
  jmsleaveButton.setBackground(java.awt.Color.lightGray);
  jmsleaveButton.setBounds(312,240,78,20);
  add(jmsMessageField);
  jmsMessageField.setBounds(24,168,367,38);
  //}}

  initJMS();
}

// Declare Controls
java.awt.Label jmslabel = new java.awt.Label();
java.awt.TextArea textArea1 = new java.awt.TextArea();
java.awt.Button jmsleaveButton = new java.awt.Button();
java.awt.TextField jmsMessageField = new java.awt.TextField();

// getAppletInfo - Returns information about this applet.
public String getAppletInfo() {
return "JMS Applet\r\n";
}

// destroy - called to inform this applet that it is being
// reclaimed and that it should destroy any resources that
// it has allocated.
public void destroy() {
  try {
   if(started) {
    if (jmsConnection != null) {
      jmsConnection.stop();
      jmsConnection = null;
     }
   started = false;
   stop();
   }
 }
 catch(Exception e) {
 }
}

// start - called to inform this applet that it should start its
execution
 public void start() {
  if(!started) {
    started = true;
    }
}

// stop - Called to inform this applet that it should stop its
execution
 public void stop() {
  textArea1.setEnabled(false);
  jmsMessageField.setEnabled(false);
}

// action - handles entering message, Leave button clicked
public boolean action(Event evt, Object obj) {
  if(evt.id == Event.ACTION_EVENT) {
   if(obj.equals(jmsMessageField.getText())) {
    sendData(jmsMessageField.getText());
    jmsMessageField.setText("");
    return true;
   }
if(obj.equals(jmsleaveButton.getLabel())) {
  destroy();
 }
}
  return true;
}

// initJMS - initialize all of the JMS stuff
private void initJMS() {
 try {
  String hostName = this.getCodeBase().getHost();
  Hashtable env = new Hashtable();
  env.put(Context.PROVIDER_URL,
   "t3://" + hostName + ":7001");
  env.put(Context.INITIAL_CONTEXT_FACTORY,
   "weblogic.jndi.WLInitialContextFactory");
  jmsContext = new InitialContext(env);
  jmsConnFactory =(QueueConnectionFactory)
   jmsContext.lookup("javax.jms.QueueConnectionFactory");
  jmsConnection = jmsConnFactory.createQueueConnection();
  jmsSession = jmsConnection.createQueueSession(false,
   Session.AUTO_ACKNOWLEDGE);
  jmsQueue =(Queue)jmsContext.lookup("jms.queue.TestQueue1");
  jmsConnection.start();
  jmsSender = jmsSession.createSender(jmsQueue);
  jmsReceiver = jmsSession.createReceiver(jmsQueue);
  jmsReceiver.setMessageListener(this);
 }
 catch(Exception e) {
  e.printStackTrace();
  System.out.println("Initialization failed");
 }
}

// sendData - sends a message
void sendData(String data) {
 try {
   TextMessage message = jmsSession.createTextMessage();
   message.setText(data);
   jmsSender.send(message);
  }
  catch(Exception e) {
   System.out.println("Failed to send message");
  }
 }

// onMessage - asynchronously receives a message
public void onMessage(Message message) {
String data;
try {
  data = ((TextMessage)message).getText();
  textArea1.append(data + "\n");
  repaint();
}
catch(Exception e) {
  System.out.println("Failed to receive message");
  }
 }
}


附件 3: applet.jnlp
<?xml version="1.0" encoding="utf-8"?>
<!-- JNLP File for Demo Applet -->
<jnlp
  spec="1.0+"
  codebase="http://localhost:7001/examplesWebApp"
  href="applet.jnlp">
 <information>
  <title>Demo Applet</title>
  <vendor>BEA Systems, Inc.</vendor>
  <description>Demo Applet</description>
  <description kind="short">Demo.</description>
  <offline-allowed/>
 </information>
 <resources>
  <j2se version="1.4"/>
  <jar href="Applet1.jar"/>
  <jar href="weblogic.jar"/>
 </resources>
 <applet-desc name="Applet1" main-class="Applet1" width="600"
height="300"/>
</jnlp>

附件 4: 已知问题
1. CR109268 - 在8.1 GA 上使用t3或http、以及weblogic.jar,该例子不能正常运行。这个错误在8.1SP1中已经被修正。问题的症状是在AssertionError 中嵌套着一个java.lang.NoClassDefFoundError。
2. CR111935 - 在8.1 GA 上使用http 隧道和瘦客户端,该例子不能正常运行。 第一个条目似乎消失了,第二个条目导致applet和Java控制台挂起。消息到达了服务器,但applet没有收到异步返回消息。
3. CR111518 - 在8.1 SP1上使用IIOP和瘦客户端,该例子不能正常运行。第一个条目似乎消失了,第二个条目导致applet和Java控制台挂起。消息到达了服务器,但applet没有收到异步返回消息。针对此问题有一个临时补丁CR111518_810sp1.jar,想要在8.1SP1上使用这个临时补丁,请像下面这样修改applet的HTML文件:
ARCHIVE VALUE="CR111518_810sp1.jar,wlclient.jar,wljmsclient.jms"
ARCHIVE="CR111518_810sp1.jar,wlclient.jar,wljmsclient.jar"


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值