必要なもの: 1. jms を介してメッセージを送信します。2. クライアントから処理されず、サーバーが再起動した場合にクライアントがサーバーの再起動時にメッセージを取得できるように、メッセージを永続化します。3. メッセージは、これらのメッセージが送信されたのと同じ順序でクライアントから受信する必要があります。4. キューに複数のコンシューマーを配置して、さまざまなメッセージを並行してスケーリングおよび処理できるようにします。
私がやったこと:私はアクティブなmqを使用し、次の春の構成を持っています
<bean id="destination" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg index="0" value="destination"/>
</bean>
<bean id="template" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="pooledConnectionFactory"/>
<property name="deliveryMode" value="2"/>
<property name="defaultDestination" ref="destination"/>
</bean>
<bean id="messageListener" class="InternalNotificationJMSConsumer"/>
<jms:listener-container connection-factory="pooledConnectionFactory" acknowledge="client" destination-type="queue" concurrency="5-10" container-type="simple" cache="none" client-id="client1" prefetch="1">
<jms:listener destination="destination" ref="messageListener" method="onMessage"/>
</jms:listener-container>
これで宛先と接続プールができました。次に、春の jmstemplate を作成し、メッセージの送信を開始します
template.send(new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
return session.createObjectMessage(message);
}
});
それから私は次のように受信機を持っています:
@Component
public class JMSConsumer implements MessageListener {
@Override
public void onMessage(Message message) {
if (message instanceof ObjectMessage) {
....
}
}
私の問題:
を。この構成を使用するメッセージは、順番どおりに受信されません。これは、listener-container.concurency の xsd コメントを考えると理にかなっています。したがって、問題は、注文を維持できるが、複数の消費者がいる方法/場合です。
b. メッセージ確認。私が必要とするのは、メッセージが処理された後、onMessage が返され、メッセージが確認済みと見なされ、再送信されないことです。私はアプリケーションサーバーの内部にいないという点でトランザクションマネージャーがなく、可能であればこれを避けたいと思っています。私は自分自身のメッセージを確認するだけで済みます。これは可能ですか?