– Start
点击此处观看本系列配套视频。
JMS 支持两种消息传递方式,一种是点对点方式(point-to-point (PTP)),一种是发布/订阅方式(publish/subscribe (pub/sub))。本文关注点对点方式,先看看它的结构图。
点对点消息有以下特性。
- Client1 是消息的发送者(Producer)。
- 消息被发送到一个消息队列(Queue)。
- Client2 是消息的接收者(Consumer)。
- 每个消息只有一个接收者
- 当接收者收到消息的时,需要发送确认通知(acknowledgement)
- 消息会被一直保存到消息队列中,直到消息被接收或到期。
下面是一个使用 JMS API 发送和接收消息的例子。
package shangbo.activeMQ.example1;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQQueue;
public class Producer {
// ActiveMQ 支持不同的协议,你可以在它的配置文件中 conf/activemq.xml 找到不同协议的连接方式
public static String BROKER_URL = "tcp://0.0.0.0:61616";
public static String USER = "admin";
public static String PASSWORD = "admin";
public static String DESTINATION = "systemA.systemB.Price.Queue";
public static void main(String[] args) throws JMSException {
// 创建连接工厂
ConnectionFactory factory = new ActiveMQConnectionFactory(BROKER_URL);
// 创建连接
Connection connection = factory.createConnection(USER, PASSWORD);
// 创建会话
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 创建消息
TextMessage msg = session.createTextMessage("hello queue world");
// 创建消息目的地
Destination dest = new ActiveMQQueue(DESTINATION);
// 发送消息
MessageProducer producer = session.createProducer(dest);
producer.send(msg);
System.out.println("message sent");
// 释放资源
session.close();
connection.close();
System.exit(0);
}
}
package shangbo.activeMQ.example1;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQQueue;
public class Consumer {
// ActiveMQ 支持不同的协议,你可以在它的配置文件中 conf/activemq.xml 找到不同协议的连接方式
public static String BROKER_URL = "tcp://0.0.0.0:61616";
public static String USER = "admin";
public static String PASSWORD = "admin";
public static String DESTINATION = "systemA.systemB.Price.Queue";
public static void main(String[] args) throws JMSException {
// 创建连接工厂
ConnectionFactory factory = new ActiveMQConnectionFactory(BROKER_URL);
// 创建连接
Connection connection = factory.createConnection(USER, PASSWORD);
connection.start();
// 创建会话
Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
// 创建消息源
Destination dest = new ActiveMQQueue(DESTINATION);
// 接收消息
MessageConsumer consumer = session.createConsumer(dest);
Message msg = consumer.receive(1000);
// 解析消息
if (msg != null) {
if (msg instanceof TextMessage) {
String body = ((TextMessage) msg).getText();
System.out.println(body);
} else {
System.out.println("Unexpected message type: " + msg.getClass());
}
// 发送确认通知
msg.acknowledge();
} else {
System.out.println("No new message");
}
// 释放资源
session.close();
connection.close();
System.exit(0);
}
}
– 更多参见:JMS + ActiveMQ 精萃
– 声 明:转载请注明出处
– Last Updated on 2018-05-31
– Written by ShangBo on 2017-06-24
– End