2

数日間、ネットでいくつかのドキュメントと投稿を行ってきましたが、正しく構成できませんでした。

私はスタンドアロン環境で作業しており、Spring3.1 アプリケーションに単純に HornetQ を統合しようとしています。

Hornetq 固有の xml もいくつか変更する必要があることはわかっています。

私のパズルにはいつも何かが欠けているようです。

完全で単純な作業サンプルはありますか?

どうもありがとう、レイ。

4

1 に答える 1

2

HornetQを組み込みJMSサーバーとして使用していますか、それともJBossで使用していますか?どちらの場合も、2つの異なる答えになります。埋め込まれたケースに関連するニコラスの答え。

スタンドアロン環境で作業していると言うので、Jbossに統合されたHornetQを使用していると思います。したがって、SpringにJMSを統合するのではなく、EJBやMDBなどのEE機能を使用することをお勧めします。それは簡単に構成可能で、すでにそこにあります。必要なのは、それを適切に構成し、コンシューマー用にMDBを作成し、initSpring構成用に@SingletonEJBを作成することです。

これが実際の例ですロシア語のオリジナル
編集 だから、フルバージョン:

  1. HornetQ構成。ここにinVmコネクタ付きのシンプルなバージョンを入れましたが、後でnettyに変更できます。

hornetq-configuration.xml:

<configuration xmlns="urn:hornetq"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="urn:hornetq/schema/hornetq-configuration.xsd">

    <persistence-enabled>false</persistence-enabled>
    <create-bindings-dir>true</create-bindings-dir>
    <create-journal-dir>true</create-journal-dir>
    <!--<create-paging-dir>true</create-paging-dir>-->

    <journal-directory>/tmp/journal</journal-directory>
    <paging-directory>/tmp/paging</paging-directory>
    <bindings-directory>/tmp/binding</bindings-directory>
    <!-- disable security -->
    <security-enabled>false</security-enabled>
    <!-- Connectors -->

    <connectors>
        <connector name="in-vm">
            <factory-class>org.hornetq.core.remoting.impl.invm.InVMConnectorFactory</factory-class>
        </connector>
    </connectors>

    <acceptors>
        <acceptor name="in-vm">
            <factory-class>org.hornetq.core.remoting.impl.invm.InVMAcceptorFactory</factory-class>
        </acceptor>
    </acceptors>

    <!-- Other config -->

    <!--<security-settings>-->
        <!--&lt;!&ndash;security for example queue&ndash;&gt;-->
        <!--<security-setting match="#">-->
            <!--<permission type="createDurableQueue" roles="guest"/>-->
            <!--<permission type="deleteDurableQueue" roles="guest"/>-->
            <!--<permission type="createNonDurableQueue" roles="guest"/>-->
            <!--<permission type="deleteNonDurableQueue" roles="guest"/>-->
            <!--<permission type="consume" roles="guest"/>-->
            <!--<permission type="send" roles="guest"/>-->
        <!--</security-setting>-->
    <!--</security-settings>-->
</configuration>

hornetq-jms.xml:

<configuration xmlns="urn:hornetq"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="urn:hornetq /schema/hornetq-jms.xsd">
    <connection-factory name="ConnectionFactory">
        <connectors>
            <connector-ref connector-name="in-vm"/>
        </connectors>
        <entries>
            <entry name="ConnectionFactory"/>
        </entries>
        <consumer-window-size>0</consumer-window-size>
        <retry-interval>1000</retry-interval>
        <retry-interval-multiplier>1.5</retry-interval-multiplier>
        <max-retry-interval>60000</max-retry-interval>
        <reconnect-attempts>1000</reconnect-attempts>
    </connection-factory>

    <!--the queue used by the example-->
    <queue name="statusQueue">
        <entry name="queue/statusQueue"/>
    </queue>
</configuration>

セキュリティを有効にする場合は、ユーザーとロールの説明を含むhornetq-users.xmlも作成する必要があります。

春の設定:

<bean id="jmsServer" class="org.hornetq.jms.server.embedded.EmbeddedJMS" init-method="start" destroy-method="stop"/>

    <bean id="jmsConnectionFactory"
          class="mypackecge.JmsConnecitonFactoryLocator"
          depends-on="jmsServer"
          factory-method="lookupConnectionFactory">
        <constructor-arg name="server" ref="jmsServer"/>
    </bean>

    <bean id="jmsQueueTemplate" class="org.springframework.jms.core.JmsTemplate" depends-on="jmsServer">
        <property name="connectionFactory">
            <ref bean="jmsConnectionFactory"/>
        </property>
        <property name="destinationResolver">
            <ref bean="jmsDestResolver"/>
        </property>
    </bean>

    <bean id="jmsDestResolver" class="mypackage.EmbeddedDestinationResolver">
        <property name="server" ref="jmsServer"/>
    </bean>

    <bean id="statusQueue" class="mypackage.JmsQueueLocator"
          depends-on="jmsServer"
          factory-method="lookupQueue">
        <constructor-arg name="server" ref="jmsServer"/>
        <constructor-arg name="queueName" value="queue/statusQueue"/>
    </bean>

    <bean id="jmsContainerStatus" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="jmsConnectionFactory"/>
        <property name="destination" ref="statusQueue"/>
        <property name="messageListener" ref="statusChecker" />
        <property name="concurrentConsumers" value="5"/>
    </bean>

次に、ルックアップjmssessionFacrotyとキューのクラスを作成します。

メッセージの送信先を解決するためにjmsTeplateによって使用される宛先リゾルバー。

public class EmbeddedDestinationResolver implements DestinationResolver {

    private EmbeddedJMS server;

    public EmbeddedJMS getServer() {
        return server;
    }

    public void setServer(EmbeddedJMS server) {
        this.server = server;
    }

    @Override
    public Destination resolveDestinationName(Session session, String destinationName, boolean pubSubDomain) throws JMSException {
        return (Destination)server.lookup(destinationName);
    }
}

接続ファクトリーロケーター。

public class JmsConnecitonFactoryLocator {
    public static HornetQJMSConnectionFactory lookupConnectionFactory(EmbeddedJMS server){
        HornetQJMSConnectionFactory cf = (HornetQJMSConnectionFactory) server.lookup("ConnectionFactory");
        return cf;
    }
}

キューロケーター。

public class JmsQueueLocator {

    public static Queue lookupQueue(EmbeddedJMS server, String queueName){
        return (Queue) server.lookup(queueName);
    }
}

メッセージハンドラ。

@Component(value = "statusChecker")
public class StatusChecker implements MessageListener {

    private static final Logger logger = LoggerFactory.getLogger(StatusChecker.class);

    @Override
    public void onMessage(Message message) {
      // handle message, call message.acknowledge()
    }

キューにメッセージを送信するためのjmsTemplateサンプル:

@Component
public class WorkQueue {

    private JmsTemplate jmsTemplate;

    public JmsTemplate getJmsTemplate() {
        return jmsTemplate;
    }

    @Autowired
    public void setJmsTemplate(JmsTemplate jmsTemplate) {
        this.jmsTemplate = jmsTemplate;
    }

    public void addStatusRequestToQueue(final Transaction t) throws JMSException {

        jmsTemplate.send("queue/statusQueue", new MessageCreator() {
            @Override
            public Message createMessage(Session session) throws JMSException {
                TextMessage msg = session.createTextMessage();
                msg.setText(String.valueOf(t.getId()));
                return msg;
            }
        });
    }
于 2012-09-06T10:59:45.793 に答える