首先我们需要下载 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基础篇的更多相关文章

  1. JMS基础篇(二)

    简介 异构集成是消息发挥作用的一个领域,大型公司内部可能会遇到很多的平台,Java,.net或者公司自己的平台等. 传送消息还应该支持异步机制,以提高系统整体的性能.异步传输一条消息意味着,发送者不必 ...

  2. C#多线程之基础篇3

    在上一篇C#多线程之基础篇2中,我们主要讲述了确定线程的状态.线程优先级.前台线程和后台线程以及向线程传递参数的知识,在这一篇中我们将讲述如何使用C#的lock关键字锁定线程.使用Monitor锁定线 ...

  3. 一步步学习javascript基础篇(0):开篇索引

    索引: 一步步学习javascript基础篇(1):基本概念 一步步学习javascript基础篇(2):作用域和作用域链 一步步学习javascript基础篇(3):Object.Function等 ...

  4. 2000条你应知的WPF小姿势 基础篇<15-21>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师,对C#和WPF有着极深的热情.最为出色的是他维护了两个博客:2,000Things You Should Know ...

  5. ABP框架实践基础篇之开发UI层

    返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 说明 其实最开始写的,就是这个ABP框架实践基础篇.在写这篇博客之前,又回头复习了一下ABP框架的理论,如果你还没学习,请查看AB ...

  6. C#多线程之基础篇2

    在上一篇C#多线程之基础篇1中,我们主要讲述了如何创建线程.中止线程.线程等待以及终止线程的相关知识,在本篇中我们继续讲述有关线程的一些知识. 五.确定线程的状态 在这一节中,我们将讲述如何查看一个线 ...

  7. C#多线程之基础篇1

    在多线程这一系列文章中,我们将讲述C#语言中多线程的相关知识,在多线程(基础篇)中我们将学习以下知识点: 创建线程 中止线程 线程等待 终止线程 确定线程的状态 线程优先级 前台线程和后台线程 向线程 ...

  8. iOS系列 基础篇 03 探究应用生命周期

    iOS系列 基础篇 03 探究应用生命周期 目录: 1. 非运行状态 - 应用启动场景 2. 点击Home键 - 应用退出场景 3. 挂起重新运行场景 4. 内存清除 - 应用终止场景 5. 结尾 本 ...

  9. iOS系列 基础篇 04 探究视图生命周期

    iOS系列 基础篇 04 探究视图生命周期 视图是应用的一个重要的组成部份,功能的实现与其息息相关,而视图控制器控制着视图,其重要性在整个应用中不言而喻. 以视图的四种状态为基础,我们来系统了解一下视 ...

随机推荐

  1. 编写自己的JavaScript方法库

    下面列出了我在项目中经常使用到的一些方法,这些方法可以很方便的提高我们的工作效率,代码在GitHub上面,点击目录就可以跳转了,欢迎大家通过fork,改编和优化成自己的JavaScript方法库. 目 ...

  2. PHP截取中英文字符串

    //如果字符串长度超过10,则截取并以省略号结尾 function sub($str){ $str=(string)$str; if( mb_strlen($str,'utf-8') >10){ ...

  3. 关于在vue-cli中使用微信自动登录和分享

    (以下所有接口由后台提供) 一.微信自动登录 //定义事件 methods:{ //判断是否微信登陆 是不是微信浏览器 isWeiXin() { let ua = window.navigator.u ...

  4. h5开发安卓软键盘遮挡解决方案

    //处理input focus时被键盘遮挡问题 inputFocus:function(){ if(/Android [4-6]/.test(navigator.appVersion)) { wind ...

  5. CCF系列之数字排序(201503-2)

    问题描述试题编号: 201503-2试题名称: 数字排序时间限制: 1.0s内存限制: 256.0MB问题描述: 问题描述 给定n个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出. 输 ...

  6. 在eclipse中创建maven webapp项目时弹出错误-解决办法

    在eclipse中创建maven webapp项目时报错: Could not resolve archetype org.apache.maven.archetypes:maven-archetyp ...

  7. ASP.NET Core 一步步搭建个人网站(6)_单页模式和优化

    前言 HI,有段时间没有更新了,主要因为第一年前事情比较多,有些事得忙着张罗下:第二呢,对个人网站进行了一次大范围的优化,主要是申请的云服务器资源有限,1m的网络带宽,带上图片展示的话,打开网站的平均 ...

  8. 全新的软件项目,好的开始决定了成功一半!(需求&计划)

    刚看完“无问西东”,电影里说人总归还是要留下些足迹(文字)的,那么赶紧跑图书馆来留下些文字. 最近去瑞士启动了一个新的项目,那么早上做项目,晚上总结留下了一张张思维导图来记录当时的感受, 手稿如下,字 ...

  9. linux的crash之hardlock排查记录

    3.10.0-327的内核,crash记录如下: KERNEL: vmlinux DUMPFILE: vmcore [PARTIAL DUMP] CPUS: 48 DATE: Wed Oct 18 2 ...

  10. 深入理解HashMap的扩容机制

    什么时候扩容: 网上总结的会有很多,但大多都总结的不够完整或者不够准确.大多数可能值说了满足我下面条件一的情况. 扩容必须满足两个条件: 1. 存放新值的时候当前已有元素的个数必须大于等于阈值 2. ...