Chapter 43. 嵌入式HornetQ

HornetQ是由简单传统Java对象(POJO)实现,因此它可以在任何依赖注入的框架中运行,比如JBoss Microcontainer,Sprint或Google Guice。另外如果你的应用程序内部需要消息功能,你可以在程序中 直接实例化HornetQ的客户端或服务器端。我们称之为嵌入式 HornetQ。

有些应用需要高性能、事务性及持久化的消息服务,但是又不希望自己去费时费力实现它。于是嵌入式HornetQ就 成为了一个很适当的选择。

要使用嵌入式HornetQ只需要几个简单的步骤。首先初始化配置对象,再初始化服务器并启动它,在你的虚拟机 中就运行越来了一个HornetQ服务器。就是这么简单。

43.1. POJO的初始化

按照以下步骤去做:

创建配置对象--这个对象包装了HornetQ的配置信息。如果你想使用配置文件,则使用FileConfigurationImpl

import org.hornetq.core.config.Configuration;
import org.hornetq.core.config.impl.FileConfiguration;

...


Configuration config = new FileConfiguration();
config.setConfigurationUrl(urlToYourconfigfile);
config.start();

如果不需要配置文件,可以用ConfigurationImpl,只要将其中的各种配置参数设置好 即可。如添加适当的接收器。

ConfigurationImpl用来配置接收器。和主要配置文件相似,只需要添加 NettyAcceptorFactory即可。

import org.hornetq.core.config.Configuration;
import org.hornetq.core.config.impl.ConfigurationImpl;

...

Configuration config = new ConfigurationImpl();
HashSet<TransportConfiguration> transports = new HashSet<TransportConfiguration>();
      
transports.add(new TransportConfiguration(NettyAcceptorFactory.class.getName()));
transports.add(new TransportConfiguration(InVMAcceptorFactory.class.getName()));

config.setAcceptorConfigurations(transports);

接着就需要初始化并启动HornetQ服务。org.hornetq.api.core.server.HornetQ类有一些静态方法可用来创建HornetQ服务器。

import org.hornetq.api.core.server.HornetQ;
import org.hornetq.core.server.HornetQServer;

...

HornetQServer server = HornetQ.newHornetQServer(config);

server.start();

你还可以直接实例化HornetQServerImpl

HornetQServer server = 
        new HornetQServerImpl(config);
server.start();

43.2. 使用依赖注入框架

你还可以使用一个依赖注入框架来启动HornetQ,比如JBoss Microcontainer™或Spring框架™。

HornetQ独立服务器使用的是JBoss Microcontainer作为其框架。在HornetQ的发布中包括的HornetQBootstrapServerhornetq-beans.xml文件共同实现了 在JBoss Microcontainer中对HornetQ服务器的引导。

要使用JBoss Microcontainer,需要在xml文件中声明HornetQServerConfiguration对象。另外还可以注入一个安全管理器和一个MBean服务器。但是这些 注入是可选的。

下面是一个基本的JBoss Microcontainer的XML Bean的声明:

<?xml version="1.0" encoding="UTF-8"?>

<deployment xmlns="urn:jboss:bean-deployer:2.0">
   
   <!-- The core configuration -->
   <bean name="Configuration" 
         class="org.hornetq.core.config.impl.FileConfiguration">
   </bean>

   	<!-- The core server -->
   <bean name="HornetQServer" 
         class="org.hornetq.core.server.impl.HornetQServerImpl">      
      <constructor>
         <parameter>
            <inject bean="Configuration"/>
         </parameter>            
      </constructor>         
   </bean>
   </deployment>

HornetQBootstrapServer实现了JBoss Microcontainer的简单封装。

HornetQBootstrapServer bootStrap = 
        new HornetQBootstrapServer(new String[] {"hornetq-beans.xml"});
        bootStrap.run();

43.3. 连接嵌入式HornetQ

嵌入式HornetQ的连接和普通的连接一样要创建连接工厂:

43.3.1. 核心接口

使用核心接口,需要创建一个ClientSessionFactory然后正常建立连接。

ClientSessionFactory nettyFactory =  HornetQClient.createClientSessionFactory(
                                        new TransportConfiguration(
                                           InVMConnectorFactory.class.getName()));

ClientSession session = factory.createSession();

session.createQueue("example", "example", true);

ClientProducer producer = session.createProducer("example");

ClientMessage message = session.createMessage(true);

message.getBody().writeString("Hello");

producer.send(message);

session.start();

ClientConsumer consumer = session.createConsumer("example");

ClientMessage msgReceived = consumer.receive();

System.out.println("message = " + msgReceived.getBody().readString());

session.close();

43.3.2. JMS接口

使用JMS接口连接嵌入HornetQ同样简单。只需要直接实例化 ConnectionFactory即可。如下面例子所示:

ConnectionFactory cf =
    HornetQJMSClient.createConnectionFactory(
       new TransportConfiguration(InVMConnectorFactory.class.getName()));

Connection conn = cf.createConnection();

conn.start();

Session sess = conn.createSession(true, Session.SESSION_TRANSACTED);

MessageProducer prod = sess.createProducer(queue);

TextMessage msg = sess.createTextMessage("Hello!");

prod.send(msg);

sess.commit();

MessageConsumer consumer = sess.createConsumer(queue);

TextMessage txtmsg = (TextMessage)consumer.receive();

System.out.println("Msg = " + txtmsg.getText());

sess.commit();

conn.close();

43.4. JMS嵌入式HornetQ的例子

有关如何设置与运行JMS嵌入式HornetQ的例子请参见Section 11.2.1, “嵌入式”