Java消息服务(JMS):Queue点对点发送详解

需积分: 12 8 下载量 75 浏览量 更新于2024-08-18 收藏 466KB PPT 举报
"这篇文档详细介绍了JMS(Java Messaging Service)中的Queue点对点发送过程,并探讨了JMS的基本概念和编程模型。" 在JMS(Java Messaging Service)中,Queue点对点发送过程涉及一系列步骤,对于理解JMS的工作原理至关重要。首先,通过JNDI(Java Naming and Directory Interface)查找队列连接工厂(QueueConnectionFactory)和队列(queue)实例。这是建立JMS通信的基础,JNDI允许应用程序查找并绑定到所需的JMS资源。接着,创建JMS连接(connection)和会话(session),连接是与JMS提供者通信的通道,而会话是执行消息操作的上下文,通常在一个会话中,消息的发送和接收是原子性的。 然后,创建消息接收者(QueueReceiver),它是负责从队列中接收消息的对象。一旦连接启动,就可以开始发送消息。消息会被放入队列,等待接收者取用。接收者从队列中接收消息,这个过程会持续到所有消息都被接收完毕。最后,为了释放资源,需要在finally代码块中关闭连接,关闭连接的同时会自动关闭消息接收。 JMS提供了多种消息类型,包括TextMessage、ObjectMessage、MapMessage、BytesMessage、StreamMessage以及无有效负载的消息(Message),以适应不同数据类型的传输需求。此外,JMS主要由以下元素构成: 1. JMS提供者:实现JMS接口,连接到消息中间件。 2. JMS客户:生产或消费消息的Java应用程序或对象。 3. JMS生产者:创建并发送消息的客户。 4. JMS消费者:接收消息的客户。 5. JMS消息:在JMS客户之间传递数据的对象。 6. JMS队列:按顺序存储并发送消息的区域,每个消息只被一个消费者消费。 7. JMS主题:支持多订阅者的消息发布/订阅模型。 JMS的编程模型包括Queue(点对点)和Topic(发布/订阅)两种。Queue模式中,每个消息仅有一个消费者,发送者和接收者在时间上没有依赖,消息会在队列中等待直到被消费。而Topic模式下,一个消息可以被多个订阅者同时接收。 在实际编程中,开发人员会使用如ConnectionFactory、Destination、Connection、MessageConsumer、MessageProducer、Message和Session等接口来构建JMS应用。理解这些接口的功能和使用方式是成功实现JMS通信的关键。 JMS是一种强大的工具,用于Java应用之间的消息传递,它通过标准的API简化了企业级应用的开发,提供了可靠的消息传递机制,包括点对点(Queue)和发布/订阅(Topic)两种模式。理解JMS的这些基本概念和工作流程对于任何涉及JMS的应用程序设计都至关重要。

#include <stdio.h> #include <stdlib.h> #define MAX_QUEUE_SIZE 1000 // 定义队列最大容量 // 定义结构体 typedef struct { uint16_t SA; // 学生编号 uint16_t TA; uint8_t *messagedata; // 学生年龄 } messagdata_doip; // 定义队列结构体 typedef struct { messagdata_doip data[MAX_QUEUE_SIZE]; // 存储队列元素的数组 int front; // 队头指针 int rear; // 队尾指针 } Queue; // 初始化队列 void initQueue(Queue *queue) { queue->front = 0; queue->rear = 0; } // 入队操作 void enqueue(Queue *queue, messagdata_doip element) { if ((queue->rear + 1) % MAX_QUEUE_SIZE == queue->front) { // 队列已满,无法插入元素 printf("队列已满,无法插入元素!\n"); return; } queue->data[queue->rear] = element; queue->rear = (queue->rear + 1) % MAX_QUEUE_SIZE; } // 出队操作 Student dequeue(Queue *queue) { if (queue->front == queue->rear) { // 队列为空,无法出队 printf("队列为空,无法出队!\n"); messagdata_doip emptyStudent = {-1, "", -1}; // 返回一个空的结构体 return emptyStudent; } messagdata_doip element = queue->data[queue->front]; queue->front = (queue->front + 1) % MAX_QUEUE_SIZE; return element; } int main() { Queue queue; initQueue(&queue); uint8_t *messagedata={0x10,0x20,0x40}; // 入队操作 messagdata_doip student1 = {0x1001, 0x1215, 18}; enqueue(&queue, student1); // 出队操作 messagdata_doip element; element = dequeue(&queue); printf("出队元素:id=%d, name=%s, age=%d\n", element.id, element.name, element.age); element = dequeue(&queue); return 0; } 请修改上面的代码

2023-06-12 上传