ActiveMQ学习道路之初体验

什么是ActiveMQ

ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和JavaEE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。

主要特点:
  • 多种语言和协议编写客户端。语言: Java, C, C++, C#, Ruby, Perl, Python, PHP。应用协议: OpenWire,Stomp REST,WS Notification,XMPP,AMQP
  • 完全支持JMS1.1和J2EE 1.4规范 (持久化,XA消息,事务)
  • 对Spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性
  • 通过了常见J2EE服务器(如 Geronimo,JBoss 4, GlassFish,WebLogic)的测试,其中通过JCA 1.5 resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上

ActiveMQ的消息形式

对于消息的传递有两种类型:

  1. 一种是点对点的,即一个生产者和一个消费者一一对应;
  2. 另一种是发布/订阅模式,即一个生产者产生消息并进行发送后,可以由多个消费者进行接收。

JMS定义了五种不同的消息正文格式,以及调用的消息类型,允许你发送并接收以一些不同形式的数据,提供现有消息格式的一些级别的兼容性:

  1. StreamMessage – Java原始值的数据流
  2. MapMessage–一套名称-值对
  3. TextMessage–一个字符串对象
  4. ObjectMessage–一个序列化的 Java对象
  5. BytesMessage–一个字节的数据流

Demo:ActiveMQ在Linux启动,window访问

在WMware总,opt文件夹下的ActiveMQ文件夹中启动. ./activemq start

一定要关闭Linux中的防火墙,否则window中访问不到,Centos7中关闭防火墙:systemctl stop firewalld.service

点对点模式
java

//创建生产者 点对点模式
	@Test
	public void test1() throws JMSException {
		//需要先连接到ActiveMQ
		ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://10.0.117.198:61616");
		//从工厂获取链接
		Connection conn = factory.createConnection();
		//链接
		conn.start();
		Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
		//创建发送到的目的地
		Queue queue = session.createQueue("myqueue");
		//创建生产者
		MessageProducer producer = session.createProducer(queue);
		//发送的内容
		TextMessage message = session.createTextMessage("one ActiveMQ");
		//发送
		producer.send(message);
		producer.close();
		session.close();
		conn.close();
	}
//创建消费者,点对点
	@Test
	public void test2() throws JMSException, IOException {
		ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://10.0.117.198:61616");
		Connection conn = factory.createConnection();
		conn.start();
		
		Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
		//创建接受目的地
		Queue uqeue = session.createQueue("myqueue");
		//创建消费者
		MessageConsumer consumer = session.createConsumer(uqeue);
		//监听消息是否过来
		consumer.setMessageListener(new MessageListener() {
			
			@Override
			public void onMessage(Message arg0) {
				// TODO Auto-generated method stub
				try{
					TextMessage message =(TextMessage) arg0;
					String text = message.getText();
					System.out.println(text);
				}catch (Exception e) {
					// TODO: handle exception
					System.out.println(e);
				}
			}
		});
		//阻塞方法
		System.in.read();
		consumer.close();
		session.close();
	    conn.close();
	}

先启动生产者代码,登录ActiveMQ的后台,Linux的ip地址:8161/admin.我的是http://10.0.117.198:8161/admin.输入初始账号密码admin登录,点击Queues中可以看到生产者发送的消息,此时运行消费者会受到消息.

订阅模式
java

//发布订阅方式发送消息 
	@Test
	public void test3() throws JMSException {
		ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://10.0.117.198:61616");
		Connection conn = factory.createConnection();
		conn.start();
		Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
		//目的地
		Topic topic = session.createTopic("mytopic");
		//生产者
		MessageProducer producer = session.createProducer(topic);
		//发送的内容
		TextMessage text = session.createTextMessage("hello topic");
		producer.send(text);
		producer.close();
		session.close();
		conn.close();
	}
@Test
	public void test4() throws JMSException, IOException {
		ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://10.0.117.198:61616");
		Connection conn = factory.createConnection();
		conn.start();
		Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
		Topic topic = session.createTopic("mytopic");
		MessageConsumer consumer = session.createConsumer(topic);
		//匿名内部类
		consumer.setMessageListener(new MessageListener() {
			@Override
			public void onMessage(Message arg0) {
				// TODO Auto-generated method stub
				try {
					TextMessage text =(TextMessage) arg0;
					String text2 = text.getText();
					System.out.println(text2);
				}catch (Exception e) {
					// TODO: handle exception
				}
			}
		});
		System.in.read();
		consumer.close();
		session.close();
	    conn.close();
	}

运行时应先启动接收方(消费者),再启动生产者,否者消费者接受不到信息.

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值