ConnectionFactory 是一个可以从JNDI检索的受管理对象,它建立了到提供者的连接。它包含 createConnection() 方法,该方法返回了一个 Connection 对象。
Connection 封装了一个连接到提供者的活动连接。它的一些方法包括:
createSession(boolean, int):返回一个 Session 对象。boolean 参数指出 Session 是否被处理, int 则指出确认模式(请参阅 确认)。
start():激活提供者发送消息。
stop():临时停止消息的发送,可以用 start() 重新开始发送。
close():关闭到提供者的连接,并释放以它的名义占用的所有资源。
Session 是用来发送和接收消息的单线程的上下文。它的一些方法包括:
createProducer(Destination):返回一个 MessageProducer 对象,向指定的 Destination 发送消息。
createConsumer(Destination):返回一个 MessageConsumer 对象来接收来自指定 Destination 的消息。
commit():提交当前事务的所有使用的或者产生的消息。
rollback():回滚当前事务所有使用的或者产生的消息。
create<MessageType>Message(...):一组返回 <MessageType>Message 的方法——例如,MapMessage、TextMessage 等。
Destination 封装消息的目的地。它是一个从 JNDI 检索的受管理对象。
MessageProducer 用于发送消息。它的一些方法包括:
send(Message):发送指示的 Message。
setDeliveryMode(int):设置后续消息的发送模式,有效值为 DeliveryMode.PERSISTENT 和 DeliveryMode.NON_PERSISTENT。
setPriority(int):设置后续发送消息的优先级,有效值为 0 到 9。
setTimeToLive(long):设置后续发送消息失效前的持续时间,以毫秒计。
MessageConsumer 被用来接收消息。它的一些方法包括:
receive():返回下一发到达的消息,该方法在消息可用之前会受到阻塞。
receive(long):接收在 long 毫秒内到达的下一个消息,如果在时间限制内没有消息到达,则该方法返回 null。
receiveNoWait:如果有一个消息立即可用,则接收下一个消息,如果没有消息可用,则该方法返回 null。
setMessageListener(MessageListener):设置 MessageListener,MessageListener 对象在消息到达时接收它们,也就是异步接收(请参阅 MessageListener )。
MessageListener 是有一个单一方法——onMessage(Message)——的接口,它提供了消息的异步接收和处理。
应该通过客户机类和该类使用 setMessageListener(MessageListener) 方法传递给 MessageConsumer 对象的实例来实现这个接口。在消息到达目的地时,用 onMessage(Message) 将它传递给对象。
例子:
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);
}
}
}
Sender 类有两个方法:main(String[]) 和 send()。main(String[]) 方法只是举例说明了 Sender 并调用了它的 send() 方法。
send() 方法的第一部分提示了将用来发送消息的受管理对象的 JNDI 名。
send() 方法的下一部分用前面输入的名字在 JNDI 中查询受管理的对象。
通过举例说明 InitialContext 对象访问了 JNDI,通过调用 lookup(String) 方法并传递要获取的对象的名字来检索受管理的对象。注意, lookup(String) 方法返回 Object,所以必须对返回的对象进行类型强制转换(typecast)。
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;
}
}
}
boolean stop 实例变量用来指出程序应该退出。
Receiver 实现了 MessageListener 接口,为了异步接收消息
分享到:
相关推荐
#### JMS 公共接口 - **JMSConnection**:创建连接。 - **JMSSession**:生产和消费消息的上下文。 - **MessageProducer**:创建并发送消息。 - **MessageConsumer**:接收消息。 - **Message**:消息实体。 - **...
2. **定义接口**:定义一个公共接口,比如`CheckingAccountService`,其中包含需要远程调用的方法。这个接口将在客户端和服务端都需引用。 3. **实现接口**:在服务端,我们需要实现这个接口,例如`...
JMS规范还定义了公共工具,比如连接工厂(ConnectionFactory)、目的地(Destination)和连接(Connection)。连接工厂用于创建JMS连接,目的地代表消息的发送和接收位置,连接则提供客户端与消息服务之间的通信通道...
JMS 模板类提供了执行公共操作的 helper 方法,在需要更复杂应用的情况下,类把处理任务的核心委托给用户实现的回调接口。 Spring JMS 还提供了转换 JMSException 的功能,转换代码把检测到的 JMSException 层次...
**JMS公共工具**提供了构建JMS应用所需的基础设施。 - **受管理的对象**:如`Destination`、`ConnectionFactory`等,用于创建和管理JMS资源。 - **Connection**:表示与消息中间件的连接,是JMS应用的核心对象。 - ...
- **分发实现**: 您可以向第三方分发规范的实现以供测试和评估使用,条件是此类实现不得修改、子集、超集或其他方式扩展许可方命名空间,或包含该命名空间内的公共或受保护包、类、Java接口、字段或方法,除非这些...
Java消息服务(JMS)是Java平台上的一个标准API,它定义了一套通用接口,用于与多种消息服务器进行交互。JMS提供了一种统一的访问方式,类似于JDBC和JNDI,使得开发者可以使用相同的API来访问IBM的MQSeries和JBossMQ...
JMS是Java平台中用于在分布式环境中传递消息的标准接口,常用于企业级应用中的异步通信。 首先,我们要理解JMS的基本概念。JMS提供两种消息模型:点对点(Point-to-Point,P2P)和发布/订阅(Publish/Subscribe,...
JMS是一种通用的消息传递系统,提供了发送和接收消息的通用接口,让不同的消息服务提供商能够以相同的方式进行操作。 JMS的核心组件包括消息生产者(Message Producer)、消息消费者(Message Consumer)和消息队列...
这个资源适配器允许应用程序在Wildfly(一种流行的Java应用服务器)上与WebSphere MQ消息中间件进行交互,实现JMS接口的特性,如发布/订阅、队列、事务等。 描述中提到的“wildfly standalone deployments”意味着...
例如,在一个典型的SOA环境中,一个服务可能通过WSDL发布其公共接口,这个接口将描述该服务能够提供的功能、接受的数据格式以及返回的结果类型等信息。同时,服务的内部实现可以是任何技术栈下的代码实现,甚至可以...
10. **文档与接口**:良好的文档是项目成功的关键,包括需求文档、设计文档、API接口文档等,有助于团队理解和维护系统。 综上所述,这个基于JavaEE的公共自行车租赁管理系统涵盖了Web开发的多个层面,从前端用户...
Java消息服务(Java Message Service,JMS)是一组Java应用程序接口(Java API),它提供...由Sun公司和它的合作伙伴设计的JMS API定义了一组公共的应用程序接口和相应语法,使得Java程序能够和其他消息组件进行通信。
JMS提供了一组公共的接口和行为,使得开发者可以在不同消息代理之间切换而不必重写代码。 3. 消息中间件:介绍了消息中间件的概念,它是支持系统间异步通信的一类软件,使得分布式系统能够通过消息传递进行通信和...
客户端通过Bean的公共接口进行操作。实现类(Bean类)在运行时实例化,成为分布式对象。Bean分为三种类型: - SessionBean:处理客户端请求,通常用于短期、状态化的交互。 - EntityBean:代表持久性的商业实体,与...
例如,通过使用基于Web服务的公共接口,开发人员可以更容易地将后端系统集成到J2EE环境中,支持更高级别的自动化,并促进后端系统的互相连接。 #### 参考资料 为了更深入地理解本文涉及的概念和技术,以下是一些...
EJB有三种主要类型:会话bean(Session Beans)处理业务逻辑,实体bean(Entity Beans)表示持久化数据,消息驱动bean(Message-Driven Beans)用于接收和处理JMS消息。学习EJB需要理解容器管理的生命周期、ejb-jar....