jms_url=tcp://127.0.0.1:61616
jms_test_monitor_data_queue=test_queue
<beans xmlns="https://www.springframework.org/schema/beans"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xmlns:amq="https://activemq.apache.org/schema/core"
xmlns:jms="https://www.springframework.org/schema/jms"
xsi:schemaLocation="...省略...">
<!-- 載入屬性檔 -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations" value="classpath:propertiesConfig/test.properties"/>
</bean>
<!-- ActiveMQ 連線工廠 -->
<bean id="amqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<constructor-arg value="${jms_url}"/>
<property name="useAsyncSend" value="true"/>
</bean>
<!-- Spring 緩存連線工廠 -->
<bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
<constructor-arg ref="amqConnectionFactory"/>
<property name="sessionCacheSize" value="20"/>
</bean>
<!-- Queue 模板 -->
<bean id="jmsQueueTemplate" class="org.springframework.jms.core.JmsTemplate">
<constructor-arg ref="connectionFactory"/>
<property name="pubSubDomain" value="false"/>
</bean>
<!-- Topic 模板 -->
<bean id="jmsTopicTemplate" class="org.springframework.jms.core.JmsTemplate">
<constructor-arg ref="connectionFactory"/>
<property name="pubSubDomain" value="true"/>
</bean>
<!-- 監聽器容器 (Queue) -->
<bean id="testMessageReceiver" class="com.maven.project.web.jmsMessageOper.TestMonitorQueue"/>
<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="destinationName" value="${jms_test_monitor_data_queue}"/>
<property name="messageListener" ref="testMessageReceiver"/>
</bean>
</beans>
package com.maven.project.web.jmsMessageOper;
import javax.jms.*;
public class TestMonitorQueue implements MessageListener {
@Override
public void onMessage(Message message) {
if (message instanceof TextMessage) {
try {
System.out.println("收到訊息:" + ((TextMessage) message).getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
package com.maven.project.web.jmsMessageOper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Controller;
import javax.jms.*;
import java.io.Serializable;
import java.util.Map;
@Controller
public class MessageSender {
@Autowired
private JmsTemplate jmsQueueTemplate;
public void sendTextMessage(final String queue, final String text) {
jmsQueueTemplate.send(queue, session -> session.createTextMessage(text));
}
public void sendObjectMessage(final String queue, final Serializable obj) {
jmsQueueTemplate.send(queue, session -> session.createObjectMessage(obj));
}
public void sendMapMessage(final String queue, final Map<String, Object> map) {
jmsQueueTemplate.send(queue, session -> {
MapMessage msg = session.createMapMessage();
map.forEach(msg::setObject);
return msg;
});
}
// sendByteMessage / sendStreamMessage 略
}
@Controller
@RequestMapping("/user")
public class UserLoginAction {
@Autowired
private MessageSender messageSender;
@RequestMapping("/login")
public void login(HttpServletRequest req, HttpServletResponse resp) {
messageSender.sendTextMessage("test_queue", "登入測試訊息");
}
}
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-core</artifactId>
<version>5.7.0</version>
</dependency>
注意: ActiveMQ 5.x 建議使用 activemq-client + activemq-broker 或 activemq-all;Spring 4.x 對應 spring-jms 4.x 版本。