Spring boot 如何使用MessageListener声明队列
我使用SpringBoot2.2,需要通过JMS接收消息 我看到了,然后我们可以使用注释 @组成部分 公共类JMS接收器{ @JmsListenerdestination=队列 public void receiveMessageString消息{ 接收到System.out.PrintLn; } } 实现MessageListener: @组成部分 公共类JMSReceiver实现MessageListener{ @凌驾 消息上的公共无效消息{ ... } }Spring boot 如何使用MessageListener声明队列,spring-boot,jms,spring-jms,Spring Boot,Jms,Spring Jms,我使用SpringBoot2.2,需要通过JMS接收消息 我看到了,然后我们可以使用注释 @组成部分 公共类JMS接收器{ @JmsListenerdestination=队列 public void receiveMessageString消息{ 接收到System.out.PrintLn; } } 实现MessageListener: @组成部分 公共类JMSReceiver实现MessageListener{ @凌驾 消息上的公共无效消息{ ... } } 对于MessageLis
对于MessageListener,我们如何声明使用的队列?您不在MessageListener实现上声明队列,而是在MessageListenerContainer上声明队列 例如:
@Bean
public MessageListenerContainer messageListenerContainer() {
DefaultMessageListenerContainer container = new DefaultMessageListenerContainer();
container.setConnectionFactory(connectionFactory());
container.setDestinationName("queue"); // Set the queue name here.
container.setMessageListener(jmsReceiver()); // Your JMS receiver message listener.
return container;
}
您不在MessageListener实现上声明队列,而是在MessageListenerContainer上声明队列 例如:
@Bean
public MessageListenerContainer messageListenerContainer() {
DefaultMessageListenerContainer container = new DefaultMessageListenerContainer();
container.setConnectionFactory(connectionFactory());
container.setDestinationName("queue"); // Set the queue name here.
container.setMessageListener(jmsReceiver()); // Your JMS receiver message listener.
return container;
}
消息侦听器接口在消息上只有一个方法
public interface MessageListener {
void onMessage(Message message);
}
消息一到达目的地,消息使用者就通过调用消息侦听器的onMessage方法来传递消息。注册消息侦听器允许客户端异步接收消息,而无需阻止/轮询消息使用者。因此,我们必须在消息使用者中注册消息侦听器,因为消息是由消息使用者接收的,因此在消息使用者中设置队列。下面的示例演示了以下消息使用者界面:
public interface MessageConsumer {
String getMessageSelector() throws JMSException;
MessageListener getMessageListener() throws JMSException;
void setMessageListener(MessageListener listener) throws JMSException;
Message receive() throws JMSException;
Message receive(long timeout) throws JMSException;
Message receiveNoWait() throws JMSException;
void close() throws JMSException;
}
下面是可以帮助您的代码
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
public class ConsumerMessageListener implements MessageListener {
private String consumerName;
public ConsumerMessageListener(String consumerName) {
this.consumerName = consumerName;
}
public void onMessage(Message message) {
TextMessage textMessage = (TextMessage) message;
try {
System.out.println(consumerName + " received "
+ textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
队列创建在此处完成,消息从此处发送
import java.net.URI;
import java.net.URISyntaxException;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.broker.BrokerFactory;
import org.apache.activemq.broker.BrokerService;
public class JmsMessageListenerExample {
public static void main(String[] args) throws URISyntaxException, Exception {
BrokerService broker = BrokerFactory.createBroker(new URI(
"broker:(tcp://localhost:61616)"));
broker.start();
Connection connection = null;
try {
// Producer
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
"tcp://localhost:61616");
connection = connectionFactory.createConnection();
Session session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
Queue queue = session.createQueue("customerQueue");
String payload = "Important Task";
Message msg = session.createTextMessage(payload);
MessageProducer producer = session.createProducer(queue);
System.out.println("Sending text '" + payload + "'");
producer.send(msg);
// Consumer
MessageConsumer consumer = session.createConsumer(queue);
consumer.setMessageListener(new ConsumerMessageListener("Consumer"));
connection.start();
Thread.sleep(1000);
session.close();
} finally {
if (connection != null) {
connection.close();
}
broker.stop();
}
}
}
从控制器发送消息并使用Spring Boot接收:
@RestController
@RequestMapping("/transaction")
public class BackOfficeController {
@Autowired private JmsTemplate jmsTemplate;
@PostMapping("/send")
public void send(@RequestBody BackOfficeVO transaction) {
System.out.println("Sending a transaction.");
// Post message to the message queue named "BackOfficeTransactionQueue"
jmsTemplate.convertAndSend("BackOfficeTransactionQueue", transaction);
}
}
@Component
public class BackOfficeReceiver {
@Autowired
private BackOfficeTransactionRepository transactionRepository;
@JmsListener(destination = "BackOfficeTransactionQueue", containerFactory = "myFactory")
public void receiveMessage(BackOfficeVO transaction) {
System.out.println("Received <" + transaction + ">");
transactionRepository.save(transaction);
}
}
如果您使用的是现有的消息侦听器,您可以在bean中定义它:
<bean id="messageListener" class="ConsumerMessageListener"/>
<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="destination" ref="destination"/>
<property name="messageListener" ref="messageListener"/>
</bean>
资料来源:
消息侦听器接口在消息上只有一个方法
public interface MessageListener {
void onMessage(Message message);
}
消息一到达目的地,消息使用者就通过调用消息侦听器的onMessage方法来传递消息。注册消息侦听器允许客户端异步接收消息,而无需阻止/轮询消息使用者。因此,我们必须在消息使用者中注册消息侦听器,因为消息是由消息使用者接收的,因此在消息使用者中设置队列。下面的示例演示了以下消息使用者界面:
public interface MessageConsumer {
String getMessageSelector() throws JMSException;
MessageListener getMessageListener() throws JMSException;
void setMessageListener(MessageListener listener) throws JMSException;
Message receive() throws JMSException;
Message receive(long timeout) throws JMSException;
Message receiveNoWait() throws JMSException;
void close() throws JMSException;
}
下面是可以帮助您的代码
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
public class ConsumerMessageListener implements MessageListener {
private String consumerName;
public ConsumerMessageListener(String consumerName) {
this.consumerName = consumerName;
}
public void onMessage(Message message) {
TextMessage textMessage = (TextMessage) message;
try {
System.out.println(consumerName + " received "
+ textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
队列创建在此处完成,消息从此处发送
import java.net.URI;
import java.net.URISyntaxException;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.broker.BrokerFactory;
import org.apache.activemq.broker.BrokerService;
public class JmsMessageListenerExample {
public static void main(String[] args) throws URISyntaxException, Exception {
BrokerService broker = BrokerFactory.createBroker(new URI(
"broker:(tcp://localhost:61616)"));
broker.start();
Connection connection = null;
try {
// Producer
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
"tcp://localhost:61616");
connection = connectionFactory.createConnection();
Session session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
Queue queue = session.createQueue("customerQueue");
String payload = "Important Task";
Message msg = session.createTextMessage(payload);
MessageProducer producer = session.createProducer(queue);
System.out.println("Sending text '" + payload + "'");
producer.send(msg);
// Consumer
MessageConsumer consumer = session.createConsumer(queue);
consumer.setMessageListener(new ConsumerMessageListener("Consumer"));
connection.start();
Thread.sleep(1000);
session.close();
} finally {
if (connection != null) {
connection.close();
}
broker.stop();
}
}
}
从控制器发送消息并使用Spring Boot接收:
@RestController
@RequestMapping("/transaction")
public class BackOfficeController {
@Autowired private JmsTemplate jmsTemplate;
@PostMapping("/send")
public void send(@RequestBody BackOfficeVO transaction) {
System.out.println("Sending a transaction.");
// Post message to the message queue named "BackOfficeTransactionQueue"
jmsTemplate.convertAndSend("BackOfficeTransactionQueue", transaction);
}
}
@Component
public class BackOfficeReceiver {
@Autowired
private BackOfficeTransactionRepository transactionRepository;
@JmsListener(destination = "BackOfficeTransactionQueue", containerFactory = "myFactory")
public void receiveMessage(BackOfficeVO transaction) {
System.out.println("Received <" + transaction + ">");
transactionRepository.save(transaction);
}
}
如果您使用的是现有的消息侦听器,您可以在bean中定义它:
<bean id="messageListener" class="ConsumerMessageListener"/>
<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="destination" ref="destination"/>
<property name="messageListener" ref="messageListener"/>
</bean>
资料来源:
如果您需要阅读许多队列,那么使用@JmsListener似乎更容易。这是正确的:@JmsListener使事情变得简单,并在幕后创建侦听器容器。引用:我还必须添加此行以传递实际队列:container.setDestinationjMSManager.getCoreInQueue;如果您需要阅读许多队列,那么使用@JmsListener似乎更容易。这是正确的:@JmsListener使事情变得简单,并在幕后创建侦听器容器。引用:我还必须添加此行以传递实际队列:container.setDestinationjMSManager.getCoreInQueue;