Operação básica ActiveMQ
Uma, forma SpringBoot de atingir o modo de solicitação-resposta de solicitação ActiveMQ
O produtor implementado no artigo anterior é responsável pelo envio das mensagens, e a outra parte é responsável pelo processamento.Agora ambas as partes podem enviar mensagens uma para a outra.A abordagem de solicitação-resposta é muito comum.
Classe de configuração do produtor:
import javax.jms.Destination;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.command.ActiveMQTopic;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.annotation.EnableJms;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.jms.config.JmsListenerContainerFactory;
@Configuration
@EnableJms
public class ActiveMQConfig {
private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
private static final String BROKERURL = "failover://tcp://192.168.244.2:61616";
private static final String TOPIC_NAME = "activemq-topic";
private static final String QUEUE_NAME = "activemq-queue";
@Bean
public ActiveMQConnectionFactory activeMQConnectionFactory() {
ActiveMQConnectionFactory factory =
new ActiveMQConnectionFactory(USERNAME,PASSWORD,BROKERURL);
return factory;
}
@Autowired
private ActiveMQConnectionFactory factory;
@Bean("activeMQTopic")
public Destination ActiveMQTopic() {
Destination queue = new ActiveMQTopic(TOPIC_NAME);
return queue;
}
@Bean("activeMQQueue")
public Destination ActiveMQQueue() {
Destination queue = new ActiveMQQueue(QUEUE_NAME);
return queue;
}
//生产者配置监听,实现请求应答模式,
@Bean
public JmsListenerContainerFactory<?> JmsListenerContainerFactoryTopic(){
DefaultJmsListenerContainerFactory listener =
new DefaultJmsListenerContainerFactory();
listener.setConnectionFactory(factory);
//监听发布订阅模式TOPIC
listener.setPubSubDomain(true);
return listener;
}
@Bean
public JmsListenerContainerFactory<?> JmsListenerContainerFactoryQueue(){
DefaultJmsListenerContainerFactory listener =
new DefaultJmsListenerContainerFactory();
listener.setConnectionFactory(factory);
listener.setReplyPubSubDomain(false);
//监听发布订阅模式FALSE
listener.setPubSubDomain(false);
return listener;
}
Código comercial do produtor:
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.command.ActiveMQQueue;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/activemq")
public class ProducterController {
@Autowired
private JmsTemplate jmsTemplate;
@Autowired
@Qualifier("activeMQTopic")
private Destination destinationTopic;
@Autowired
@Qualifier("activeMQQueue")
private Destination destinationQueue;
@Autowired
private JmsMessagingTemplate template;
@RequestMapping("sendTopic")
public void sendTopicMessage() {
String message = "TOPIC消息内容:"+System.currentTimeMillis();
template.convertAndSend(destinationTopic,message);
}
@RequestMapping("sendQueue")
public void sendQueueMessage(Message msg) {
String message = "QUEUE消息内容:"+System.currentTimeMillis();
jmsTemplate.convertAndSend(destinationTopic, message);
}
@JmsListener(destination =
"topic",containerFactory="JmsListenerContainerFactoryTopic")
@JmsListener(destination =
"queue",containerFactory="JmsListenerContainerFactoryQueue")
public void receiveQueue(String text){
System.out.println("收到响应回来的消息:"+text);
}
Classe de configuração do consumidor:
import javax.jms.Destination;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.command.ActiveMQTopic;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.annotation.EnableJms;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.jms.config.JmsListenerContainerFactory;
@Configuration
@EnableJms
public class ConsumerConfig {
private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
private static final String BROKERURL = "failover://tcp://192.168.244.2:61616";
private static final String TOPIC_NAME = "activemq-topic";
private static final String QUEUE_NAME = "activemq-queue";
@Autowired
private ActiveMQConnectionFactory factory;
@Bean
public ActiveMQConnectionFactory activeMQConnectionFactory() {
ActiveMQConnectionFactory factory =
new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKERURL);
return factory;
}
@Bean
public JmsListenerContainerFactory<?> JmsListenerContainerFactoryTopic(){
DefaultJmsListenerContainerFactory listener =
new DefaultJmsListenerContainerFactory();
listener.setConnectionFactory(factory);
//监听发布订阅模式TOPIC
listener.setPubSubDomain(true);
return listener;
}
@Bean
public JmsListenerContainerFactory<?> JmsListenerContainerFactoryQueue(){
DefaultJmsListenerContainerFactory listener =
new DefaultJmsListenerContainerFactory();
listener.setConnectionFactory(factory);
//监听点对点模式QUEUE
listener.setPubSubDomain(false);
return listener;
}
@Bean("activeMQTopic")
public Destination ActiveMQTopic() {
Destination queue = new ActiveMQTopic(TOPIC_NAME);
return queue;
}
@Bean("activeMQQueue")
public Destination ActiveMQQueue() {
Destination queue = new ActiveMQQueue(QUEUE_NAME);
return queue;
}
Código de negócios do consumidor:
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.TextMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Component;
@Component
public class ConsumerService {
private static final String TOPIC_NAME = "activemq-topic";
private static final String QUEUE_NAME = "activemq-queue";
@Autowired
private JmsTemplate jmsTemplate;
@JmsListener(destination=TOPIC_NAME,containerFactory="JmsListenerContainerFactoryTopic")
@SendTo("topic")
public String reviceTopic(Message productMessage) throws JMSException {
String msg = "接收消息:"+(((TextMessage)productMessage)).getText();
return msg;
}
@JmsListener(destination=QUEUE_NAME,containerFactory="JmsListenerContainerFactoryQueue")
@SendTo("queue")
public String reviceQueue(Message productMessage)throws JMSException {
String msg = "接收消息:"+(((TextMessage)productMessage)).getText();
System.out.println(msg);
return msg;
}
Se você deseja adicionar ID ao conteúdo da mensagem para identificar a solicitação e resposta, você pode usar o seguinte método
Lado do produtor:
@RequestMapping("sendQueue1")
public void sendQueueMessage1() {
jmsTemplate.send(destinationQueue,new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
TextMessage message = session.createTextMessage();
message.setText("生产者发送消息");
String uid = System.currentTimeMillis()+"";
message.setJMSCorrelationID(uid);
return message;
}
});
}
@JmsListener(destination="callback")
public void consumerMessage(String text) {
System.out.print("收到队列的回复报文:"+text);
}
Final do consumidor:
@JmsListener(destination =QUEUE_NAME,containerFactory="JmsListenerContainerFactoryQueue")
@SendTo("callback")
public String receiveQueue(Message message) throws JMSException{
System.out.println(((TextMessage)message).getText());
System.out.println(message.getJMSMessageID());
return "I am consumer,I get your message";
}