- 浏览: 468146 次
- 性别:
- 来自: 青岛
文章分类
最新评论
-
此去经年雪123:
为啥生成的是乱码 你好
关于使用JS前台加密、JAVA后台解密的RSA实现,RSA加密和签名 -
alonglw:
zxf0089216 写道1.为什么每次都是10001RSAK ...
关于使用JS前台加密、JAVA后台解密的RSA实现,RSA加密和签名 -
zxf0089216:
1.为什么每次都是10001RSAKeyPair(" ...
关于使用JS前台加密、JAVA后台解密的RSA实现,RSA加密和签名 -
dunhanson:
后台的测试main方法都能加密解密。前台加密后的密文交给后台解 ...
关于使用JS前台加密、JAVA后台解密的RSA实现,RSA加密和签名 -
map612:
wula0010 写道仔细看了下,可以运行RSAUtil.ma ...
关于使用JS前台加密、JAVA后台解密的RSA实现,RSA加密和签名
下载ActiveMQ http://activemq.apache.org/download.html
解压缩到本地
启动mq:/bin/activemq.bat
管理界面: http://localhost:8161/admin,默认不用验证。
如果加验证可以参考http://wjw465150.iteye.com/blog/479527
发送消息测试:
package test; import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.DeliveryMode; import javax.jms.Destination; import javax.jms.MessageProducer; import javax.jms.Session; import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnection; import org.apache.activemq.ActiveMQConnectionFactory; public class Sender { private static final int SEND_NUMBER = 5; public static void main(String[] args) { // ConnectionFactory :连接工厂,JMS 用它创建连接 ConnectionFactory connectionFactory; // Connection :JMS 客户端到JMS Provider 的连接 Connection connection = null; // Session: 一个发送或接收消息的线程 Session session; // Destination :消息的目的地;消息发送给谁. Destination destination; // MessageProducer:消息发送者 MessageProducer producer; // TextMessage message; // 构造ConnectionFactory实例对象,此处采用ActiveMq的实现jar 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); // 获取session注意参数值xingbo.xu-queue是一个服务器的queue,须在在ActiveMq的console配置 destination = session.createQueue("xingbo.xu-queue"); // 得到消息生成者【发送者】 producer = session.createProducer(destination); // 设置不持久化,此处学习,实际根据项目决定 producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); // 构造消息,此处写死,项目就是参数,或者方法获取 sendMessage(session, producer); session.commit(); } catch (Exception e) { e.printStackTrace(); } finally { try { if (null != connection) connection.close(); } catch (Throwable ignore) { } } } public static void sendMessage(Session session, MessageProducer producer) throws Exception { for (int i = 1; i <= SEND_NUMBER; i++) { TextMessage message = session .createTextMessage("青软学生学习ActiveMq 发送的消息" + i); // 发送消息到目的地方 System.out.println("发送消息:" + "青软学生学习ActiveMq 发送的消息" + i); producer.send(message); } } }
接受代码:
package test; import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.Destination; import javax.jms.MessageConsumer; import javax.jms.Session; import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnection; import org.apache.activemq.ActiveMQConnectionFactory; public class Receiver { public static void main(String[] args) { // ConnectionFactory :连接工厂,JMS 用它创建连接 ConnectionFactory connectionFactory; // Connection :JMS 客户端到JMS Provider 的连接 Connection connection = null; // Session: 一个发送或接收消息的线程 Session session; // Destination :消息的目的地;消息发送给谁. Destination destination; // 消费者,消息接收者 MessageConsumer consumer; connectionFactory = new ActiveMQConnectionFactory( ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD, "tcp://localhost:61616"); try { // 构造从工厂得到连接对象 connection = connectionFactory.createConnection(); // 启动 connection.start(); // 获取操作连接 session = connection.createSession(Boolean.FALSE.booleanValue(), Session.AUTO_ACKNOWLEDGE); // 获取session注意参数值xingbo.xu-queue是一个服务器的queue,须在在ActiveMq的console配置 destination = session.createQueue("xingbo.xu-queue"); consumer = session.createConsumer(destination); while (true) { TextMessage message = (TextMessage) consumer.receive(1000); if (null != message) { System.out.println("收到消息" + message.getText()); } else { break; } } } catch (Exception e) { e.printStackTrace(); } finally { try { if (null != connection) connection.close(); } catch (Throwable ignore) { } } } }
依赖的2个包:
activemq-core-5.3.0.jar
commons-logging-1.1.jar
jdk必须使用1.5+
=======附加资料===========================
关于ActiveMQ
ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。
ActiveMQ特性列表
1. 多种语言和协议编写客户端。语言: Java, C, C++, C#, Ruby, Perl, Python, PHP。应用协议: OpenWire,Stomp REST,WS Notification,XMPP,AMQP
2. 完全支持JMS1.1和J2EE 1.4规范 (持久化,XA消息,事务)
3. 对Spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性
4. 通过了常见J2EE服务器(如 Geronimo,JBoss 4, GlassFish,WebLogic)的测试,其中通过JCA
1.5 resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上
5. 支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA
6. 支持通过JDBC和journal提供高速的消息持久化
7. 从设计上保证了高性能的集群,客户端-服务器,点对点
8. 支持Ajax
9. 支持与Axis的整合
10. 可以很容易得调用内嵌JMS provider,进行测试
连接方式:
ActiveMQConnectionFactory 提供了多种连接到Broker的方式,常见的有
vm://host:port
tcp://host:port
ssl://host:port
stomp://host:port //stomp协议可以跨语言,目前有很多种stomp client 库(java,c#,c/c++,ruby,python...);
Broker:
1.Running Broker
直接运行bin目录下activemq.bat的脚本就可以启动一个broker
2.Embedded Broker
以编码的方式启动broker:
BrokerService broker = new BrokerService();
broker.setName("xxx"); //如果需要启动多个broker,那么需要为broker设置一个名字
broker.addConnector("tcp://localhost:61616");
broker.start();
如果希望在同一个JVM内访问这个broker,那么可以使用VM Transport,URI是:vm://brokerName
可通过BrokerService创建broker:
BrokerService broker = BrokerFactory.createBroker(new URI(uri));
uri可以使用以下形式:
xbean:activemq.xml
file:xx/activemq.xml
broker:tcp://localhost:61616
spring配置可以如下:
<bean id="broker" class="org.apache.activemq.xbean.BrokerFactoryBean">
<property name="config" value="classpath:xx/activemq.xml" />
<property name="start" value="true" />
</bean>
3.Monitoring Broker
(1)jconsole:JMX(监控broker)
<broker xmlns="http://activemq.org/config/1.0" brokerName="localhost" useJmx="true">
<managementContext>
<!--止ActiveMQ创建自己的connector,可以为为JMX Connector配置密码保护-->
<managementContext createConnector="false"/>
</managementContext>
</broker>
启动jdk bin目录下jconsole.exe,进行相关的本地远程配置后就可以执行监控.
(2)Web Console
直接访问http://localhost:8161/admin即可,可通过修改配置中的port属性修改端口
<!-- An embedded servlet engine for serving up the Admin console -->
<jetty xmlns="http://mortbay.com/schemas/jetty/1.0">
<connectors>
<nioConnector port="8161"/>
</connectors>
<handlers>
<webAppContext contextPath="/admin" resourceBase="${activemq.base}/webapps/admin" logUrlOnStart="true"/>
......
</handlers>
</jetty>
(3)Advisory Message(通过JMS消息来监控系统)
通过它,你可以得到可以得到关于JMS provider、producers、consumers和destinations的一系列信息,
如生产者,消费者启停Queue或Topic消息的信息,Queue或Topic创建或销毁的信息,过期消息等。
Destination destination = AdvisorySupport.getProducerAdvisoryTopic(destination)
MessageConsumer consumer = session.createConsumer(destination);
consumer.setMessageListener(this);
Client advisories:
ActiveMQ.Advisory.Connection
ActiveMQ.Advisory.Producer.Queue(/Topic)...
ActiveMQ.Advisory.Consumer.Queue(/Topic)...
Destination advisories
ActiveMQ.Advisory.Queue(/Topic)...
ActiveMQ.Advisory.TempQueue(/TempTopic)...
ActiveMQ.Advisory.Expired.Queue(/Topic)...
ActiveMQ.Advisory.NoConsumer.Queue(/Topic)...
(4)Command Agent
XMPP(Jabber)协议是一种基于XML的即时通信协议
<transportConnectors>
.....
<transportConnector name="xmpp" uri="xmpp://localhost:61222"/>
</transportConnectors>
启用Command Agent
<beans>
<broker useJmx="true" xmlns="http://activemq.org/config/1.0">
...
</broker>
<commandAgent xmlns="http://activemq.org/config/1.0"
brokerUser="user" brokerPassword="passward"/>
</beans>
启用了Command Agent的broker上会有一个来自Command Agent的连接,它同时订阅topic:ActiveMQ.Agent;在你启动XMPP客户端,
加入到ActiveMQ.Agent聊天室后,就可以同broker进行交谈了。通过在XMPP 客户端中键入help,可以得到帮助信息
(5)图表信息描述
ActiveMQ支持以broker插件的形式生成dot文件(可以用agrviewer来查看),以图表的方式描述connections、sessions、producers、consumers、destinations等信息
<broker xmlns="http://activemq.org/config/1.0" brokerName="localhost" useJmx="true">
...
<plugins>
<connectionDotFilePlugin file="connection.dot"/>
<destinationDotFilePlugin file="destination.dot"/>
</plugins>
</broker>
消息发送方式:
ActiveMQ支持以同步(sync)方式或者异步(async)方式向broker发送消息。针对延迟问题,使用异步发送方式会极大地提高系统的性能。
ActiveMQ缺省使用异步传输方式。但是按照JMS规范,当在事务外发送持久化消息的时候,ActiveMQ会强制使用同步发送方式。
在这种情况下,每一次发送都是同步的,而且阻塞到收到broker的应答。这个应答保证了broker已经成功地将消息持久化,
而且不会丢失。但是这样作也严重地影响了性能。
Message Cursors:
当producer发送的持久化消息到达broker之后,broker首先会把它保存在持久存储中。接下来,如果发现当前有活跃的consumer,如果这个consumer消费消息的速度能跟上producer生产消息的速度,那么ActiveMQ会直接把消息传递给broker内部跟这个 consumer关联的dispatch queue;如果当前没有活跃的consumer或者consumer消费消息的速度跟不上producer生产消息的速度,那么ActiveMQ会使用 Pending Message Cursors保存对消息的引用。
在需要的时候,Pending Message Cursors把消息引用传递给broker内部跟这个consumer关联的dispatch queue。以下是两种Pending Message Cursors:
VM Cursor:在内存中保存消息的引用。
File Cursor:首先在内存中保存消息的引用,如果内存使用量达到上限,那么会把消息引用保存到临时文件中。
在缺省情况下,ActiveMQ 会根据使用的Message Store来决定使用何种类型的Message Cursors,但是你可以根据destination来配置Message Cursors。
对于topic,可以使用的pendingSubscriberPolicy 有vmCursor和fileCursor。可以使用的PendingDurableSubscriberMessageStoragePolicy有
vmDurableCursor 和 fileDurableSubscriberCursor;对于queue,可以使用的pendingQueuePolicy有vmQueueCursor 和 fileQueueCursor。
Broker clusters:
The most common mental model of clustering in a JMS context is that there is a collection of JMS brokers and a JMS client will connect to one of them; then if the JMS broker goes down, it will auto-reconnect to another broker.We implement this using the failover:// protocol in the JMS client.
Master Slave:
The problem with running lots of stand alone brokers or brokers in a network is that messages are owned by a single physical broker at any point in time. If that broker goes down, you have to wait for it to be restarted before the message can be delivered. (If you are using non-persistent messaging and a broker goes down you generally lose your message).
The idea behind MasterSlave is that messaages are replicated to a slave broker so that even if you have catastrophic hardware failure of the master's machine, file system or data centre, you get immediate failover to the slave with no message loss.
Master Slave是目前ActiveMQ推荐的高可靠性和容错的解决方案。以下是几种不同的类型:
Pure Master Slave:
failover://(tcp://masterhost:61616,tcp://slavehost:61616)?randomize=false
设置randomize为false就可以让客户总是首先尝试连接master broker(slave broker并不会接受任何连接,直到它成为了master broker)。
工作方式:Master broker只有在消息成功被复制到slave broker之后才会响应客户;
Pure Master Slave具有以下限制:
只能有一个slave broker连接到master broker。
在因master broker失效而导致slave broker成为master之后,之前的master broker只有在当前的master broker(原slave broker)停止后才能重新生效。
Master broker失效后而切换到slave broker后,最安全的恢复master broker的方式是人工处理。首先要停止slave broker(这意味着所有的客户也要停止)。然后把slave broker的数据目录中所有的数据拷贝到master broker的数据目录中。然后重启master broker和slave broker。
Shared File System Master Slave
你可以运行多个broker,这些broker共享数据目录。当第一个broker得到文件上的排他锁之后,其它的broker便会在循环中等待获得这把锁。客户端使用failover transport来连接到可用的broker。当master broker失效的时候会释放这把锁,这时候其中一个slave broker会得到这把锁从而成为master broker。
JDBC Master Slave
JDBC Master Slave的工作原理跟Shared File System Master Slave类似,只是采用了数据库作为持久化存储
Replicated Message Stores:
An alternative to Master Slave is to have some way to replicate the message store; so for the disk files to be shared in some way. For example using a SAN or shared network drive you can share the files of a broker so that if it fails another broker can take over straight away. So by supporting a Replicated Message Store you can reduce the risk of message loss to provide either a HA backup or a full DR solution capable of surviving data centre failure.
====================================================
推荐两个简单消息服务实现
1、wjw纯java写的简单消息队列服务sqs4j,每秒可以并发8000/s,地址http://sourceforge.net/projects/sqs4j/
2、张宴的用纯C写的一个开源项目HTTPSQS,并发可以达到15000/s,地址 http://blog.s135.com/httpsqs/
两者协议一模一样,只是sqs4j用纯java实现的,网络层用的Netty,数据库层用的Berkeley
- src.rar (5 KB)
- 描述: 另一个含queue和topic的例子,接收端如果与mq服务器断开连接支持重连
- 下载次数: 253
- sqs4j.rar (3.8 MB)
- 描述: 简单消息服务-sql4j
- 下载次数: 320
- HTTPSQS.rar (2.6 MB)
- 描述: 简单消息服务-httpsqs
- 下载次数: 265
评论
想请教个问题,小弟用
2.Embedded Broker
以编码的方式启动broker:
方式启动
没有用spring,也没有用配置文件,可以发送也可以接受,
但是不能管理
http://localhost:8161/admin/
这个URL打不开,8161端口也没打开
请问怎么才能打开这个URL?
发表评论
-
linux、win下用jmx监控tomcat运行情况
2012-03-14 15:52 1630for windows: 1、add below lin ... -
[转]Java缩略图类带水印(jpg,png)
2011-08-31 09:09 1561package com.example; import ... -
swing和awt的两个简单使用
2011-08-29 13:27 12321、swing: package frame; ... -
[转]笔记:Hibernate性能优化事项(持续更新)
2011-08-27 10:38 15981、针对Oracle数据库而言 ... -
自定义classloader实现
2011-08-09 14:19 1425package classloader; import ... -
[总结篇]Java中从键盘接收一个字符
2011-05-29 21:53 2175引言 从控制台中读 ... -
利用commons-net包实现ftp上传下载例子
2011-01-19 16:50 4026下载文件的时候注意一下,第一个参数要用iso-8859_ ... -
请使用Oracle新版本驱动
2010-11-09 11:08 2564今天使用apache dbutils连接oracle10G时, ... -
关于使用JS前台加密、JAVA后台解密的RSA实现,RSA加密和签名
2010-10-25 16:07 37822需求环境: 西安项目中,客户要求保护用户的密码信息,不 ... -
使用java.net.URL实现Post数据
2010-07-20 10:38 5980实现:利用URL访问URL并传递参数,然后获取返回结果。 可 ... -
java文件锁的实现
2010-07-02 16:37 7153项目使用到集群环境,流程发送时如果确保一个流程不会被两个流程同 ... -
如何导出大数据量的Excel文件
2010-05-25 09:07 2427一般导出Excel可以选择POI或者JXL,poi比较方便但是 ... -
Log4j使用总结
2010-01-09 09:50 955一、介绍 Log4j是Apa ... -
servlet下载文件不支持迅雷的解决方法
2009-11-18 13:42 3796servlet实现下载时,如果客户端安装了迅雷,发现不能正确下 ... -
Lucene+HighLighter高亮显示实例
2009-11-03 18:37 5257今天搞了一个关于Lucene的例子,权当入门教程。网上有很多资 ... -
JAVA操作Excel参考
2009-11-03 10:33 1017Java Excel是一开放源码项目,通过它Java开发人 ... -
freemarker根据模板生成文件的编码问题
2009-10-20 15:46 2617用freemarker生成html静态文件时,涉及的编码主要有 ... -
RSS基本知识、开发相关
2009-09-27 11:43 1237RSSLibJ是一个专门读 ... -
Ant+xFire生成客户端代码实战
2009-09-12 16:41 2729生成xfire客户端有多种方式,直接调用xFire暴露的接口、 ... -
Spring中JdbcTemplate相关的几个接口
2009-09-07 16:48 19551、org.springframew ...
相关推荐
标题"**HETF-ActiveMQ入门手册.zip**"表明这是一个关于ActiveMQ的入门学习资源,可能包含详细的文档或教程,旨在帮助初学者理解并使用ActiveMQ。"HETF"可能是某个组织、项目或者教程系列的缩写。由于描述中并未提供...
Apache ActiveMQ是一个开源的消息代理,遵循Java消息服务(JMS)规范,用于在不同的应用和平台之间进行可靠的消息传递。ActiveMQ能够支持多种传输协议,并能够处理大量消息的存储和转发。 从文件【部分内容】中,...
在“activemq入门实例”中,你将学习到以下几个关键知识点: 1. **ActiveMQ的基本概念**:ActiveMQ作为JMS提供商,它提供一个服务器端(broker)来存储和转发消息,客户端则通过连接到这个服务器来发送和接收消息。...
ActiveMQ是中国最流行的开源消息中间件之一,它基于Java Message Service (JMS) 规范,为分布式系统提供高效、可靠的消息传递服务。本教程将引导你从基础到深入理解如何使用ActiveMQ,并通过实际的例子进行操作。 ...
要实现这一点,可以设置两个或多个ActiveMQ实例,通过网络连接形成集群,并配置适当的故障转移策略。 接下来,我们来创建一个简单的MQDemo1。这通常涉及编写代码来创建生产者和消费者。例如,在Java环境中,我们...
本教程将深入探讨如何将这两个强大的工具结合在一起,以创建一个简单的发送JMS消息的入门实例。 首先,我们需要理解ActiveMQ的基本概念。ActiveMQ是Apache软件基金会开发的一个开源消息代理,它实现了JMS规范,提供...
这篇博客"jms之activeMQ 队列和广播模式例子"主要面向初学者,旨在提供ActiveMQ入门级的知识,通过实例解释队列(Queue)和主题(Topic)这两种基本的消息模式。 首先,我们要理解JMS中的队列和主题的区别。队列...
【ActiveMQ入门】 Apache ActiveMQ 是一款开源的Java消息服务(JMS)提供商,属于Apache软件基金会的一员。它遵循JMS 1.1规范,旨在为分布式系统中的应用程序提供高效、可靠的异步通信。ActiveMQ的特性使得它成为...
本实例旨在引导初学者了解并熟悉ActiveMQ的基本概念、安装配置以及使用方法。 一、ActiveMQ概述 ActiveMQ是一个高性能、灵活且功能丰富的消息代理,支持多种消息协议,如OpenWire、STOMP、AMQP、MQTT等,使得不同...
本教程将引导你通过一个简单的入门案例了解如何使用ActiveMQ实现生产者与消费者的模式。 首先,我们需要了解ActiveMQ的基本概念。在消息队列中,生产者是发送消息的实体,而消费者则是接收和处理这些消息的实体。...
**ActiveMQ实践入门指南** Apache ActiveMQ是一款开源的消息中间件,它是Java消息服务(JMS)的实现...阅读提供的"ActiveMQ实践入门指南.pdf"文件,将为你提供更详细的步骤和实例,助你进一步提升ActiveMQ的应用技能。
实例中可能涉及到的消息网关配置,如ActiveMQ,是JMS实现的核心组件。ActiveMQ是Apache软件基金会开发的一个开源消息中间件,提供高可靠性的消息传递服务。在运行这些程序之前,我们需要先启动ActiveMQ服务器,并...
【ActiveMQ使用入门】 ActiveMQ是一款基于Java的消息中间件,它是Apache基金会的开源项目,也是最早的JMS(Java消息服务)实现之一。JMS是一种标准,定义了在Java环境中访问消息中间件的接口,但并未具体实现。...
在本文中,我们将深入探讨如何使用Maven构建一个基于ActiveMQ的简单实例。ActiveMQ是Apache软件基金会开发...这个实例可以帮助初学者快速理解和入门ActiveMQ的基本用法,为进一步探索分布式系统中的消息通信打下基础。
在这个"spring jms tomcat 异步消息传递入门实例"中,我们将探讨如何在Spring框架下利用JMS和Tomcat实现异步消息传递,以提高系统性能和可扩展性。 首先,理解异步消息传递的概念至关重要。在同步通信中,发送方...
Apache ActiveMQ是业界广泛...通过这个入门教程,你应该能够了解如何安装、配置和使用ActiveMQ,以及其与JMS的关联。继续深入学习,你将掌握更多关于消息中间件的高级特性和最佳实践,为你的项目带来更高效的解决方案。
要实现集群,需要配置ActiveMQ的网络连接器、代理策略等,这超出了这个入门实例的范围。 总结来说,这个ActiveMQ实例主要展示了如何在Java环境中创建一个简单的消息发送者,以及如何利用ActiveMQ的基本功能。要深入...