介绍
ActiveMQ是基于Java开发的。比较成熟的消息中间件,适于初学者。
1.安装activemq
1.1 拉取镜像
docker pull webcenter/activemq:latest
1.2 运行容器
docker run \
--name activemq \
-d -p 8161:8161 -p 61616:61616 \
-e ACTIVEMQ_ADMIN_LOGIN=admin \
-e ACTIVEMQ_ADMIN_PASSWORD=1234 \
-v $PWD/data:/data/activemq \
-v $PWD/log:/var/log/activemq \
webcenter/activemq:latest
1.3 web端口是8161
正常应该可以访问到:
2.连接工厂方式
2.1 发布者
public class myActiveMQPublisher {
private static final String ACTIVEMQ_URL = "tcp://192.168.32.128:61616";
private static final String USERNAME = "kingah";
private static final String PASSWORD = "1234";
private static final String QUEUE_NAME = "xxxx";
public static void main(String[] args) throws Exception {
// 1.创建连接工厂
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, ACTIVEMQ_URL);
// 2.创建连接
Connection conn = factory.createConnection();
conn.start();
// 3.创建会话
// 事务、签收
Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 4.创建目的地(子接口为topic、queue)
Queue destination = session.createQueue(QUEUE_NAME);
// 5.创建消息的生产者
MessageProducer producer = session.createProducer(destination);
// 6.创建消息
TextMessage message = session.createTextMessage("消息....");
// 7.生产者发送消息
producer.send(message);
// 8.关闭资源
producer.close();
session.close();
conn.close();
System.out.println("消息发布完成...");
}
}
2.2 消费者
private static final String ACTIVEMQ_URL = "tcp://192.168.32.128:61616";
private static final String USERNAME = "kingah";
private static final String PASSWORD = "1234";
private static final String QUEUE_NAME = "xxxx";
public static void main(String[] args) throws Exception {
// 1.创建连接工厂
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, ACTIVEMQ_URL);
// 2.创建连接
Connection conn = factory.createConnection();
conn.start();
// 3.创建会话
// 事务、签收
Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 4.创建目的地(子接口为topic、queue)
Queue destination = session.createQueue(QUEUE_NAME);
// 5.创建消息的生产者
MessageConsumer consumer = session.createConsumer(destination);
// 实时监听
while (true) {
// receive(参数),不加参数是阻塞,加参数是过时不候。
TextMessage message = (TextMessage) consumer.receive();
if (message != null) {
System.out.println("****消费者接收到消息****:" + message.getText());
} else {
break;
}
}
// 8.关闭资源
consumer.close();
session.close();
conn.close();
System.out.println("消息发布完成...");
}
// 异步非阻塞,可以替换第7步
public static void listener(MessageConsumer consumer) throws JMSException, IOException {
consumer.setMessageListener((Message message) -> {
if (message != null && message instanceof TextMessage) {
TextMessage msg = (TextMessage) message;
try {
System.out.println("****消费者接收到消息****:" + msg.getText());
} catch (JMSException e) {
throw new RuntimeException(e);
}
}
});
// 这一步不要忘记
System.in.read();
}
}
3.springboot整合activemq
3.1 编写配置文件application.yml
spring:
activemq:
broker-url: tcp://192.168.32.128:61616
user: kingah
password: 1234
jms:
template:
default-destination: kingah # 默认目的地
3.2 编写发布者逻辑
@GetMapping("/active/send")
public Result sendMessage2(String message, String sender, @RequestParam(required = true) String receiver) throws JsonProcessingException {
// 构建物流信息
LogisticsMessage logisticsMessage = LogisticsMessage.builder()
.sendTime(LocalDateTime.now())
.destination(receiver)
.description(message)
.sender(sender)
.receiver(receiver)
.build();
// 注册时间模块
ObjectMapper objectMapper = new ObjectMapper().registerModule(new JavaTimeModule());
String jsonMessage = objectMapper.writeValueAsString(logisticsMessage);
jmsMessagingTemplate.convertAndSend(receiver, jsonMessage);
return Result.success("成功");
}
3.3 编写Jms监听器
@Component
@Slf4j
public class ActiveMQListener {
@JmsListener(destination = "queueName")
public void receive(String msg) {
log.info("接收到消息:{}", msg);
}
}