ActiveMQ是目前非常流行的一种消息中间件,而Spring框架则是目前最为流行的Java企业应用开发框架之一。它们可以结合使用,为我们带来高效可靠的消息传递。
下面,我将详细讲解如何在Spring中使用ActiveMQ进行消息的发送与接收。
环境准备
在开始使用之前,需要先准备好以下环境。
- 安装ActiveMQ。
- 创建一个Maven项目,添加ActiveMQ的依赖。
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.15.13</version>
</dependency>
发送消息
发送消息的过程就是向ActiveMQ队列中添加消息。我们可以通过ActivemqTemplate来完成。
@Autowired
private JmsTemplate jmsTemplate;
public void sendMessage(String destination, final String message) {
jmsTemplate.send(destination, new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
return session.createTextMessage(message);
}
});
}
在上面的代码中,我们首先注入了JmsTemplate对象,然后定义了一个sendMessage方法。在该方法中,我们调用了jmsTemplate的send方法,向目标队列中发送一条消息。
接收消息
接收消息的过程就是从ActiveMQ队列中获取消息。我们可以通过Spring的MessageListenerContainer来监听消息。
@Autowired
private JmsTemplate jmsTemplate;
@Autowired
private MessageListenerContainer messageListenerContainer;
public void receiveMessage(String destination) {
messageListenerContainer.setDestinationName(destination);
messageListenerContainer.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
if (message instanceof TextMessage) {
TextMessage textMessage = (TextMessage) message;
try {
System.out.println("Received message:" + textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
});
}
在上面的代码中,我们注入了JmsTemplate和MessageListenerContainer对象。接着,我们定义了一个receiveMessage方法。在该方法中,我们通过messageListenerContainer的setDestinationName方法设置目标队列名,并通过setMessageListener方法来设置消息监听器。当有消息到来时,消息监听器就会被触发,在其中可以通过message对象获取到消息。
示例代码1
下面我们来看一个完整的示例,演示如何发送消息到ActiveMQ队列。
@Configuration
public class AppConfig {
@Bean
public ActiveMQConnectionFactory activeMQConnectionFactory() {
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
connectionFactory.setBrokerURL("tcp://localhost:61616");
return connectionFactory;
}
@Bean
public JmsTemplate jmsTemplate() {
JmsTemplate jmsTemplate = new JmsTemplate();
jmsTemplate.setConnectionFactory(activeMQConnectionFactory());
jmsTemplate.setDefaultDestinationName("myQueue");
return jmsTemplate;
}
@Bean
public SendMessageService sendMessageService() {
SendMessageService sendMessageService = new SendMessageService();
sendMessageService.setJmsTemplate(jmsTemplate());
return sendMessageService;
}
}
public class SendMessageService {
private JmsTemplate jmsTemplate;
public void setJmsTemplate(JmsTemplate jmsTemplate) {
this.jmsTemplate = jmsTemplate;
}
public void sendMessage() {
jmsTemplate.send(new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
return session.createTextMessage("Hello, world!");
}
});
}
}
public class Main {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
SendMessageService sendMessageService = context.getBean(SendMessageService.class);
sendMessageService.sendMessage();
}
}
在上面的示例中,我们首先定义了一个AppConfig类,用于配置JmsTemplate和ActiveMQ连接工厂。然后定义了一个SendMessageService类,用于向队列中发送消息。最后,在main方法中,我们通过获取SendMessageService对象,调用sendMessage方法来发送消息。
示例代码2
下面我们来看一个完整的示例,演示如何从ActiveMQ队列中接收消息。
@Configuration
public class AppConfig {
@Bean
public ActiveMQConnectionFactory activeMQConnectionFactory() {
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
connectionFactory.setBrokerURL("tcp://localhost:61616");
return connectionFactory;
}
@Bean
public JmsTemplate jmsTemplate() {
JmsTemplate jmsTemplate = new JmsTemplate();
jmsTemplate.setConnectionFactory(activeMQConnectionFactory());
jmsTemplate.setDefaultDestinationName("myQueue");
return jmsTemplate;
}
@Bean
public ReceiveMessageService receiveMessageService() {
ReceiveMessageService receiveMessageService = new ReceiveMessageService();
receiveMessageService.setJmsTemplate(jmsTemplate());
receiveMessageService.setMessageListenerContainer(messageListenerContainer());
return receiveMessageService;
}
@Bean
public MessageListenerContainer messageListenerContainer() {
DefaultMessageListenerContainer container = new DefaultMessageListenerContainer();
container.setConnectionFactory(activeMQConnectionFactory());
container.setDestinationName("myQueue");
container.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
if (message instanceof TextMessage) {
TextMessage textMessage = (TextMessage) message;
try {
System.out.println("Received message:" + textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
});
return container;
}
}
public class ReceiveMessageService {
private JmsTemplate jmsTemplate;
private MessageListenerContainer messageListenerContainer;
public void setJmsTemplate(JmsTemplate jmsTemplate) {
this.jmsTemplate = jmsTemplate;
}
public void setMessageListenerContainer(MessageListenerContainer messageListenerContainer) {
this.messageListenerContainer = messageListenerContainer;
}
public void receiveMessage() {
messageListenerContainer.start();
}
}
public class Main {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
ReceiveMessageService receiveMessageService = context.getBean(ReceiveMessageService.class);
receiveMessageService.receiveMessage();
}
}
在上面的示例中,我们也首先定义了一个AppConfig类,用于配置JmsTemplate和ActiveMQ连接工厂以及MessageListenerContainer。然后定义了一个ReceiveMessageService类,用于监听队列中的消息。最后,在main方法中,我们通过获取ReceiveMessageService对象,调用receiveMessage方法来监听消息。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:ActiveMQ结合Spring收发消息的示例代码 - Python技术站