Spring整合JMS P2P方式
javajms 使用jms消息發送 Producer,Consumer,Listener 直接使用queue傳的消息爲點對點模式
點對點當同時存在consumer跟listener時 不存在先後順序 兩者能同時接收到消息
這裏consumer有兩種獲取消息的機制
1.使用消費者接收 consumer.receive()
2.使用綁定監聽 consumer.setMessageListener(new Listener());
當系統已有Listener與Producer(發送者)綁定的時候(如下代碼寫法),再使用Consumer.receive 獲取消息時 會報如下錯誤:
consumer.setMessageListener(new ConsumerMessageListener());
while (true) {
Message message = consumer.receive();
TextMessage textMessage = (TextMessage) message;
if(textMessage!=null){
String text = textMessage.getText();
System.out.println("從ActiveMQ取回一條消息: " + text);
}else{
break;
}
}
Cannot synchronously receive a message when a MessageListener is set
此時只要確保系統只有一種方式綁定即可
當系統有多個Consumer在等候是 一個發送者發出消息,每個Consumer都能收到消息
監測客戶端 ActiveMQ 登錄地址http://localhost:8161/admin 用戶admin、密碼admin
使用Spring管理jms
這裏使用Maven構建框架
pom.xml如下:
<properties>
<org.springframework-version>4.1.6.RELEASE</org.springframework-version>
<spring.security.version>2.0.5.RELEASE</spring.security.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.1.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-instrument</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc-portlet</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- springframework end -->
<!-- spring security start -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-acl</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core-tiger</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>4.1.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>jsr250-api</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-core</artifactId>
<version>5.7.0</version>
</dependency>
</dependencies>
spring配置文件applicationContext.XML 如下
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:jms="http://www.springframework.org/schema/jms"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-3.0.xsd">
<context:component-scan base-package="Jms.JmsTest" />
<!-- Spring提供的JMS工具類,它可以進行消息發送、接收等 -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<!-- 這個connectionFactory對應的是我們定義的Spring提供的那個ConnectionFactory對象 -->
<property name="connectionFactory" ref="connectionFactory"/>
</bean>
<!-- 真正可以產生Connection的ConnectionFactory,由對應的 JMS服務廠商提供-->
<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://localhost:61616"/>
</bean>
<!-- Spring用於管理真正的ConnectionFactory的ConnectionFactory -->
<bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">
<!-- 目標ConnectionFactory對應真實的可以產生JMS Connection的ConnectionFactory -->
<property name="targetConnectionFactory" ref="targetConnectionFactory"/>
</bean>
<!--這個是隊列目的地-->
<bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg>
<value>queue</value>
</constructor-arg>
</bean>
<!-- 消息監聽器 -->
<bean id="consumerMessageListener" class="Jms.JmsTest.ConsumerMessageListener"/>
<!-- 消息監聽容器 將發送者監聽捆綁在一起 P2P-->
<bean id="jmsContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory" />
<property name="destination" ref="queueDestination" />
<property name="messageListener" ref="consumerMessageListener" />
</bean>
</beans>
消息生產者
package Jms.JmsTest;
import javax.annotation.Resource;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Component;
@Component
public class ProducerServiceImpl implements ProducerService {
private JmsTemplate jmsTemplate;
public void sendMessage(Destination destination, final String message) {
System.out.println("---------------生產者發了一個消息:" + message);
jmsTemplate.send(destination, new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
return session.createTextMessage(message);
}
});
}
public JmsTemplate getJmsTemplate() {
return jmsTemplate;
}
@Resource
public void setJmsTemplate(JmsTemplate jmsTemplate) {
this.jmsTemplate = jmsTemplate;
}
}
消息監聽
package Jms.JmsTest;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
public class ConsumerMessageListener implements MessageListener {
public void onMessage(Message message) {
//這裏我們知道生產者發送的就是一個純文本消息,所以這裏可以直接進行強制轉換
TextMessage textMsg = (TextMessage) message;
try {
System.out.println("監聽接收消息內容是:1111——————>" + textMsg.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
消息消費者
package Jms.JmsTest;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
public class MessageConsumer {
public static void main(String[] args) throws JMSException {
String jmsProviderAddress = "tcp://localhost:61616";// 地址
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
jmsProviderAddress);// 連接器
Connection connection = connectionFactory.createConnection();// 創建連接
Session session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);// 打開會話
String destinationName = "queue";
Destination dest = session.createQueue(destinationName);// 消息目的地
javax.jms.MessageConsumer consumer = session.createConsumer(dest);
connection.start();
// consumer.setMessageListener(new ConsumerMessageListener());
// consumer.setMessageListener(new ConsumerMessageListener2());
while (true) {
Message message = consumer.receive();
TextMessage textMessage = (TextMessage) message;
if(textMessage!=null){
String text = textMessage.getText();
System.out.println("從ActiveMQ取回一條消息: " + text);
}else{
break;
}
}
}
}
測試類
package Jms.JmsTest;
import javax.jms.Destination;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/applicationContext.xml")
public class ProducerConsumerTest {
@Autowired
private ProducerService producerService;
@Autowired
@Qualifier("queueDestination")
private Destination destination;
@Test
public void testSend() {
for (int i = 0; i <= 5; i++) {
producerService.sendMessage(destination, "生產發送消息:————>" + (i + 1));
}
}
}
測試結果:
---------------生產者發了一個消息:生產發送消息:————>1
監聽接收消息內容是:1111——————>生產發送消息:————>1
---------------生產者發了一個消息:生產發送消息:————>2
監聽接收消息內容是:1111——————>生產發送消息:————>2
---------------生產者發了一個消息:生產發送消息:————>3
監聽接收消息內容是:1111——————>生產發送消息:————>3
---------------生產者發了一個消息:生產發送消息:————>4
監聽接收消息內容是:1111——————>生產發送消息:————>4
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.