数日間、ネットでいくつかのドキュメントと投稿を行ってきましたが、正しく構成できませんでした。
私はスタンドアロン環境で作業しており、Spring3.1 アプリケーションに単純に HornetQ を統合しようとしています。
Hornetq 固有の xml もいくつか変更する必要があることはわかっています。
私のパズルにはいつも何かが欠けているようです。
完全で単純な作業サンプルはありますか?
どうもありがとう、レイ。
HornetQを組み込みJMSサーバーとして使用していますか、それともJBossで使用していますか?どちらの場合も、2つの異なる答えになります。埋め込まれたケースに関連するニコラスの答え。
スタンドアロン環境で作業していると言うので、Jbossに統合されたHornetQを使用していると思います。したがって、SpringにJMSを統合するのではなく、EJBやMDBなどのEE機能を使用することをお勧めします。それは簡単に構成可能で、すでにそこにあります。必要なのは、それを適切に構成し、コンシューマー用にMDBを作成し、initSpring構成用に@SingletonEJBを作成することです。
これが実際の例です(ロシア語のオリジナル)
編集
だから、フルバージョン:
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>-->
<!--<!–security for example queue–>-->
<!--<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;
}
});
}