<properties><springframework>4.1.8.RELEASE</springframework></properties>
<dependencies>
<!-- Spring core, context, tx, webmvc, jms -->
<dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-core</artifactId><version>5.7.0</version></dependency>
<dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-pool</artifactId><version>5.12.1</version></dependency>
<dependency><groupId>org.apache.xbean</groupId><artifactId>xbean-spring</artifactId><version>3.16</version></dependency>
</dependencies>
<amq:connectionFactory id="amqConnectionFactory"
brokerURL="tcp://192.168.148.128:61616" userName="admin" password="admin" />
<bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
<constructor-arg ref="amqConnectionFactory" />
<property name="sessionCacheSize" value="100" />
</bean>
<bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg value="JayceQueue" />
</bean>
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory" />
<property name="defaultDestination" ref="queueDestination" />
<property name="pubSubDomain" value="false" /> <!-- false=Queue, true=Topic -->
</bean>
<!-- 監聽器容器 -->
<bean id="queueListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory" />
<property name="destination" ref="queueDestination" />
<property name="messageListener" ref="queueMessageListener" />
</bean>
@Service
public class ProducerService {
@Resource JmsTemplate jmsTemplate;
public void send(String msg) {
jmsTemplate.send(session -> session.createTextMessage(msg));
}
}
@Service
public class ConsumerService {
@Resource JmsTemplate jmsTemplate;
public TextMessage receive(Destination dest) {
return (TextMessage) jmsTemplate.receive(dest);
}
}
@Component
public class QueueMessageListener implements MessageListener {
@Override public void onMessage(Message msg) {
TextMessage tm = (TextMessage) msg;
System.out.println("收到訊息:" + tm.getText());
// 處理業務邏輯...
}
}
@RestController
public class MessageController {
@Resource ProducerService producer;
@Resource ConsumerService consumer;
@Resource Destination queueDestination;
@PostMapping("/send") public void send(@RequestParam String msg) { producer.send(msg); }
@GetMapping("/receive") public TextMessage receive() { return consumer.receive(queueDestination); }
}
使用 HttpClient 多執行緒持續發送 POST 請求,觀察 ActiveMQ 管理後台訊息吞吐量與消費延遲。