场景:
当我在实现多个消费者消费工作队列中的消息时 使用了多线程
然后采用junit 单元测试 发现无法得到正常的结果 代码如下
public class ConsumeWorkQueueThread implements Runnable
{
@SneakyThrows
@Override
public void run()
{
Thread cur=Thread.currentThread();
System.out.println(cur.getName()+"run============");
ConnectionFactory connectionFactory=new ConnectionFactory();
connectionFactory.setHost("xuniji");
connectionFactory.setVirtualHost("/mall");
connectionFactory.setUsername("duckflew");
connectionFactory.setPassword("123456");
Connection connection = connectionFactory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare("work",true,false,false,null);
channel.basicQos(1); //每次只能消费一个消息
//参数1 队列名 参数2 是否开启消息自动确认 参数3 消费消息的回调函数
channel.basicConsume("work", false, new DefaultConsumer(channel)
{
@SneakyThrows
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException
{
System.out.println("消费者-"+cur.getName()+":"+new String(body));
channel.basicAck(envelope.getDeliveryTag(),false);
if (cur.getName().contains("1"))
{
System.out.println("暂停一秒");
Thread.sleep(1000);
System.out.println("当前线程名:"+Thread.currentThread().getName());
}
}
});
}
测试方法很简单
@Test
public void consumeWorkQueue()
{
for (int i = 0; i < 3; i++)
{
new Thread(new ConsumeWorkQueueThread()).start();
}
}
原因分析
新启动的三个线程还没有执行结束 Junit单元测试的测试线程就已经提前结束了
解决方法
新写一个类 将线程启动放到main方法里面