1

ActiveMQを使用してテストを実行することを提案する回答に基づいてActiveMQを使用してJMSをテストする方法を考えていましたJMSのシミュレーション-jUnit

ただし、MessageConsumerから期待していたメッセージが表示されません。私がレシーブを使用した場合、それはただそこにぶら下がっています。

これが私のコードです

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.junit.Assert;
import org.junit.Test;

public class JmsTest {
@Test
public void test() throws Exception {
    final ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
            "vm://localhost?broker.persistent=true");
    final Queue queue;
    final Connection connection = connectionFactory.createConnection();
    final Session session = connection.createSession(true,
            Session.AUTO_ACKNOWLEDGE);
    {
        queue = session.createQueue("test");
    }
    {
        final MessageProducer producer = session.createProducer(queue);
        final TextMessage message = session.createTextMessage("testing");
        producer.send(message);
    }
    {
        final MessageConsumer consumer = session.createConsumer(queue);
        final TextMessage message = (TextMessage) consumer.receiveNoWait();
        // "message" is null at this point
        Assert.assertEquals("testing", message.getText());
    }
}
}
4

3 に答える 3

4

ティムに感謝します。ほぼ同時にそれを見つけましたが、コメントで指定したように、他のいくつかの変更を加える必要がありました。一言で言えば、「transactional」属性が「false」であることを確認する必要があり、Timが指摘したように、connection.start()呼び出しを実行する必要がありました。

@Test
public void test() throws Exception {
    final ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
            "vm://localhost?broker.persistent=false");

    final Connection connection = connectionFactory.createConnection();
    connection.start();
    final Session session = connection.createSession(false,
            Session.AUTO_ACKNOWLEDGE);
    final Queue queue = session.createTemporaryQueue();
    {
        final MessageProducer producer = session.createProducer(queue);
        final TextMessage message = session.createTextMessage("testing");
        producer.send(message);
    }
    {
        final MessageConsumer consumer = session.createConsumer(queue);
        final TextMessage message = (TextMessage) consumer.receiveNoWait();
        Assert.assertNotNull(message);
        Assert.assertEquals("testing", message.getText());
    }
}
于 2012-05-05T21:47:14.320 に答える
3

メッセージを受信する前に、connection.start()を呼び出す必要があります。そうしないと、メッセージがコンシューマーにディスパッチされません。また、メッセージがデキューされてコンシューマーにルーティングされるまでに少し時間がかかる可能性があるため、receiveNoWaitが常にメッセージを返すとコードで想定しないでください。そこで再試行するか、呼び出された時限receive()を使用する可能性があります。適切な。

于 2012-05-05T20:38:00.483 に答える
1

トピックの使用は次のようになります。

        final ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
        final javax.jms.Connection connection = connectionFactory.createConnection();
        connection.setClientID("12345");
        connection.start();

        final Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        final Topic temporaryTopic = session.createTemporaryTopic();

        final MessageConsumer consumer1 = session.createConsumer(temporaryTopic);

        final MessageProducer producer = session.createProducer(temporaryTopic);
        producer.send(session.createTextMessage("Testmessage"));

        final TextMessage message = (TextMessage)consumer1.receiveNoWait();


        Assert.assertNotNull(message);
        Assert.assertEquals("testing", message.getText());
于 2016-11-24T13:51:20.690 に答える