- 浏览: 273854 次
文章分类
最新评论
-
yonghuuser:
< namespace > http://www. ...
使用 xfire 开发 web service 应用 -
悬空90:
牛人 呵呵
JCS 资料 -
悬空90:
谢谢分享 呵呵
JCS 应用 -
kuiye:
用于在客户端页面调用.
DWR util.js 整理(DWR 处理各种form表单Select/option,table等,List,Bean -
bo_hai:
好像不是原创呢!
抽象类与接口的区别
文章来源……IBM 中国
介绍
在这一节中,我们将查看两个进行 JMS 客户机消息接发的程序——Sender.java 和 Receiver.java。
Sender
:提示输入 JNDI 名
所有示例程序都是命令行程序,它们用 System.in
进行输入,用System.out
进行输出。
Sender
类有两个方法:main(String[])
和 send()
。main(String[])
方法只是举例说明了 Sender
并调用了它的 send()
方法。 send()
方法的第一部分提示了将用来发送消息的受管理对象的 JNDI 名。
- import java.io.*;
- import javax.jms.*;
- import javax.naming.*;
- public class Sender {
- public static void main(String[] args) {
- new Sender().send();
- }
- public void send() {
- BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
- try {
- //Prompt for JNDI names
- System.out.println("Enter ConnectionFactory name:");
- String factoryName = reader.readLine();
- System.out.println("Enter Destination name:");
- String destinationName = reader.readLine();
- . . .
Sender
:查询管理对象
send()
方法的下一部分用前面输入的名字在 JNDI 中查询受管理的对象。Sender
:创建 JMS 对象
通过举例说明 InitialContext
对象访问了 JNDI,通过调用 lookup(String)
方法并传递要获取的对象的名字来检索受管理的对象。注意, lookup(String)
方法返回 Object
,所以必须对返回的对象进行类型强制转换(typecast)。
- . . .
- //Look up administered objects
- InitialContext initContext = new InitialContext();
- ConnectionFactory factory =
- (ConnectionFactory) initContext.lookup(factoryName);
- Destination destination = (Destination) initContext.lookup(destinationName);
- initContext.close();
- . . .
现在,我们创建了发送消息所需要的 JMS 对象。注意,我们不用直接使用 new
举例说明这些对象。所有对象都是通过调用另一个对象的方法创建的。
首先,用 ConnectionFactory
创建一个 Connection。然后我们用这个 Connection
创建一个 Session
。
Session
没有被处理(false
) 并且它将使用自动确认(Session.AUTO_ACKNOWLEDGE
)。
最后,创建 Sender
,向从 JNDI 中检索的 Destination
发送消息。
- . . .
- //Create JMS objects
- Connection connection = factory.createConnection();
- Session session =
- connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
- MessageProducer sender = session.createProducer(destination);
- . . .
Sender
:发送消息
现在我们已经可以发送消息了。在这一部分,我们进入一个循环,它提示了要发送消息的文本。如果用户输入 quit,就可以从循环就退出。
否则要在输入文本中建立一个 TextMessage
,用 MessageProducer
发送消息,然后返回到循环的开始部分。
- . . .
- //Send messages
- String messageText = null;
- while (true) {
- System.out.println("Enter message to send or 'quit':");
- messageText = reader.readLine();
- if ("quit".equals(messageText))
- break;
- TextMessage message = session.createTextMessage(messageText);
- sender.send(message);
- }
- . . .
Sender
:退出
退出循环后,关闭 Connection
。关闭Connection
会自动关闭 Session
和 MessageProducer
。
- . . .
- //Exit
- System.out.println("Exiting...");
- reader.close();
- connection.close();
- System.out.println("Goodbye!");
- } catch (Exception e) {
- e.printStackTrace();
- System.exit(1);
- }
- }
Receiver
:提示输入 JNDI 的名称并查找受管理的对象
Receiver
类与 Sender
类非常类似,都有一个 main(String[])
方法,它只是举例说明了 Receiver
并调用它的主要方法 receive()
。
提示输入 JNDI 的名称并查找受管理对象的代码与 Sender
中的代码完全一样。
不过,在这个类中有两处不一样的地方:
boolean stop
实例变量用来指出程序应该退出。
Receiver
实现了MessageListener
接口,为了异步接收消息。
- import java.io.*;
- import javax.jms.*;
- import javax.naming.*;
- public class Receiver implements MessageListener {
- private boolean stop = false;
- public static void main(String[] args) {
- new Receiver().receive();
- }
- public void receive() {
- BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
- try {
- //Prompt for JNDI names
- System.out.println("Enter ConnectionFactory name:");
- String factoryName = reader.readLine();
- System.out.println("Enter Destination name:");
- String destinationName = reader.readLine();
- reader.close();
- //Look up administered objects
- InitialContext initContext = new InitialContext();
- ConnectionFactory factory =
- (ConnectionFactory) initContext.lookup(factoryName);
- Destination destination = (Destination) initContext.lookup(destinationName);
- initContext.close();
- . . .
Receiver
:创建 JMS 对象
像在 Sender
中那样创建Connection
和 Session
,然后创建一个 MessageConsumer
。
接着,调用 setMessageListener()
,传递 Receiver
——本地实例 this
,您会重调用它来实现 MessageListener
接口。
最后,启动 Connection
,允许接收消息。
- . . .
- //Create JMS objects
- Connection connection = factory.createConnection();
- Session session =
- connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
- MessageConsumer receiver = session.createConsumer(queue);
- receiver.setMessageListener(this);
- connection.start();
- . . .
Receiver
:等待 stop
并退出
接着,程序进入一个循环,循环会在 stop
变量变为 true 时退出。在循环中,线程睡眠一秒钟。一旦退出循环, Connection
就会关闭,程序会终止。
- . . .
- //Wait for stop
- while (!stop) {
- Thread.sleep(1000);
- }
- //Exit
- System.out.println("Exiting...");
- connection.close();
- System.out.println("Goodbye!");
- } catch (Exception e) {
- e.printStackTrace();
- System.exit(1);
- }
- }
- . . .
Receiver
:onMessage(Message)
方法
需要包含 Receiver
类的 onMessage(Message)
方法,因为 Receiver
可以实现 MessageListener
接口。 收到消息时,就调用这个方法,并将 Message
作为参数传递。
在我们的实现中,我们得到消息的文字内容并将它打印到 System.out
。然后检查消息是否等于 stop,如果是,那么就将 stop
变量设置为 true
,这会使 receive()
方法中的循环终止。
- . . .
- public void onMessage(Message message) {
- try {
- String msgText = ((TextMessage) message).getText();
- System.out.println(msgText);
- if ("stop".equals(msgText))
- stop = true;
- } catch (JMSException e) {
- e.printStackTrace();
- stop = true;
- }
- }
- }
返回程序
如开始中所述,编译 Sender
和 Receiver
程序需要 javax.naming
和 javax.jms
包。
在运行这个程序之前,需要使用 JMS 提供者提供的管理工具创建受管理对象 ConnectionFactory
和 Destination
,并将它们放到 JNDI 名字空间中。
还需要保证提供者的 JMS 实现类存在于 classpath 中。
然后,可以同时运行这两个程序,为 ConnectionFactory
和 Destination
提供同样的 JNDI 名称,并从 Sender
向 Receiver
发送消息。
最后附上Sender.java 和 Receiver.java
Sender.java
- import java.io.*;
- import javax.jms.*;
- import javax.naming.*;
- public class Sender {
- public static void main(String[] args) {
- new Sender().send();
- }
- public void send() {
- BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
- try {
- //Prompt for JNDI names
- System.out.println("Enter ConnectionFactory name:");
- String factoryName = reader.readLine();
- System.out.println("Enter Destination name:");
- String destinationName = reader.readLine();
- //Look up administered objects
- InitialContext initContext = new InitialContext();
- ConnectionFactory factory =
- (ConnectionFactory) initContext.lookup(factoryName);
- Destination destination = (Destination) initContext.lookup(destinationName);
- initContext.close();
- //Create JMS objects
- Connection connection = factory.createConnection();
- Session session =
- connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
- MessageProducer sender = session.createProducer(queue);
- //Send messages
- String messageText = null;
- while (true) {
- System.out.println("Enter message to send or 'quit':");
- messageText = reader.readLine();
- if ("quit".equals(messageText))
- break;
- TextMessage message = session.createTextMessage(messageText);
- sender.send(message);
- }
- //Exit
- System.out.println("Exiting...");
- reader.close();
- connection.close();
- System.out.println("Goodbye!");
- } catch (Exception e) {
- e.printStackTrace();
- System.exit(1);
- }
- }
- }
Receiver.java
- import java.io.*;
- import javax.jms.*;
- import javax.naming.*;
- public class Receiver implements MessageListener {
- private boolean stop = false;
- public static void main(String[] args) {
- new Receiver().receive();
- }
- public void receive() {
- BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
- try {
- //Prompt for JNDI names
- System.out.println("Enter ConnectionFactory name:");
- String factoryName = reader.readLine();
- System.out.println("Enter Destination name:");
- String destinationName = reader.readLine();
- reader.close();
- //Look up administered objects
- InitialContext initContext = new InitialContext();
- ConnectionFactory factory =
- (ConnectionFactory) initContext.lookup(factoryName);
- Destination destination = (Destination) initContext.lookup(destinationName);
- initContext.close();
- //Create JMS objects
- Connection connection = factory.createConnection();
- Session session =
- connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
- MessageConsumer receiver = session.createConsumer(queue);
- receiver.setMessageListener(this);
- connection.start();
- //Wait for stop
- while (!stop) {
- Thread.sleep(1000);
- }
- //Exit
- System.out.println("Exiting...");
- connection.close();
- System.out.println("Goodbye!");
- } catch (Exception e) {
- e.printStackTrace();
- System.exit(1);
- }
- }
- public void onMessage(Message message) {
- try {
- String msgText = ((TextMessage) message).getText();
- System.out.println(msgText);
- if ("stop".equals(msgText))
- stop = true;
- } catch (JMSException e) {
- e.printStackTrace();
- stop = true;
- }
- }
- }
----------==========================__END__============================================------------------
发表评论
-
JMS参考资料
2007-10-22 10:16 2107文章来源(IBM中国) 参 ... -
Java Message Service Pub/sub 编程
2007-10-22 10:11 1422文章来源(IBM中国) 相 ... -
Java Message Service Pub/sub 接口
2007-10-22 10:05 14031、介绍 (文章来源 IBM中国) 现在让我们来查看 Pub/ ... -
Java Message Service 点对点编程
2007-10-22 09:32 3128文章来源(IBM中国) 1、介绍 在这一节中,我们将分析两个进 ... -
Java Message Service 点对点接口
2007-10-19 15:35 1545文章来源 (IBM 中国) 介 ... -
JMS 1.1 中的新内容:共用接口
2007-10-19 14:21 1266介绍 在这一节中,我们将介绍 JMS 客户机编程的每一个重要 ... -
Java Message Service 概述和体系结构
2007-10-19 12:09 1856文章来源……IMB中国 ... -
Java Message Service 介紹
2007-10-19 11:50 1662...
相关推荐
3. 通讯及逻辑可编程功能:用户可以应用Autoshop软件通过USB接口对模块进行编程设置,可以修改通讯协议及逻辑控制等。 4. 掉电上报功能:当设备外部供电中断后,设备自动上报掉电事件到指定服务器,并保存该事件到...
- **设计方法**:使用WinPcap或WinSock编程中的原始套接字来实现数据捕获。 - **主要流程**: 1. 通过交换机的镜像端口或分光器获取局域网中的网络流量。 2. 捕获并存储这些流量数据。 3. 对捕获的数据进行过滤,...
8. 客户机/服务器结构:在C/S架构中,客户机是发起请求的一方,服务器则是处理请求的一方。 9. SQL查询:在SQL查询中,使用And运算符可以指定范围查询,如B选项所示,可以找出60到80分之间(包括60分)的成绩。 10...
这表示用户可以在他们的应用中使用单芯片实现以太网应用,通过简单的Socket编程就能完成。 W5500内部集成了32K字节的片上缓存,支持8个硬件Socket进行独立通讯,这使得W5500能够同时处理多个网络连接任务。用户可以...
- **TERADATA数据库的编程接口**:介绍Teradata数据库提供的编程接口,包括调用层接口CLI、嵌入式预处理器和ODBC等。 - **TERADATA应用工具**:提供了一系列应用工具,如BTEQ、FastLoad、MultiLoad、FastExport和...
2、开发注重交互的简单应用程序可以使用对话框为基础的窗口,如果文件读写简单这可利用CFile进行。 3、开发注重交互并且文件读写复杂的的简单应用程序可以利用以CFormView为基础视的单文档视结构。 4、利用对话框...
提供类似于操作系统的服务,包括硬件抽象描述、底层驱动程序管理、共用功能的执行、程序间消息传递、程序发行包管理,它也提供一些工具和库用于获取、建立、编写和执行多机融合的程序。 ROS的运行架构是一种使用ROS...