JMS基础篇

  首先我们需要下载 ActiveMQ:http://activemq.apache.org/。

  启动 ActiveMQ 服务:解包下载的 ActiveMQ 》进去其bin 目录》双击 activemq.bat。

   ActiveMQ 默认使用的是端口61616,可以在cmd中查看61616端口是否被占用,以确定ActiveMQ 服务是否正常启动。查看的命令如下:

netstat -nao | find "61616",如果服务启动则可以看到ActiveMQ所对应的的进程。

下面将以三种形式体验ActiveMQ 发送,接收消息的功能。

第一种是ActiveMQ 所支持的,但不是基于JNDI的,不是JMS标准所建议的。

发送消息的类如下,基于的端口是默认的61616,连续发送了5了消息,消息队列是xiaoyunduo。

import java.util.Date;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.MessageProducer;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

public class Sender {

	public static void main(String[] srgs) throws JMSException, InterruptedException {
		factory;
		Connection connection = null;
		Session session = null;
		Destination destination = null;
		MessageProducer producer = null;

		// 创建连接工厂
		factory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD, "tcp://localhost:61616");
		// 创建连接
		connection = factory.createConnection();
		// 建立连接
		connection.start();
		// 建立session
		session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
		// 指定消息队列
		destination = session.createQueue("xiaoyunduo");
		// 创建消息发生器
		producer = session.createProducer(destination);

		for (int i = 0; i < 5; i++) {
			MapMessage message = session.createMapMessage();
			message.setLong("mess", new Date().getTime());
			Thread.sleep(1000);
			// 发送消息
			producer.send(message);
		}

		session.commit();
		session.close();
		connection.close();

	}
}

  接收消息的类如下,基于的端口是默认的61616,消息队列是xiaoyunduo。

import java.util.Date;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

public class Receiver {

	public static void main(String[] args) throws JMSException {

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

		// 创建连接工厂
		factory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD, "tcp://localhost:61616");
		// 创建连接
		connection = factory.createConnection();
		// 建立连接
		connection.start();
		// 建立session
		session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
		// 指定消息队列
		destination = session.createQueue("xiaoyunduo");
		// 产生消费者
		consumer = session.createConsumer(destination);

		for (int i = 0; i < 5; i++) {
			//获取jms server中的消息
			MapMessage message = (MapMessage) consumer.receive(1000);
			session.commit();
			System.out.println("收到消息:" + new Date(message.getLong("mess")));
		}

		session.close();
		connection.close();

	}
}

  先启动发送消息的类,再启动接收消息的类,可以看到消息内容打印在消息接收端。

第二种是基于文件形式的JNDI,使用Sun自带的RefFSContextFactory来存储JNDI信息。需要引入fscontext.jar和providerutil.jar,这是进行测试的前提。

  ConnectionFactory改从Context中读取,其余部分保持不变。发送消息和接收消息的类都需要进行对应的修改。

        // 创建连接工厂
        //factory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD, "tcp://localhost:61616");
        Hashtable env = new Hashtable(5);
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory");
        env.put(Context.PROVIDER_URL, "file:JNDI_REF");

        try {
            Context ctx = new InitialContext(env);
            ActiveMQConnectionFactory mqFactory = new ActiveMQConnectionFactory();
            mqFactory.setBrokerURL("tcp://localhost:61616");
            mqFactory.setUserName(null);
            mqFactory.setPassword(null);

            //设置的参数少了某一项,只有sender发送等几秒后再去启动receive才没问题,否则接收不到消息
            //ctx.bind("mqFactory", mqFactory);//只需要绑定一次
            factory = (ConnectionFactory) ctx.lookup("mqFactory");
        } catch (NamingException e) {
            e.printStackTrace();
        }

第三种基于配置文件的方式,需要先有下面的一个配置文件jndi.properties,其中包含了ActiveMQ 的基本配置信息。

java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory
java.naming.provider.url=tcp://localhost:61616
java.naming.security.principal=system
java.naming.security.credentials=manager
connectionFactoryNames=con1,con2
##queue.MyQueue=MyQueue
topic.MyTopic=MyTopic
topic.topic1=jms.topic1

     还需要一个读取配置文件的工厂类,InitialContext利用properties信息进行初始化,将直接利用JNDI从InitialContext中读取信息。

import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class JndiFactoryForJMS {
     protected Context context = null;  

    public void initalize() throws NamingException
    {
        Properties props = new Properties();
        try{
            org.apache.activemq.jndi.ActiveMQInitialContextFactory af = new org.apache.activemq.jndi.ActiveMQInitialContextFactory();
            props.load(this.getClass().getResourceAsStream("jndi.properties"));
            context = new InitialContext(props);
        }catch(Exception ex){
            ex.printStackTrace();
        }  

    }  

    public Context getJndiContext() throws NamingException {
        if(context == null){
            initalize();
        }
        return context;
    }     

}  

和第二种方法类似,只需要改变第一个类的部分代码即可,发送端和接收端要同时修改。

      // 创建连接工厂
      //factory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD, "tcp:/      /localhost:61616");

     try {
	  JndiFactoryForJMS factoryForJMS = new JndiFactoryForJMS();
	    Context ctx = factoryForJMS.getJndiContext();  

	    //获取连接工厂。
	    factory = (ConnectionFactory)ctx.lookup("con1");
	    } catch (NamingException e) {
	    e.printStackTrace();
	   }

  

JMS基础篇,布布扣,bubuko.com

时间: 2024-10-12 03:32:01

JMS基础篇的相关文章

JMS基础篇(二)

简介 异构集成是消息发挥作用的一个领域,大型公司内部可能会遇到很多的平台,Java,.net或者公司自己的平台等. 传送消息还应该支持异步机制,以提高系统整体的性能.异步传输一条消息意味着,发送者不必等到接收者接收或者处理消息,可以接着做后续的处理. 应用程序发送消息至另外一个应用程序,需要使用到消息中间件.消息中间件应提供容错,负载均衡,可伸缩的事务性等特性. JMS与JDBC类似,是一种与厂商无关的API.应用程序开发者可以使用同样的API来访问不同的系统. 可以认为JMS是一种标准,各消息

Java架构师成长之道之RabbitMQ开发与运维-基础篇(CSDN版)

Java架构师成长之道之RabbitMQ开发与运维-基础篇(CSDN版) Java架构师成长之道 消息中间件概述 消息是指在不同语言实现的应用间传递的数据,消息可以是文本字符串.JSON,也可以是复杂的内前对象. 消息中间件是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通讯来进行分布式系统集成. 通过提供消息传递和消息排队模型,使得在分布式环境下扩展进程间的通讯. 消息中间件一般有两种传递模式:点对点模式和发布/订阅模式. 点对点是基于队列的,消息生产者将消息发送到消息队列,

oracle(sql)基础篇系列(五)&mdash;&mdash;PLSQL、游标、存储过程、触发器

  PL/SQL PL/SQL 简介 每一种数据库都有这样的一种语言,PL/SQL 是在Oracle里面的一种编程语言,在Oracle内部使用的编程语言.我们知道SQL语言是没有分支和循环的,而PL语言是为了补充SQL语言的,是带有了分支和循环的语言. PL/SQL 语法 基本数据类型声明 declare v_name varchar2(20); v_temp number(1); v_count binary_integer := 0; v_sal number(7,2) := 4000.00

Hybrid APP基础篇(四)-&gt;JSBridge的原理

说明 JSBridge实现原理 目录 前言 参考来源 前置技术要求 楔子 原理概述 简介 url scheme介绍 实现流程 实现思路 第一步:设计出一个Native与JS交互的全局桥对象 第二步:JS如何调用Native 第三步:Native如何得知api被调用 第四步:分析url-参数和回调的格式 第五步:Native如何调用JS 第六步:H5中api方法的注册以及格式 进一步完善JSBridge方案 思路 实现 注意 完整的JSBridge 完整调用流程图 另外实现:不采用url sche

网络基础篇----计算机网络基本概述(1)

享受生活  热爱挑战                                                                刘明远分享    一   计算机网络基本概述(1) 每章一段话: 不要让自己闲下来,给自己找些事情做.哪怕是看看书. 正文   (提示:本章内容比较无聊,最好当看故事一样来看,不必记下只需了解,内容基础) 1什么是计算机网络 号称新的"电力火花"是以计算机.通信.信息技术为支撑的计算机网络技术. 计算机网络将两台或多台计算机通过电缆或网络设

js调试系列: 源码定位与调试[基础篇]

js调试系列目录: - 如果看了1, 2两篇,你对控制台应该有一个初步了解了,今天我们来个简单的调试.昨天留的三个课后练习,差不多就是今天要讲的内容.我们先来处理第一个问题:1. 查看文章下方 推荐 这个功能所调用的函数源码其实非常简单,点放大镜选中那个推荐即可.这个  votePost(cb_entryId,'Digg')  就是推荐按钮所调用的函数了,是不是非常简单. 第二个问题,定位到函数所在文件位置.其实也是非常简单的,当然,不熟悉控制台的朋友也许不知道怎么看.我在控制台输入 voteP

DOM系列---基础篇

DOM (Document Object Model) 即文档对象模型, 针对 HTML 和 XML 文档的 API (应用程序接口) .DOM 描绘了一个层次化的节点树,运行开发人员添加.移除和修改页面的某一部分.DOM 产生于 网景公司及微软公司创始的 DHTML(动态 HTML) ,但现在它已经成为表现和操作页面标记的真正跨平台.语言中立的方式. DOM 中的三个字母: D(文档)可以理解为整个 Web 加载的网页文档: O(对象)可以理解为类似 window 对象之类的东西,可以调用属性

深入理解iPhone数据持久化(手把手教你iphone开发 – 基础篇)

在所有的移动开发平台数据持久化都是很重要的部分:在j2me中是rms或保存在应用程序的目录中,在symbian中可以保存在相应的磁盘目录中和数据库中.symbian中因为权限认证的原因,在3rd上大多数只能访问应用程序的private目录或其它系统共享目录.在iphone中,apple博采众长,提供了多种数据持久化的方法,下面笔者会逐个进行详细的讲解. iphone提供的数据持久化的方法,从数据保存的方式上讲可以分为三大部分:属性列表.对象归档.嵌入式数据库(SQLite3).其他方法. 一.属

Qt入门之基础篇 ( 二 ) :Qt项目建立、编译、运行和发布过程解析

转载请注明出处:CN_Simo. 题解: 本篇内容主讲Qt应用从创建到发布的整个过程,旨在帮助读者能够快速走进Qt的世界. 本来计划是讲解Qt源码静态编译,如此的话读者可能并不能清楚地知道为何要静态编译,所以借此篇内容说明一下原由并为之后文章的学习做准备. 即使本片内容只是在围绕一个小小的HelloWorld程序开展,但还是希望朋友们不要急于求成,"欲速则不达". 文章整体思路: 我们循序渐进地来看,一个Qt应用的完成有以下一个重要的步骤: 项目创建->源码编译->程序运行