Hornetq 版本2.4.0final  需要JDK7及以上

Hornetq官网

Hornetq2.1中文手册

step1.启动服务端

  1.1准备配置文件(配置说明参考官网手册)

  hornetq-configuration.xml

  

  1. <configuration xmlns="urn:hornetq"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="urn:hornetq /schema/hornetq-configuration.xsd">
  4. <!--
  5. <broadcast-groups> <broadcast-group name="my-broadcast-group">
  6. <local-bind-address>192.168.0.215</local-bind-address>
  7. <local-bind-port>11212</local-bind-port>
  8. <group-address>255.255.255.0</group-address>
  9. <group-port>9876</group-port>
  10. <broadcast-period>2000</broadcast-period> </broadcast-group>
  11. </broadcast-groups>
  12. -->
  13. <name>HornetQ.main.config</name>
  14.  
  15. <bindings-directory>F:/hornetq/data/messaging/bindings</bindings-directory>
  16.  
  17. <large-messages-directory>F:/hornetq/data/messaging/largemessages</large-messages-directory>
  18.  
  19. <paging-directory>F:/hornetq/data/messaging/paging</paging-directory>
  20.  
  21. <!--离线消息固化到文件-->
  22. <journal-directory>F:/hornetq/journal</journal-directory>
  23. <journal-min-files>10</journal-min-files>
  24. <!-- 缓存大小 -->
  25. <id-cache-size>9000</id-cache-size>
  26. <jmx-management-enabled>true</jmx-management-enabled>
  27. <!-- 消息计数器 -->
  28. <message-counter-enabled>true</message-counter-enabled>
  29. <!-- keep history for a week -->
  30. <message-counter-max-day-history>7</message-counter-max-day-history>
  31. <!-- sample the queues every minute (60000ms) -->
  32. <message-counter-sample-period>60000</message-counter-sample-period>
  33. <persistence-enabled>true</persistence-enabled>
  34. <!-- 通知将从JMS话题 "notificationsTopic"上接收
  35. <management-notification-address>jms.queue.notificationsQueue</management-notification-address>
  36. -->
       <!--不配置这个的话会有一个安全警告-->
  37. <cluster-user>HORNETQ.CLUSTER.ADMIN.USER</cluster-user>
  38. <cluster-password>test65525</cluster-password>
  39.  
  40. <!-- Connectors -->
  41. <connectors>
  42. <connector name="connector-netty">
  43. <factory-class>org.hornetq.core.remoting.impl.netty.NettyConnectorFactory
  44. </factory-class>
  45. <param key="use-nio" value="true" />
  46. <param key="host" value="localhost"/>
  47. <param key="port" value="11212" />
  48. </connector>
  49.  
  50. <!-- SSL connector -->
  51. <connector name="netty-ssl-connector">
  52. <factory-class>org.hornetq.core.remoting.impl.netty.NettyConnectorFactory</factory-class>
  53. <param key="host" value="localhost"/>
  54. <param key="port" value="5500"/>
  55. <param key="ssl-enabled" value="true"/>
  56. <param key="key-store-path" value="F:/ssl/keystore"/>
  57. <param key="key-store-password" value="test"/>
  58. </connector>
  59. </connectors>
  60.  
  61. <!-- Acceptors -->
  62. <acceptors>
  63. <acceptor name="netty">
  64. <factory-class>org.hornetq.core.remoting.impl.netty.NettyAcceptorFactory
  65. </factory-class>
  66. <!-- -->
  67. <param key="use-nio" value="true" />
  68. <param key="host" value="0.0.0.0,127.0.0.1,localhost"></param>
  69. <param key="port" value="11212" />
  70. </acceptor>
  71.  
  72. <!-- SSL connector -->
  73. <acceptor name="netty-ssl-acceptor">
  74. <factory-class>org.hornetq.core.remoting.impl.netty.NettyAcceptorFactory</factory-class>
  75. <param key="host" value="localhost"/>
  76. <param key="port" value="5500"/>
  77. <param key="ssl-enabled" value="true"/>
  78. <param key="key-store-path" value="F:/ssl/keystore"/>
  79. <param key="key-store-password" value="test"/>
  80. <param key="trust-store-path" value="F:/ssl/truststore"/>
  81. <param key="trust-store-password" value="test"/>
  82. </acceptor>
  83. </acceptors>
  84.  
  85. <!-- Other config -->
  86. <address-settings>
  87. <address-setting match="jms.queue.#">
  88. <redelivery-delay>5000</redelivery-delay>
  89. <!-- 没有导致远程queue查找不到 -->
  90. <expiry-address>jms.queue.expiryQueue</expiry-address>
  91. <!-- 没有导致远程queue查找不到 -->
  92. <last-value-queue>true</last-value-queue>
  93. <max-size-bytes>100000</max-size-bytes>
  94. <page-size-bytes>20000</page-size-bytes>
  95. <redistribution-delay>0</redistribution-delay>
  96. <address-full-policy>PAGE</address-full-policy>
  97. <!-- 死信地址-->
  98. <send-to-dla-on-no-route>true</send-to-dla-on-no-route>
  99. <dead-letter-address>jms.queue.deadLetterQueue</dead-letter-address>
  100. <max-delivery-attempts>3</max-delivery-attempts>
  101. </address-setting>
  102. </address-settings>
  103.  
  104. <security-settings>
  105. <!--security for example queue-->
  106. <security-setting match="jms.queue.#">
  107. <permission type="createDurableQueue" roles="guest" />
  108. <permission type="deleteDurableQueue" roles="guest" />
  109. <permission type="createNonDurableQueue" roles="guest" />
  110. <permission type="deleteNonDurableQueue" roles="guest" />
  111. <permission type="consume" roles="guest" />
  112. <permission type="send" roles="guest" />
  113. </security-setting>
  114. </security-settings>
  115.  
  116. </configuration>

hornetq-jms.xml

  1. <configuration xmlns="urn:hornetq"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="urn:hornetq /schema/hornetq-jms.xsd">
  4.  
  5. <connection-factory name="ConnectionFactory">
  6. <connectors>
  7. <!--对应hornetq-configuration.xml 里面的connectors-->
  8. <connector-ref connector-name="connector-netty" />
  9. </connectors>
  10. <entries>
  11. <entry name="ConnectionFactory" />
  12. <entry name="/ConnectionFactory" />
  13. <entry name="XAConnectionFactory" />
  14. <entry name="/XAConnectionFactory" />
  15. <entry name="java:/ConnectionFactory"/>
  16. <entry name="java:/XAConnectionFactory"/>
  17. </entries>
  18.  
  19. <retry-interval>1000</retry-interval>
  20. <retry-interval-multiplier>1.5</retry-interval-multiplier>
  21. <max-retry-interval>60000</max-retry-interval>
  22. <reconnect-attempts>1000</reconnect-attempts>
  23. <confirmation-window-size>1048576</confirmation-window-size>
  24. </connection-factory>
  25.  
  26. <!--jms address-->
  27. <queue name="notificationsQueue">
  28. <entry name="/queue/notificationsQueue"></entry>
  29. </queue>
  30. <queue name="testQueue">
  31. <entry name="/queue/testQueue"/>
  32. <selector string="color='red'"/>
  33. <durable>true</durable>
  34. </queue>
  35. <!-- the dead letter queue where dead messages will be sent-->
  36. <queue name="deadLetterQueue">
  37. <entry name="/queue/deadLetterQueue"/>
  38. </queue>
  39.  
  40. </configuration>

1.2 启动hornetq服务

  1. public static void startHornetqServer(){
  2. try {
  3. //config hornetq-configuration.xml
  4. FileConfiguration config = new FileConfiguration();
  5. config.start();
  6. //HornetQServer
  7. HornetQServer server=HornetQServers.newHornetQServer(config);
  8. //JNPServer
  9. StandaloneNamingServer standalone=new StandaloneNamingServer(server);
  10. standalone.setBindAddress("0.0.0.0");
  11. standalone.setRmiBindAddress("0.0.0.0");
  12. standalone.start();
  13. //JMSServer hornetq-jms.xml
  14. jmsServer=new JMSServerManagerImpl(server);
  15. jmsServer.start();
  16. //start hornetq core server
  17. server.start();
  18. System.out.println(jmsServer.isStarted());
  19. } catch (Exception e) {
  20. e.printStackTrace();
  21. }
  22. }

step2.发送消息客户端

  1. /**
  2. * @param args
  3. */
  4. public static void main(String[] args) {
  5. try {
  6. Properties prop = new Properties();
  7. prop.setProperty("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
  8. prop.setProperty("java.naming.provider.url", "jnp://127.0.0.1:1099");
  9. prop.setProperty("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces");
  10. prop.setProperty(Context.SECURITY_PRINCIPAL,"guest");
  11. prop.setProperty(Context.SECURITY_CREDENTIALS, "guest");
  12.  
  13. Context ctx = new InitialContext(prop);
  14. System.out.println("+++++++1111ssssssss");
  15. //查找目标地址
  16. Destination destination = (Destination)ctx.lookup("/queue/notificationsQueue");
  17. System.out.println("+++++++2222"+destination);
  18.  
  19. //根据上下文查找一个连接工厂 QueueConnectionFactory 。
  20. //该连接工厂是由JMS提供的,不需我们自己创建,每个厂商都为它绑定了一个全局JNDI,我们通过它的全局JNDI便可获取它;
  21. //ConnectionFactory 对应hornetq-jms.xml里面的 connection-factory name="ConnectionFactory"
  22. ConnectionFactory factory = (ConnectionFactory)ctx.lookup("ConnectionFactory");
  23. System.out.println("+++++++3333"+factory);
  24. //从连接工厂得到一个连接 create QueueConnection
  25. Connection conn = factory.createConnection();
  26. System.out.println("+++++++4444"+conn);
  27. conn.start();
  28.  
  29. //通过连接来建立一个会话(Session);
  30. javax.jms.Session session = conn.createSession(true,Session.AUTO_ACKNOWLEDGE);
  31.  
  32. //根据会话以及目标地址来建立消息生产者MessageProducer (QueueSender和TopicPublisher都扩展自MessageProducer接口)
  33. MessageProducer producer = session.createProducer(destination);
  34. TextMessage msg = session.createTextMessage("ffffffffffffffffffffffffffffffffffffffffffffff小心呈现出");
  35. BytesMessage byteMessage=session.createBytesMessage();
  36. byteMessage.writeBytes("testddddddddd".getBytes("utf-8"));
  37. producer.send(msg);
  38. producer.send(byteMessage);
  39. System.out.println("send over !!!!!");
  40. session.close();
  41. conn.close();
  42. System.out.println("send down===");
  43. } catch (Exception e) {
  44. e.printStackTrace();
  45. }
  46.  
  47. }

step3.接受消息客户端

  1. public MessageReceive(String ...destinationJNDI){
  2.  
  3. QueueConnectionFactory factory=(QueueConnectionFactory)getJNDIRemoteObj("ConnectionFactory");
  4. try {
  5. if(factory==null)
  6. return;
  7. connection = factory.createConnection();
  8. session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
  9. connection.start();
  10. for (int i = 0; i < destinationJNDI.length; i++) {
  11. destination = (Queue) getJNDIRemoteObj(destinationJNDI[i]);
  12. if(destination==null)
  13. continue;
  14. producer = session.createConsumer(destination);
  15. //接受消息
  16. producer.setMessageListener(new ReceiveMessage());
  17. }
  18. } catch (JMSException e) {
  19. e.printStackTrace();
  20. }
  21. }
  1. public static Object getJNDIRemoteObj(String jndiName) {
  2. try {
  3. Properties prop = new Properties();
  4. prop.setProperty("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
  5. prop.setProperty("java.naming.provider.url", "jnp://127.0.0.1:1099");
  6. prop.setProperty("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces");
  7. prop.setProperty(Context.SECURITY_PRINCIPAL,"guest");
  8. prop.setProperty(Context.SECURITY_CREDENTIALS, "guest");
  9. Context context = new InitialContext(prop);
  10. return context.lookup(jndiName);
  11. } catch (NamingException e) {
  12. e.printStackTrace();
  13. }
  14. return null;
  15. }
  1. public class ReceiveMessage implements MessageListener {
  2.  
  3. @SuppressWarnings("deprecation")
  4. @Override
  5. public void onMessage(Message message) {
  6. System.out.println("Received notification:"+new Date().toLocaleString());
  7. try
  8. {
  9. // Enumeration propertyNames = message.getPropertyNames();
  10. // while (propertyNames.hasMoreElements())
  11. // {
  12. // String propertyName = (String)propertyNames.nextElement();
  13. // System.err.format(" %s: %s\n", propertyName, message.getObjectProperty(propertyName));
  14. // }
  15. HornetQDestination des=(HornetQDestination) message.getJMSDestination();
  16. if(message instanceof TextMessage){
  17. TextMessage mesg=(TextMessage)message;
  18. System.out.println(des.getAddress()+"==received:"+mesg.getText());
  19. }else if(message instanceof BytesMessage){
  20. BytesMessage mesg=(BytesMessage)message;
  21. ByteArrayOutputStream out=new ByteArrayOutputStream(((Long)mesg.getBodyLength()).intValue());
  22. try {
  23. byte[] r=new byte[2048];
  24. int i=0;
  25. while((i=mesg.readBytes(r))!=-1)
  26. out.write(r,0,i);
  27. System.out.println(des.getClass()+"==received:"+new String(out.toByteArray(),"utf-8"));
  28. } catch (UnsupportedEncodingException e) {
  29. e.printStackTrace();
  30. }
  31. try {
  32. out.close();
  33. } catch (IOException e) {
  34. e.printStackTrace();
  35. }
  36. }
  37. if(message instanceof HornetQObjectMessage){
  38. HornetQObjectMessage object=(HornetQObjectMessage)message;
  39. Object msgObj=object.getObject();
  40. if(msgObj instanceof ErrorMessageBO){
  41. ErrorMessageBO messageBO=(ErrorMessageBO)msgObj;
  42. String msg=messageBO.getMessageContent();
  43. System.err.println("error:==>"+msg);
  44. }
  45. }
  46.  
  47. }
  48. catch (JMSException e)
  49. {
  50. e.printStackTrace();
  51. }
  52. System.out.println("----------end--------------");
  53.  
  54. }

hornetq 入门(1)的更多相关文章

  1. JMS(Java消息服务)入门教程

    什么是Java消息服务 Java消息服务指的是两个应用程序之间进行异步通信的API,它为标准消息协议和消息服务提供了一组通用接口,包括创建.发送.读取消息等,用于支持JAVA应用程序开发.在J2EE中 ...

  2. Spring Boot从入门到精通之:一、Spring Boot简介及快速入门

    Spring Boot Spring Boot 简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来 ...

  3. Netty入门教程——认识Netty

    什么是Netty? Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架. Netty 是一个广泛使用的 Java 网络编程框架(N ...

  4. Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求

    上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...

  5. ABP入门系列(1)——学习Abp框架之实操演练

    作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...

  6. Oracle分析函数入门

    一.Oracle分析函数入门 分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计 ...

  7. Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数

    上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...

  8. Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数

    上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...

  9. Angular2入门系列教程4-服务

    上一篇文章 Angular2入门系列教程-多个组件,主从关系 在编程中,我们通常会将数据提供单独分离出来,以免在编写程序的过程中反复复制粘贴数据请求的代码 Angular2中提供了依赖注入的概念,使得 ...

随机推荐

  1. 20145102 《Java程序设计》第5周学习总结

    20145102 <Java程序设计>第5周学习总结 教材学习内容总结 数组在内存中会是连续的线性空间,根据索引随机取回时速度快,如果操作上有这类需求时,像是排序,就可以使用;ArrayL ...

  2. [转]在PHP语言中使用JSON

    本文转自:http://www.ruanyifeng.com/blog/2011/01/json_in_php.html 作者: 阮一峰 日期: 2011年1月14日 目前,JSON已经成为最流行的数 ...

  3. C#基础回顾以及if语句

    一.输入和输出Console.Write("字符串")Console.WriteLine("字符串")string s = Console.ReadLine() ...

  4. IntelliJ IDEA 中集成使用git(2015年06月10日)

    前提:需要有一个git账号,https://github.com/ 1.首先需要下载一个Github,https://windows.github.com 安装之后的界面是酱紫的,非常简洁美观 2.在 ...

  5. 【NodeJS】---express配置ejs mongoose route等

    express创建项目 命令行下: express prj_name cd prj_name && npm install ejs html var ejs = require('ej ...

  6. iOS UILable高度自适应

    适用于iOS6以后 NSString *tip = @"UILable高度自适应,UILable高度自适应,UILable高度自适应"; UILabel label_2 = [[U ...

  7. android View 绘制完成监听

    <span style="font-size:18px">//view重绘时回调 view.getViewTreeObserver().addOnDrawListene ...

  8. Oracle在所有内容前追加一些内容的方法

     参照下面的sql语句. SQL> SELECT * FROM UserInfo; NAME                    CHINESE -------------------- ...

  9. Ajax Array Json 示例

    function functionName(){ var list=new Array(); $("td.classA").each(function(){ list.push($ ...

  10. Cocos2d-JS中的cc.LabelTTF

    cc.LabelTTF是使用系统中的字体,它是最简单的标签类.cc.LabelTTF类图如下图所示,可以cc.LabelTTF继承了cc.Node类,具有cc.Node的基本特性. LabelTTF类 ...