本文概述
JMS(Java消息服务)是提供创建, 发送和读取消息的功能的API。它提供了松散耦合, 可靠和异步的通信。
JMS也称为消息传递服务。
了解消息传递
消息传递是一种通信应用程序或软件组件的技术。
JMS主要用于从一个应用程序向另一个应用程序发送和接收消息。
JMS的要求
通常, 用户向应用程序发送消息。但是, 如果我们想将消息从一个应用程序发送到另一个应用程序, 则需要使用JMS API。
考虑一种情况, 一个应用程序A在印度运行, 而另一个应用程序B在美国运行。要将消息从A应用程序发送到B, 我们需要使用JMS。
JMS的优势
1)异步:要接收消息, 不需要客户端发送请求。消息将自动到达客户端。
2)可靠:它确保邮件已传递。
邮件域
JMS中有两种类型的消息传递域。
- 点对点消息传递域
- 发布者/订阅者消息传递域
1)点对点(PTP)消息传递域
在PTP模型中, 一条消息仅传递给一个接收者。在这里, 队列用作面向消息的中间件(MOM)。
队列负责保留消息, 直到接收者准备好为止。
在PTP模型中, 发送方和接收方之间没有时序依赖性。
2)发布者/订阅者(发布/订阅)消息传递域
在发布/订阅模型中, 一条消息传递给所有订户。就像广播一样。在这里, 主题用作面向消息的中间件, 负责保存和传递消息。
在PTP模型中, 发布者和订阅者之间存在时间依赖性。
JMS编程模型
JMS队列示例
要开发JMS队列示例, 你需要安装任何应用程序服务器。在这里, 我们使用glassfish3服务器, 在其中创建两个JNDI。
- 创建名为myQueueConnectionFactory的连接工厂
- 创建名为myQueue的目标资源
创建JNDI之后, 创建服务器和接收器应用程序。你需要在其他控制台中运行服务器和接收器。在这里, 我们使用的是eclipse IDE, 默认情况下会在其他控制台中打开它。
1)创建连接工厂和目标资源
通过URL http:// localhost:4848打开服务器管理控制台
使用用户名和密码登录。
单击“ JMS资源”->“连接工厂”->“新建”, 现在输入池名称并选择“资源类型”作为QueueConnectionFactory, 然后单击“确定”按钮。
单击JMS资源->目标资源->新建, 现在输入JNDI名称和物理目标名称, 然后单击确定按钮。
2)创建发送方和接收方应用程序
让我们看一下发送者和接收者代码。请注意, Receiver附带有侦听器, 当用户发送消息时将被调用。
文件:MySender.java
import java.io.BufferedReader;
import java.io.InputStreamReader;
import javax.naming.*;
import javax.jms.*;
public class MySender {
public static void main(String[] args) {
try
{ //Create and start connection
InitialContext ctx=new InitialContext();
QueueConnectionFactory f=(QueueConnectionFactory)ctx.lookup("myQueueConnectionFactory");
QueueConnection con=f.createQueueConnection();
con.start();
//2) create queue session
QueueSession ses=con.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
//3) get the Queue object
Queue t=(Queue)ctx.lookup("myQueue");
//4)create QueueSender object
QueueSender sender=ses.createSender(t);
//5) create TextMessage object
TextMessage msg=ses.createTextMessage();
//6) write message
BufferedReader b=new BufferedReader(new InputStreamReader(System.in));
while(true)
{
System.out.println("Enter Msg, end to terminate:");
String s=b.readLine();
if (s.equals("end"))
break;
msg.setText(s);
//7) send message
sender.send(msg);
System.out.println("Message successfully sent.");
}
//8) connection close
con.close();
}catch(Exception e){System.out.println(e);}
}
}
文件:MyReceiver.java
import javax.jms.*;
import javax.naming.InitialContext;
public class MyReceiver {
public static void main(String[] args) {
try{
//1) Create and start connection
InitialContext ctx=new InitialContext();
QueueConnectionFactory f=(QueueConnectionFactory)ctx.lookup("myQueueConnectionFactory");
QueueConnection con=f.createQueueConnection();
con.start();
//2) create Queue session
QueueSession ses=con.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
//3) get the Queue object
Queue t=(Queue)ctx.lookup("myQueue");
//4)create QueueReceiver
QueueReceiver receiver=ses.createReceiver(t);
//5) create listener object
MyListener listener=new MyListener();
//6) register the listener object with receiver
receiver.setMessageListener(listener);
System.out.println("Receiver1 is ready, waiting for messages...");
System.out.println("press Ctrl+c to shutdown...");
while(true){
Thread.sleep(1000);
}
}catch(Exception e){System.out.println(e);}
}
}
文件:MyListener.java
import javax.jms.*;
public class MyListener implements MessageListener {
public void onMessage(Message m) {
try{
TextMessage msg=(TextMessage)m;
System.out.println("following message is received:"+msg.getText());
}catch(JMSException e){System.out.println(e);}
}
}
首先运行Receiver类, 然后运行Sender类。
JMS主题示例
它与JMS Queue相同, 但是你需要将Queue更改为Topic, 将Sender更改为Publisher, 将Receiver更改为Subscriber。
你需要创建两个名为myTopicConnectionFactory和myTopic的JNDI。
文件:MySender.java
import java.io.BufferedReader;
import java.io.InputStreamReader;
import javax.naming.*;
import javax.jms.*;
public class MySender {
public static void main(String[] args) {
try
{ //Create and start connection
InitialContext ctx=new InitialContext();
TopicConnectionFactory f=(TopicConnectionFactory)ctx.lookup("myTopicConnectionFactory");
TopicConnection con=f.createTopicConnection();
con.start();
//2) create queue session
TopicSession ses=con.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
//3) get the Topic object
Topic t=(Topic)ctx.lookup("myTopic");
//4)create TopicPublisher object
TopicPublisher publisher=ses.createPublisher(t);
//5) create TextMessage object
TextMessage msg=ses.createTextMessage();
//6) write message
BufferedReader b=new BufferedReader(new InputStreamReader(System.in));
while(true)
{
System.out.println("Enter Msg, end to terminate:");
String s=b.readLine();
if (s.equals("end"))
break;
msg.setText(s);
//7) send message
publisher.publish(msg);
System.out.println("Message successfully sent.");
}
//8) connection close
con.close();
}catch(Exception e){System.out.println(e);}
}
}
文件:MyReceiver.java
import javax.jms.*;
import javax.naming.InitialContext;
public class MyReceiver {
public static void main(String[] args) {
try {
//1) Create and start connection
InitialContext ctx=new InitialContext();
TopicConnectionFactory f=(TopicConnectionFactory)ctx.lookup("myTopicConnectionFactory");
TopicConnection con=f.createTopicConnection();
con.start();
//2) create topic session
TopicSession ses=con.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
//3) get the Topic object
Topic t=(Topic)ctx.lookup("myTopic");
//4)create TopicSubscriber
TopicSubscriber receiver=ses.createSubscriber(t);
//5) create listener object
MyListener listener=new MyListener();
//6) register the listener object with subscriber
receiver.setMessageListener(listener);
System.out.println("Subscriber1 is ready, waiting for messages...");
System.out.println("press Ctrl+c to shutdown...");
while(true){
Thread.sleep(1000);
}
}catch(Exception e){System.out.println(e);}
}
}
文件:MyListener.java
import javax.jms.*;
public class MyListener implements MessageListener {
public void onMessage(Message m) {
try{
TextMessage msg=(TextMessage)m;
System.out.println("following message is received:"+msg.getText());
}catch(JMSException e){System.out.println(e);}
}
}
评论前必须登录!
注册