个性化阅读
专注于IT技术分析

EJB JMS教程

本文概述

JMS(Java消息服务)是提供创建, 发送和读取消息的功能的API。它提供了松散耦合, 可靠和异步的通信。

JMS也称为消息传递服务。


了解消息传递

消息传递是一种通信应用程序或软件组件的技术。

JMS主要用于从一个应用程序向另一个应用程序发送和接收消息。


JMS的要求

通常, 用户向应用程序发送消息。但是, 如果我们想将消息从一个应用程序发送到另一个应用程序, 则需要使用JMS API。

考虑一种情况, 一个应用程序A在印度运行, 而另一个应用程序B在美国运行。要将消息从A应用程序发送到B, 我们需要使用JMS。


JMS的优势

1)异步:要接收消息, 不需要客户端发送请求。消息将自动到达客户端。

2)可靠:它确保邮件已传递。


邮件域

JMS中有两种类型的消息传递域。

  1. 点对点消息传递域
  2. 发布者/订阅者消息传递域

1)点对点(PTP)消息传递域

在PTP模型中, 一条消息仅传递给一个接收者。在这里, 队列用作面向消息的中间件(MOM)。

队列负责保留消息, 直到接收者准备好为止。

在PTP模型中, 发送方和接收方之间没有时序依赖性。

jms点对点模型

2)发布者/订阅者(发布/订阅)消息传递域

在发布/订阅模型中, 一条消息传递给所有订户。就像广播一样。在这里, 主题用作面向消息的中间件, 负责保存和传递消息。

在PTP模型中, 发布者和订阅者之间存在时间依赖性。

jms点对点模型


JMS编程模型

等编程模型

JMS队列示例

要开发JMS队列示例, 你需要安装任何应用程序服务器。在这里, 我们使用glassfish3服务器, 在其中创建两个JNDI。

  1. 创建名为myQueueConnectionFactory的连接工厂
  2. 创建名为myQueue的目标资源

创建JNDI之后, 创建服务器和接收器应用程序。你需要在其他控制台中运行服务器和接收器。在这里, 我们使用的是eclipse IDE, 默认情况下会在其他控制台中打开它。

1)创建连接工厂和目标资源

通过URL http:// localhost:4848打开服务器管理控制台

使用用户名和密码登录。

单击“ JMS资源”->“连接工厂”->“新建”, 现在输入池名称并选择“资源类型”作为QueueConnectionFactory, 然后单击“确定”按钮。

jms队列连接工厂

单击JMS资源->目标资源->新建, 现在输入JNDI名称和物理目标名称, 然后单击确定按钮。

jms队列目标资源

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);}
	}
}
赞(0)
未经允许不得转载:srcmini » EJB JMS教程

评论 抢沙发

评论前必须登录!