pom.xml添加依赖:
<!-- activemq -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
</dependency>
生产者代码:
import javax.jms.Connection;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
public class JMSProducer {
//activemq默认端口号
private static final String url = "tcp://127.0.0.1:61616";
private static final String queueName = "testActivemq";
//private static final String username = "111";
//private static final String password = "111";
public static void main(String[] args) throws JMSException {
//1.创建ConnectionFactory
//ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(username,password,url);
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
//2.创建Connection
Connection connection = connectionFactory.createConnection();
//3.启动连接
connection.start();
//4.创建会话
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//5.创建一个目标
Destination destination = session.createQueue(queueName);
//6.创建一个生产者
MessageProducer producer = session.createProducer(destination);
for (int i = 0; i < 20; i++) {
//7.创建消息
TextMessage textMessage = session.createTextMessage("testMQ" + i);
//8.发布消息
producer.send(textMessage);
System.out.println("发送消息"+textMessage.getText());
}
//9.关闭连接
connection.close();
}
}
执行main方法,打印日志
由于生产者生产完就销毁了,所以执行完便关闭连接。
登录http://localhost:8161/admin/queues.jsp 默认账号均为admin, 进入之后点击queues可以看到我们生产的消息:
此时我们需要创建消费者来将消息消费掉,
消费者代码:
import java.util.concurrent.CopyOnWriteArraySet;
import javax.jms.Connection;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
public class JMSComstomer {
private static final String url = "tcp://127.0.0.1:61616";
private static final String queueName = "testActivemq";
//private static final String username = "111";
//private static final String password = "111";
//public static CopyOnWriteArraySet<Connection> ConsumerConnectionSet = new CopyOnWriteArraySet<Connection>();
public static void main(String[] args) throws JMSException {
//1. 创建ConnectionFactory
//ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(username,password,url);
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
//2. 创建Connection
Connection connection = connectionFactory.createConnection();
//3. 启动连接
connection.start();
//4. 创建会话
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//5. 创建一个目标
Destination destination = session.createQueue(queueName);
//6. 创建一个消费者
MessageConsumer consumer = session.createConsumer(destination);
//7. 创建一个监听器
//ConsumerConnectionSet.add(connection);
consumer.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
try {
String messageText = ((TextMessage) message).getText();
System.out.println("接收消息 = [" + messageText + "]");
} catch (JMSException e) {
e.printStackTrace();
}
}
});
}
}
执行main方法,打印日志:
可见20条消息已经被消费,我们再看看activemq的后台:
如图可见 ,消息已经被消费,而且有一个消费者正在线(消费者处于监听的状态)。
我们重新创建一个生产者,生产一条叫做helloMQ的20条消息。
我们再看看activemq后台
可以看到新生成的20条消息已经被消费了,消费者总共消费了40条消息。
由于消费者是一直处于监听状态的,势必是占用资源的,所以如何关闭不需要的消费者是需要想办法解决的。后来我想到一个办法,用CopyOnWriteArraySet保存连接,在不需要的时候将里面的Connection迭代出来进行关闭。不过这样无法确定关闭哪一个消费者,所以我又使用了ConcurrentHashMap来存储Connection对象,当然我们需要指定了唯一的key来标识不同的消费者。
这仅仅是我自己想到的方法,希望有更好的方法来控制消费者的生命周期。