JMS + ActiveMQ 简单的demo

JMS两个主要概念:
    消息中介
    消息目标:
        1、队列
        2、主题
两种传递模式:
    点对点消息传递模型:每个消息都有一个发送者和一个消费者    
        发送者-〉队列-〉接受者
    发布-订阅者消息传递模型:一条订阅信息,可以发送给多个订阅者
        发布者-〉主题-〉订阅者们
JMS优点:
    不用等待
    面向消息
    位置独立
    确保投送

Apache-ActiveMQ:开源消息中介

先下载ActiveMQ,在网上找的版本是5.11.1,然后在bin中启动activeMQ.(备注:启动之前需要配置好环境变量,并且确定JDK的版本。我这边用的是64位的JDK)

启动后的照片如下:


访问的端口是:http://localhost:8161/     可以直接进入admin界面,用户名和密码都是admin,界面如下:



经常会查看queues,topics,即为消息队列和订阅者发布者。

如果想要停掉服务在控制台需要按ctrl+shift+c,ctrl+c ,Y 。我这边是这样停的,也有人说去掉中间的ctrl+c。

编写代码如下:

消息生产者:

package com.liang.test;

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.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
/**
 * 消息的发布者(发送者)
 */
public class JMSProducer {
	
	private static final String USERNAME=ActiveMQConnection.DEFAULT_USER; //默认连接用户名
	private static final String PASSWORD=ActiveMQConnection.DEFAULT_PASSWORD;//默认连接密码
	private static final String URL=ActiveMQConnection.DEFAULT_BROKER_URL;//默认连接地址
	
	private static final int SIZE=11; //发送的消息数量
	
	
	public static void main(String[] args) {
		ConnectionFactory factory;//连接工厂
		Connection connection;//连接
		Session session;//会话 接受或者发送消息的线程
		Destination destination;//消息的目的地
		MessageProducer messageProducer;//消息生产者
		
		factory=new ActiveMQConnectionFactory(USERNAME, PASSWORD, URL);//实例化连接工厂
		
		try {
			connection=factory.createConnection();//通过连接工厂获取连接
			connection.start();//启动连接
			session=connection.createSession(true, Session.AUTO_ACKNOWLEDGE);//创建session
			//destination = session.createQueue("testQueue1");//point to point//创建消息队列
			destination=session.createTopic("testTopic1");//topic //创建消息队列
			messageProducer=session.createProducer(destination);//创建消息生产者
			
			sendMessage(session, messageProducer);//发送消息
			session.commit();
			
		} catch (JMSException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	/**
     * 发送消息
     */
	public static void sendMessage(Session session,MessageProducer messageProducer){
		for (int i = 0; i < SIZE; i++) {
			try {
				TextMessage message=session.createTextMessage("消息发布者,发布消息"+i);//创建一条文本消息
				messageProducer.send(message);//通过消息生产者发出消息
			} catch (JMSException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

消息接收者:

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.Session;

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

public class JMSConsumer1 {
	private static final String USERNAME=ActiveMQConnection.DEFAULT_USER;
	private static final String PASSWORD=ActiveMQConnection.DEFAULT_PASSWORD;
	private static final String URL=ActiveMQConnection.DEFAULT_BROKER_URL;
	
	public static void main(String[] args) {
		ConnectionFactory connectionFactory;
		Connection connection;
		Session session;
		Destination destination;
		MessageConsumer consumer;
		
		connectionFactory=new ActiveMQConnectionFactory(USERNAME, PASSWORD, URL);
		
		try {
			connection=connectionFactory.createConnection();
			connection.start();
			session=connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
			// destination = session.createQueue("testQueue1"); //point to point
			destination=session.createTopic("testTopic1"); //topic
			consumer=session.createConsumer(destination);
			/*
			while (true) {
                TextMessage textMessage = (TextMessage) messageConsumer.receive(100000);
                if(textMessage != null){
                    System.out.println("收到的消息:" + textMessage.getText());
                }else {
                    break;
                }
            }
			*/
			consumer.setMessageListener(new Listener1());
			
		} catch (JMSException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

public class Listener1 implements MessageListener {

	@Override
	public void onMessage(Message message) {
		try {
			System.out.println("订阅者1:"+((TextMessage)message).getText());
		} catch (JMSException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

备注:

我测试的时候,消息队列的接收方是一直启动的。而发送方是发送完就停掉了。订阅者和发布者也是一样。要先启动订阅者,在启动发布者。







ActiveMQ安装 : 1.下载:http://activemq.apache.org/download.html 最新Windows版本 2.配置jdk环境,解压ActiveMQ到本地 3.启动ActiveMQ服务器: 32位机 : 直接运行\bin\win32\activemq.bat 64位机 : 直接运行\bin\win64\activemq.bat 4.打开ActiveMQ消息管理后台系统 http://localhost:8161/admin/ 参考文章为 : HelloWorld : http://blog.csdn.net/baggio7095586/article/details/5708519 进阶 :http://haohaoxuexi.iteye.com/blog/1893038 helloworld阶段 : 一个发送消息的程序,一个接收消息的程序..实现最简单JMS交流... 监听器阶段 : ⑴MessageListener,最简单的监听器..只是拿来监听接收信息的 ⑵SessionAwareMessageListener,有个session的参数..可以拿来对接收到的信息再做响应.. ⑶MessageListenerAdapter,将消息委托交给一个普通的java类来处理.. 转化器阶段 : 实现MessageConverter接口来转换JMS对象与java对象.. 其实在使用MessageListenerAdapter时,Spring默认为我们提供了SimpleMessageConverter转换器.. 事务(无代码): 在Spring整合JMS的应用中,如果我们要进行本地的事务管理的话非常简单,只需要在定义对应的消息监听容器时指定其sessionTransacted属性为true,如: <bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <property name="connectionFactory" ref="connectionFactory" /> <property name="destination" ref="queueDestination" /> <property name="messageListener" ref="consumerMessageListener" /> <property name="sessionTransacted" value="true"/> </bean> 该属性值默认为false,这样JMS在进行消息监听的时候就会进行事务控制,当在接收消息时监听器执行失败时JMS就会对接收到的消息进行回滚, 对于SessionAwareMessageListener在接收到消息后发送一个返回消息时也处于同一事务下,但是对于其他操作如数据库访问等将不属于该事务控制。 数据库跟JMS挂钩的事务先别理..
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值