JMS协议学习

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">JMS(Java消息中间件)</span><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>

面向消息的中间件的API接口,用于在应用程序和分布式系统中发送消息,进行异步通信。

 

优点:

解决异构系统集成通信,缓解系统瓶颈,提高系统伸缩性,使得系统模块化、组件化更加灵活。

 

JMS群集使用角色:JMS消息提供者,JMS消息消费者

JMS消息提供者向服务器(ActiveMQ等)发送消息,然后JMS消息消费者从消息队列中消费消息对象。

 

JMS消息传递模式:点对点模式或者订阅者/发布者模式

点对点适用于一对一的消息传送,而发布/订阅模型则适用于消息组播的场景。

 

点对点:一对一消息传递。基于拉取和轮训消息传递模式,从队列中请求信息,而不是将消息推送到客户端,特别点接受者有且只有一个,即便有多个消息监听,也只有一个,基于这一点,JMS可以使用这种消息传递模式做负载均衡。注意:点对点模型允许接收者在接收消息前查看消息内容。

 

订阅/发布:消息组播场景。基于推送的消息传递模式,发布订阅模式可以有多种不同的订阅者,临时订阅者只在主动监听才接受消息,而持久订阅者则监听主题的所有消息,即使当前订阅者不可用,处于离线状态。


sender

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

/**
 * (1)创建连接使用的工厂类JMS ConnectionFactory 
 * (2)使用管理对象JMSConnectionFactory建立连接Connection 
 * (3)使用连接Connection 建立会话Session
 * (4)使用会话Session和管理对象Destination创建消息生产者MessageSender
 * (5)使用消息生产者MessageSender发送消息
 */
public class JmsSender {

	private ConnectionFactory connectionFactory = null;
	private Connection connection = null;
	private Session session = null;
	private Destination destination = null;
	private MessageProducer producer = null;

	public JmsSender() {
		super();
	}

	public void init() {
		connectionFactory = new ActiveMQConnectionFactory(
				ActiveMQConnection.DEFAULT_USER,
				ActiveMQConnection.DEFAULT_PASSWORD, "tcp://localhost:61616");

		try {
			connection = connectionFactory.createConnection();
			connection.start();
			session = connection.createSession(Boolean.TRUE.booleanValue(),
					Session.AUTO_ACKNOWLEDGE);

			// Queue
			destination = session.createQueue("xkey");
			producer = session.createProducer(destination);
			producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
			sendMessage(session, producer);
			session.commit();
		} catch (JMSException e) {
			e.printStackTrace();
		} finally {
			if (connection != null)
				try {
					connection.close();
				} catch (JMSException e) {
					e.printStackTrace();
				}
		}
	}

	private void sendMessage(Session session, MessageProducer producer)
			throws JMSException {
		for (int i = 1; i <= 5; i++) {
			TextMessage message = session
					.createTextMessage("First ActiveMQ Test:::: " + i);
			System.out.println("Sender:" + "First ActiveMQ Test::: " + i);
			producer.send(message);
		}
	}

	public static void main(String[] args) {
		new JmsSender().init();
	}
}

received

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.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

/**
 * (1)创建连接使用的工厂类JMS ConnectionFactory 
 * (2)使用管理对象JMS ConnectionFactory建立连接Connection
 * (3)使用连接Connection 建立会话Session
 * (4)使用会话Session和管理对象Destination创建消息消费者MessageReceiver
 * (5)使用消息消费者MessageReceiver接受消息,需要用setMessageListener将MessageListener接口绑定到MessageReceiver
 */
public class JmsReceiver {

	private ConnectionFactory connectionFactory = null;
	private Connection connection = null;
	private Session session = null;
	private MessageConsumer consumer = null;
	private Destination destination = null;

	public JmsReceiver() {
	}

	public void init() {
		connectionFactory = new ActiveMQConnectionFactory(
				ActiveMQConnection.DEFAULT_USER,
				ActiveMQConnection.DEFAULT_PASSWORD, "tcp://localhost:61616");
		try {
			connection = connectionFactory.createConnection();
			connection.start();
			session = connection.createSession(Boolean.TRUE.booleanValue(),
					Session.AUTO_ACKNOWLEDGE);
			destination = session.createQueue("xkey");
			consumer = session.createConsumer(destination);
			consumer.setMessageListener(new MessageListener() {
				@Override
				public void onMessage(Message msg) {
					TextMessage message = (TextMessage) msg;
					try {
						System.out.println("Receiver " + message.getText());
					} catch (Exception e) {
						e.printStackTrace();
					}
				}

			});
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				connection.close();
			} catch (JMSException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		JmsReceiver jms = new JmsReceiver();
		jms.init();
	}

}


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值