# Spring3 Hornetq 独立集成示例 > 原文: [https://howtodoinjava.com/hornetq/spring-3-hornetq-standalone-integration-example/](https://howtodoinjava.com/hornetq/spring-3-hornetq-standalone-integration-example/) [**HornetQ**](http://hornetq.jboss.org "hornetq") 是一个开放源代码项目,旨在构建多协议,可嵌入,非常高性能的集群异步消息传递系统。 到目前为止,我们已经了解了[**配置 hornetq 独立服务器**](//howtodoinjava.com/hornetq/hornetq-stand-alone-server-example-using-maven/ "Hornetq stand alone server example using maven")和[**设置基本消息传递功能**](//howtodoinjava.com/hornetq/basic-jms-messaging-example-using-hornetq-stand-alone-server/ "Basic jms messaging example using hornetq stand alone server")的示例。 HornetQ 具有很大的灵活性,可以通过一些现有的应用框架进行配置。 在此序列中,我将展示 HornetQ 在 [**Spring3**](//howtodoinjava.com "Spring3 tutorials") 中的用法。 让我们逐步进行所有设置。 步骤 1)[创建一个 Maven 项目](//howtodoinjava.com/maven/create-a-simple-java-project-using-maven/ "Create a simple java project using maven")并将其转换为 Eclipse Java 项目。 步骤 2)使用 Spring3 和 hornetq 依赖项更新 maven 仓库。 ```java 4.0.0 com.howtodoinjava.app Spring3HornetQStandaloneIntegration jar 1.0-SNAPSHOT Spring3HornetQStandaloneIntegration http://maven.apache.org 3.0.5.RELEASE commons-logging commons-logging 1.1.1 log4j log4j 1.2.14 junit junit 4.7 test org.hornetq hornetq-core 2.0.0.GA compile org.hornetq hornetq-jms 2.0.0.GA compile org.hornetq hornetq-logging 2.0.0.GA compile org.hornetq hornetq-transports 2.0.0.GA compile org.jboss.netty netty 3.1.0.GA org.jboss.javaee jboss-jms-api 1.1.0.GA compile org.jboss jboss-common-core 2.2.10.GA org.jboss.logging jboss-logging-spi 2.0.5.GA org.springframework spring-core ${org.springframework.version} org.springframework spring-expression ${org.springframework.version} org.springframework spring-beans ${org.springframework.version} org.springframework spring-aop ${org.springframework.version} org.springframework spring-context ${org.springframework.version} org.springframework spring-context-support ${org.springframework.version} org.springframework spring-tx ${org.springframework.version} org.springframework spring-jdbc ${org.springframework.version} org.springframework spring-orm ${org.springframework.version} org.springframework spring-oxm ${org.springframework.version} org.springframework spring-web ${org.springframework.version} org.springframework spring-webmvc ${org.springframework.version} org.springframework spring-webmvc-portlet ${org.springframework.version} org.springframework spring-test ${org.springframework.version} test ``` 步骤 3)在`lib`文件夹中添加两个其他 jar。 如果时间允许,请找到它们的 Maven 依赖项并添加`pom.xml`。 * `jnpserver-5.0.3.GA.jar` * `org.springframework.jms-3.0.5.RELEASE.jar` 步骤 4)从 jboss 发行版复制以下文件,并将其放在类路径中。 或者,只需复制下面给出的文件。 **`hornetq-configuration.xml`** ```java org.hornetq.integration.transports.netty.NettyConnectorFactory org.hornetq.integration.transports.netty.NettyAcceptorFactory jms.queue.DLQ jms.queue.ExpiryQueue 0 -1 10485760 10 ${hornetq.data.dir}/paging ${hornetq.data.dir}/bindings ${hornetq.data.dir}/journal ${hornetq.data.dir}/large-messages ``` **`hornetq-jms.xml`** ```java ``` **`hornetq-users.xml`** ```java ``` 步骤 5)在类路径中复制`jndi.properties`。 ```java java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces ``` 步骤 6)配置记录器,以更好地捕获信息。 ```java # Create a STDOUT appender log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout log4j.appender.STDOUT.layout.ConversionPattern=%05p | %m%n # Default everything to WARN log4j.rootCategory=WARN, STDOUT # Enable this application log level to the lowest. log4j.category.com.howtodoinjava=TRACE log4j.category.org.jnp.server=INFO log4j.category.org.hornetq=INFO log4j.category.org.springframework=INFO ``` 步骤 7)到目前为止,已经配置了 hornetq 服务器和 jndi。 现在,将它们插入`spring.xml`和`spring.properties`中的 spring 框架。 **`spring.xml`** ```java ``` **`spring.properties`** ```java hornetq.data.dir=${hornetq.spring.examples.home}/hornetq-data org.hornetq.logger-delegate-factory-class-name=org.hornetq.integration.logging.Log4jLogDelegateFactory ``` 步骤 8)首先加载 Spring 容器。 它还将验证我们所有的配置文件。 **`SpringContainerLoader.java`** ```java package com.howtodoinjava.hornetq.demo; import org.springframework.context.support.FileSystemXmlApplicationContext; public class SpringContainerLoader { public static FileSystemXmlApplicationContext loadEnvironment() { final FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext("classpath:config/server/spring.xml"); context.registerShutdownHook(); context.start(); return context; } } ``` 步骤 8)现在,我将编写消息生产者和消息使用者客户端。 **`MessageProducerClient.java`** ```java package com.howtodoinjava.hornetq.demo; import javax.jms.JMSException; import javax.jms.MessageProducer; import javax.jms.Session; import javax.jms.TextMessage; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.jms.core.JmsTemplate; import org.springframework.jms.core.ProducerCallback; public class MessageProducerClient implements Runnable { private static Log log = LogFactory.getLog(MessageProducerClient.class); private static int counter = 1; private JmsTemplate jmsTemplate; public void setJmsTemplate(JmsTemplate jmsTemplate) { this.jmsTemplate = jmsTemplate; } @Override public void run() { jmsTemplate.execute("ExampleQueue", new ProducerCallback() { @Override public Object doInJms(Session session, MessageProducer producer) throws JMSException { while (true) { TextMessage msg = session.createTextMessage("Message number : " + counter++); log.trace("Sending msg: " + msg); producer.send(msg); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } } }); } } ``` **`MessageConsumerClient.java`** ```java package com.howtodoinjava.hornetq.demo; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageConsumer; import javax.jms.Queue; import javax.jms.Session; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.jms.core.JmsTemplate; import org.springframework.jms.core.SessionCallback; public class MessageConsumerClient implements Runnable { private static Log log = LogFactory.getLog(MessageConsumerClient.class); private JmsTemplate jmsTemplate; public void setJmsTemplate(JmsTemplate jmsTemplate) { this.jmsTemplate = jmsTemplate; } @Override public void run() { log.info("Message Consumer is just started !!"); boolean startConn = true; jmsTemplate.execute(new SessionCallback() { @Override public Object doInJms(Session session) throws JMSException { Queue queue = session.createQueue("ExampleQueue"); MessageConsumer consumer = session.createConsumer(queue); while (true) { Message msg = consumer.receive(); log.trace("Received msg: " + msg); } } }, startConn); } } ``` 步骤 9)现在该测试整个代码和消息传递功能了。 **`HornetQMessagingTest.java`** ```java package com.howtodoinjava.hornetq.demo; import org.springframework.context.ApplicationContext; public class HornetQMessagingTest { public static void main(String[] args) throws InterruptedException { //Load configurations ApplicationContext context = SpringContainerLoader.loadEnvironment(); //Start the message producer new Thread((Runnable)context.getBean("messageProducerClient")).start(); //Start the message consumer new Thread((Runnable)context.getBean("messageConsumerClient")).start(); } } ``` 在测试类之上运行会在下面生成日志,以验证 Spring3 和 hornetq 集成成功。 ```java INFO | Refreshing org.springframework.context.support.FileSystemXmlApplicationContext@aa9835: startup date [Mon Mar 25 09:23:26 IST 2013]; root of context hierarchy INFO | Loading XML bean definitions from class path resource [config/server/spring.xml] INFO | Loading properties file from class path resource [config/server/spring.properties] INFO | Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1b4fad5: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.beans.factory.config.PropertyPlaceholderConfigurer#0,namingServerImpl,namingServer,mbeanServer,fileConfiguration,hornetQSecurityManagerImpl,hornetQServerImpl,jmsServerManagerImpl,connectionFactory,jmsTemplate,messageProducerClient,messageConsumerClient]; root of factory hierarchy 25 Mar, 2013 9:23:28 AM org.hornetq.core.logging.impl.JULLogDelegate info INFO: live server is starting.. 25 Mar, 2013 9:23:28 AM org.hornetq.core.logging.impl.JULLogDelegate warn WARNING: AIO wasn't located on this platform, it will fall back to using pure Java NIO. If your platform is Linux, install LibAIO to enable the AIO journal 25 Mar, 2013 9:23:28 AM org.hornetq.core.logging.impl.JULLogDelegate info INFO: Using NIO Journal 25 Mar, 2013 9:23:28 AM org.hornetq.core.logging.impl.JULLogDelegate warn WARNING: Security risk! It has been detected that the cluster admin user and password have not been changed from the installation default. Please see the HornetQ user guide, cluster chapter, for instructions on how to do this. 25 Mar, 2013 9:23:30 AM org.hornetq.core.logging.impl.JULLogDelegate info INFO: Started Netty Acceptor version 3.1.5.GA-r1772 25 Mar, 2013 9:23:30 AM org.hornetq.core.logging.impl.JULLogDelegate info INFO: HornetQ Server version 2.0.0.GA (Hornet Queen, 113) started INFO | Message Consumer is just started !! TRACE | Sending msg: HornetQMessage[null]:PERSISTENT TRACE | Received msg: HornetQMessage[ID:8e74da0e-94ff-11e2-bbba-002564ac1704:0000000000000000]:PERSISTENT TRACE | Sending msg: HornetQMessage[null]:PERSISTENT TRACE | Received msg: HornetQMessage[ID:8e74da0e-94ff-11e2-bbba-002564ac1704:1000000000000000]:PERSISTENT TRACE | Sending msg: HornetQMessage[null]:PERSISTENT TRACE | Received msg: HornetQMessage[ID:8e74da0e-94ff-11e2-bbba-002564ac1704:2000000000000000]:PERSISTENT TRACE | Sending msg: HornetQMessage[null]:PERSISTENT TRACE | Received msg: HornetQMessage[ID:8e74da0e-94ff-11e2-bbba-002564ac1704:3000000000000000]:PERSISTENT ``` 如有任何问题,请先确认以下几点: * 所有配置文件都在类路径中。 * lib 文件夹中存在的两个 jar 文件包含在类路径中。 作为参考,我给出了目录结构的快照。 ![Spring3 + hornetq standalone integration](img/813048193c1c4c327b87ccb10a624363.png) [**源代码下载**](https://docs.google.com/file/d/0B7yo2HclmjI4ME5IN3ZhNHU1Q1E/edit?usp=sharing "Spring3 hornetq integration source code download") **祝您学习愉快!**