자세 한 자바 메시지 큐-Spring 통합 ActiveMq

27685 단어 activemqspring
1.개술
먼저 여러분 과 함께 자바 메시지 서 비 스 를 돌 이 켜 보 겠 습 니 다.제 이전 블 로그 인 에서 저 는 여러분 을 위해 분석 하 였 습 니 다.
1.메시지 서비스:하나의 미들웨어 는 두 개의 여러 프로그램 간 의 결합 을 해결 하 는 데 사용 되 고 바 텀 은 자바 에 의 해 이 루어 집 니 다.
2.우세:비동기,신뢰성
3.메시지 모델:점 대 점,게시/구독
4.JMS 의 대상
그리고 다른 블 로그 인 에서 여러분 과 함께 0 에서 1 까지 ActiveMq 프로젝트 를 열 었 습 니 다.프로젝트 개발 과정 에서 우 리 는 ActiveMq 에 대해 어느 정도 알 게 되 었 습 니 다.
1.다양한 언어 와 프로 토 콜 로 클 라 이언 트 를 작성 합 니 다.언어:Java,C,C++,C\#,Ruby,Perl,Python,PHP.응용 프로 토 콜:OpenWire,Stomp REST,WS 알림,XMPP,AMQP
2.JMS 1.1 과 J2EE 1.4 규범(지구 화,XA 메시지,사무)을 완전히 지원 합 니 다.
3.Spring 에 대한 지원,ActiveMQ 는 Spring 을 사용 하 는 시스템 에 쉽게 내장 할 수 있 으 며,Spring 2.0 의 특성 도 지원 합 니 다.
4.일반적인 J2EE 서버(예 를 들 어 Geronimo,JBoss 4,GlassFish,WebLogic)의 테스트 를 통 과 했 습 니 다.그 중에서 JCA 1.5 resource adaptors 의 설정 을 통 해 ActiveMQ 는 모든 호 환 J2EE 1.4 비 즈 니스 서버 에 자동 으로 배치 할 수 있 습 니 다.
5.다양한 전송 프로 토 콜 지원:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA
6.JDBC 와 journal 을 통 해 고속 정 보 를 지속 적 으로 제공 할 수 있 습 니 다.
7.디자인 적 으로 고성능 의 클 라 이언 트,클 라 이언 트-서버,점 대 점 을 확보
8.Ajax 지원
9.Axis 와 의 통합 지원
10.내 장 된 JMS provider 를 쉽게 호출 하여 테스트 할 수 있 습 니 다.
다음 블 로그 에서 저 는 여러분 과 함께 Spring 과 ActiveMq 를 통합 하 겠 습 니 다.이 블 로 그 는 Spring+JMS+ActiveMQ+Tomcat 를 바탕 으로 Point-to-Point 의 비동기 대기 열 메시지 와 PUB/SUB(게시/구독)모델 을 실 현 했 습 니 다.간단 한 인 스 턴 스 는 어떠한 업무 도 포함 하지 않 습 니 다.
2.디 렉 터 리 구조
2.1 프로젝트 디 렉 터 리
IDE 는 IDEA(사용 권장)를 선 택 했 습 니 다.jar 를 다운로드 하 는 여러 가지 번 거 로 움 을 피하 기 위해 바 텀 에서 maven 을 사용 하여 프로젝트 를 만 들 었 습 니 다.Spring 과 ActiveMq 를 통합 시 켰 습 니 다.
   
 2.2 pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>Crawl-Page</groupId>
 <artifactId>Crawl-Page</artifactId>
 <packaging>war</packaging>
 <version>1.0-SNAPSHOT</version>
 <name>Crawl-Page Maven Webapp</name>
 <url>http://maven.apache.org</url>
 <!--      -->
 <properties>
 <springframework>4.1.8.RELEASE</springframework>
 </properties>

 <dependencies>
 <dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.10</version>
  <scope>test</scope>
 </dependency>


 <!-- JSP   -->
 <dependency>
 <groupId>jstl</groupId>
 <artifactId>jstl</artifactId>
 <version>1.2</version>
 </dependency>
 <dependency>
 <groupId>javax.servlet</groupId>
 <artifactId>servlet-api</artifactId>
 <scope>provided</scope>
 <version>2.5</version>
 </dependency>


 <!-- spring -->
 <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-core</artifactId>
  <version>${springframework}</version>
 </dependency>
 <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>${springframework}</version>
 </dependency>
 <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-tx</artifactId>
  <version>${springframework}</version>
 </dependency>
 <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>${springframework}</version>
 </dependency>
 <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-jms</artifactId>
  <version>${springframework}</version>
 </dependency>
 <!-- xbean  <amq:connectionFactory /> -->
 <dependency>
  <groupId>org.apache.xbean</groupId>
  <artifactId>xbean-spring</artifactId>
  <version>3.16</version>
 </dependency>

 <!-- activemq -->
 <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>

 <!--   jar ,    -->
 <dependency>
  <groupId>commons-httpclient</groupId>
  <artifactId>commons-httpclient</artifactId>
  <version>3.1</version>
 </dependency>
 </dependencies>

 <build>
 <finalName>Crawl-Page</finalName>
 <plugins>
  <plugin>
  <groupId>org.apache.tomcat.maven</groupId>
  <artifactId>tomcat7-maven-plugin</artifactId>
  <configuration>
   <port>8080</port>
   <path>/</path>
  </configuration>
  </plugin>
 </plugins>
 </build>

</project>

여기 pom.xml 파일 이 좀 길 어서 펼 치지 않 습 니 다.
1,Spring 핵심 의존 2,ActiveMq core 와 pool(여기 서 학생 들 이 jar 를 가 져 오 기 를 선택 하면 이전 블 로그 에서 말 한 activemq-all 이라는 jar 가방 을 직접 가 져 올 수 있 습 니 다)3,자바 servlet 관련 의존 도 를 볼 수 있 습 니 다.
여기 서 우리 가 선택 한 ActiveMq pool 의 의존 버 전 은 다음 dtd 와 관계 가 있 으 므 로 버 전이 대응 해 야 하기 때문에 학생 들 이 activemq 파일 을 설정 할 때 dtd 버 전 선택 에 주의해 야 합 니 다.
2.3 web.xml
웹.xml 도 대동소이 합 니 다.Spring 프로필,springMvc 이름,인 코딩 형식 을 지정 합 니 다.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
   http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   version="3.0">

 <display-name>Archetype Created Web Application</display-name>

 <!--   spring     ,  hibernate、jms    -->
 <context-param>
 <param-name>contextConfigLocation</param-name>
 <param-value>
  classpath:applicationContext*.xml;
 </param-value>
 </context-param>

 <listener>
 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>

 <servlet>
 <servlet-name>springMVC</servlet-name>
 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 <init-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:spring-mvc.xml</param-value>
 </init-param>
 <load-on-startup>1</load-on-startup>
 </servlet>
 <servlet-mapping>
 <servlet-name>springMVC</servlet-name>
 <url-pattern>/</url-pattern>
 </servlet-mapping>

 <!--        -->
 <filter>
 <filter-name>characterEncodingFilter</filter-name>
 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
 <init-param>
  <param-name>encoding</param-name>
  <param-value>UTF-8</param-value>
 </init-param>
 <init-param>
  <param-name>forceEncoding</param-name>
  <param-value>true</param-value>
 </init-param>
 </filter>
 <filter-mapping>
 <filter-name>characterEncodingFilter</filter-name>
 <url-pattern>/*</url-pattern>
 </filter-mapping>

</web-app>

2.4 SpringMvc 와 applicationContext.xml
이 안의 SpringMVC 는 별 다른 것 이 없 으 니 필요 한 학생 이 있 으 면 참고 하 세 요.

<?xml version="1.0" encoding="UTF-8"?>
<!--      schemaLocation    http://www.springframework.org/schema/ -->
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:aop="http://www.springframework.org/schema/aop"
  xmlns:context="http://www.springframework.org/schema/context"
  xmlns:mvc="http://www.springframework.org/schema/mvc"
  xmlns:tx="http://www.springframework.org/schema/tx"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/aop
  http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
  http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
  http://www.springframework.org/schema/context
  http://www.springframework.org/schema/context/spring-context-4.0.xsd
  http://www.springframework.org/schema/mvc
  http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
  http://www.springframework.org/schema/tx
  http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">

 <!--   MVC   -->
 <mvc:annotation-driven />
 <!--   Sping           -->
 <context:component-scan base-package="com.Jayce" >
  <!--      Controller,      Service -->
  <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
 </context:component-scan>

 <!-- JSP     -->
 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="prefix" value="/WEB-INF/views/" />
  <property name="suffix" value=".jsp" />
  <!--         order   1 -->
  <property name="order" value="1" />
 </bean>
</beans>

applicationContext.xml 는 주로 Bean 을 불 러 오 는 데 사 용 됩 니 다.저희 프로젝트 에는 특별한 자바 Bean 이 없 기 때문에 가방 스 캔 경 로 를 가리 키 는 데 만 사 용 됩 니 다.

<?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:amq="http://activemq.apache.org/schema/core"
  xmlns:jms="http://www.springframework.org/schema/jms"
  xmlns:context="http://www.springframework.org/schema/context"
  xmlns:mvc="http://www.springframework.org/schema/mvc"
  xsi:schemaLocation="
  http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
  http://www.springframework.org/schema/context
  http://www.springframework.org/schema/context/spring-context-4.1.xsd
  http://www.springframework.org/schema/mvc
  http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
  http://www.springframework.org/schema/jms
  http://www.springframework.org/schema/jms/spring-jms-4.1.xsd
  http://activemq.apache.org/schema/core
  http://activemq.apache.org/schema/core/activemq-core-5.14.3.xsd">

 <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
 <!--        -->
 <context:component-scan base-package="com.Jayce">
  <!--    Service,     Repostory,    Controller    ,Controller spring-mvc.xml    -->
  <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
 </context:component-scan>

</beans>

  2.5 applicationContext-ActiveMQ.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:amq="http://activemq.apache.org/schema/core"
  xmlns:jms="http://www.springframework.org/schema/jms"
  xmlns:context="http://www.springframework.org/schema/context"
  xmlns:mvc="http://www.springframework.org/schema/mvc"
  xsi:schemaLocation="
  http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
  http://www.springframework.org/schema/context
  http://www.springframework.org/schema/context/spring-context-4.1.xsd
  http://www.springframework.org/schema/mvc
  http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
  http://www.springframework.org/schema/jms
  http://www.springframework.org/schema/jms/spring-jms-4.1.xsd
  http://activemq.apache.org/schema/core
  http://activemq.apache.org/schema/core/activemq-core-5.12.1.xsd"
>

 <context:component-scan base-package="com.Jayce" />
 <mvc:annotation-driven />

 <amq:connectionFactory id="amqConnectionFactory"
       brokerURL="tcp://192.168.148.128:61616"
       userName="admin"
       password="admin" />

 <!--   JMS     -->
 <bean id="connectionFactory"
   class="org.springframework.jms.connection.CachingConnectionFactory">
  <constructor-arg ref="amqConnectionFactory" />
  <property name="sessionCacheSize" value="100" />
 </bean>

 <!--       (Queue) -->
 <bean id="demoQueueDestination" class="org.apache.activemq.command.ActiveMQQueue">
  <!--           -->
  <constructor-arg>
   <value>Jaycekon</value>
  </constructor-arg>
 </bean>

 <!--   JMS  (Queue),Spring   JMS   ,   、    。 -->
 <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
  <property name="connectionFactory" ref="connectionFactory" />
  <property name="defaultDestination" ref="demoQueueDestination" />
  <property name="receiveTimeout" value="10000" />
  <!-- true topic,false queue,   false,      false -->
  <property name="pubSubDomain" value="false" />
 </bean>


 <!--          (Queue) -->
 <bean id="queueMessageListener" class="com.Jayce.Filter.QueueMessageListener" />

 <!--           (Queue),      ,      demoQueueDestination,             -->
 <bean id="queueListenerContainer"
   class="org.springframework.jms.listener.DefaultMessageListenerContainer">
  <property name="connectionFactory" ref="connectionFactory" />
  <property name="destination" ref="demoQueueDestination" />
  <property name="messageListener" ref="queueMessageListener" />
 </bean>

</beans>

이 프로필 에 대해 설명 하 겠 습 니 다.위 프로필 에서 알 아 볼 수 있다 면 건 너 뛸 수 있 습 니 다.학생 들 도 액 티 브 MQ 홈 페이지 에서 볼 수 있다.
1.ActiveMq 의 DTD.관련 설정 을 설명 하기 전에 ActiveMq 의 DTD 를 가 져 와 야 합 니 다.그렇지 않 으 면 Spring 은 우리 의 태그 가 무슨 뜻 인지 이해 하지 못 합 니 다.
pom.xml 파일 에 activemq 버 전이 설정 되 어 있 습 니 다.의존 하 는 버 전과 같 아야 합 니 다.그렇지 않 으 면 관련 dtd 를 찾 을 수 없습니다.
2.amq:connection Factory:매우 솔직 한 설정 항목 입 니 다.공장 을 연결 하 는 주소 와 사용자 이름 비밀 번 호 를 설정 하 는 데 사 용 됩 니 다.http 연결 이 아 닌 tcp 연결 을 선택 하 는 것 이 중요 합 니 다.
3.jmsTemplate:비교적 중요 한 설정 입 니 다.여 기 는 공장 을 연결 하고 기본 메 시 지 를 목적지 로 보 내 며 연결 시간 이 길 고 메 시 지 를 발표 하 는 방식 을 지정 합 니 다.
 3.프로젝트 구조
3.1 ProducerService

package com.Jayce.Service;

import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;

/**
 * Created by Administrator on 2017/1/5.
 */
@Service
public class ProducerService {

 @Resource(name="jmsTemplate")
 private JmsTemplate jmsTemplate;

 public void sendMessage(Destination destination,final String msg){
  System.out.println(Thread.currentThread().getName()+"    "+destination.toString()+"    ---------------------->"+msg);
  jmsTemplate.send(destination, new MessageCreator() {
   public Message createMessage(Session session) throws JMSException {
    return session.createTextMessage(msg);
   }
  });
 }

 public void sendMessage(final String msg){
  String destination = jmsTemplate.getDefaultDestinationName();
  System.out.println(Thread.currentThread().getName()+"    "+destination+"    ---------------------->"+msg);
  jmsTemplate.send(new MessageCreator() {
   public Message createMessage(Session session) throws JMSException {
    return session.createTextMessage(msg);
   }
  });
 }
}

메시지 생산 자 를 서비스 로 만 듭 니 다.메 시 지 를 보 내야 할 때 ProducerService 인 스 턴 스 의 sendmessage 방법 을 사용 하면 기본 목적 으로 메 시 지 를 보 낼 수 있 습 니 다.
여기 서 두 가지 발송 방식 을 제공 합 니 다.하 나 는 기본 목적지 로 보 내 는 것 이 고 하 나 는 목적지 에 따라 메 시 지 를 보 내 는 것 입 니 다.
3.2 ConsumerService

package com.Jayce.Service;

import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.TextMessage;

/**
 * Created by Administrator on 2017/1/5.
 */
@Service
public class ConsumerService {
 @Resource(name="jmsTemplate")
 private JmsTemplate jmsTemplate;

 public TextMessage receive(Destination destination){
  TextMessage textMessage = (TextMessage) jmsTemplate.receive(destination);
  try{
   System.out.println("   " + destination.toString() + "     :\t"
     + textMessage.getText());
  } catch (JMSException e) {
   e.printStackTrace();
  }
  return textMessage;
 }
}

우리 프로젝트 에는 업무 가 없 기 때문에 메시지 에 대한 처 리 는 출력 입 니 다.jmsTemplate 의 receive 방법 만 호출 하면 안에서 메 시 지 를 얻 을 수 있 습 니 다.
지난 블 로그 와 비교 해 보면 지난 블 로그 에서 우 리 는 정 보 를 받 은 후에 수 동 으로 업 무 를 확인 해 야 ActiveMQ 에서 이 소식 이 정확하게 읽 혔 다 는 것 을 확인 할 수 있 습 니 다.스프링 을 통합 하면,사 무 는 스프링 이 관리한다.
3.3 MessageController

package com.Jayce.Controller;

import com.Jayce.Service.ConsumerService;
import com.Jayce.Service.ProducerService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;
import javax.jms.Destination;
import javax.jms.TextMessage;

/**
 * Created by Administrator on 2017/1/5.
 */
@Controller
public class MessageController {
 private Logger logger = LoggerFactory.getLogger(MessageController.class);
 @Resource(name = "demoQueueDestination")
 private Destination destination;

 //       
 @Resource(name = "producerService")
 private ProducerService producer;

 //       
 @Resource(name = "consumerService")
 private ConsumerService consumer;

 @RequestMapping(value = "/SendMessage", method = RequestMethod.POST)
 @ResponseBody
 public void send(String msg) {
  logger.info(Thread.currentThread().getName()+"------------send to jms Start");
  producer.sendMessage(msg);
  logger.info(Thread.currentThread().getName()+"------------send to jms End");
 }

 @RequestMapping(value= "/ReceiveMessage",method = RequestMethod.GET)
 @ResponseBody
 public Object receive(){
  logger.info(Thread.currentThread().getName()+"------------receive from jms Start");
  TextMessage tm = consumer.receive(destination);
  logger.info(Thread.currentThread().getName()+"------------receive from jms End");
  return tm;
 }

}

통제 층 안에 우리 의 생산자 와 소비자(실제 개발 에서 생산자 와 소비 자 는 같은 프로젝트 에 있 지 않 을 것 이다.그렇지 않 으 면 정보 서비스 라 는 것 은 의미 가 없다)를 주입 해 야 한다.
현재 서비스 층 과 통제 층 이 모두 좋아 졌 으 니,이어서 우 리 는 간단 한 테스트 를 진행 할 것 이다.
 4.프로젝트 테스트
4.1 ActiveMq 시작
액 티 브 MQ 서비스 가 시작 되 었 는 지 확인 하 세 요.
     
4.2 시작 항목
프로젝트 는 Tomcat 플러그 인 을 사용 하여 로 컬 에서 Tomcat 를 다운로드 하 는 번 거 로 움 을 피 할 수 있 습 니 다.필요 한 학생 이 사용 할 수 있 습 니 다.

<plugins>
  <plugin>
  <groupId>org.apache.tomcat.maven</groupId>
  <artifactId>tomcat7-maven-plugin</artifactId>
  <configuration>
   <port>8080</port>
   <path>/</path>
  </configuration>
  </plugin>
</plugins>
4.3 메시지 발송
여기 크롬 플러그 인 을 사 용 했 습 니 다.PostMan 이 관심 이 있 는 학생 은 크롬 확장 프로그램 에서 찾 을 수 있 습 니 다.백 엔 드 학생 들 이 페이지 를 만 드 는 것 을 피 할 수 있 습 니 다!
    
우 리 는 post 요청 을 보 낸 후에 서버 의 효 과 를 보 았 습 니 다.
 
우 리 는 이미 대열 에 메 시 지 를 보 낸 것 을 볼 수 있다.ActiveMq 의 현재 상 태 를 살 펴 보 겠 습 니 다.
 
ActiveMq 에 메시지 가 성공 적 으로 전송 되 었 음 을 볼 수 있 습 니 다.
4.4 수신 메시지
get 을 사용 하여 서버 배경 에 접근 요청:
  
서비스의 출력:
 
ActiveMq 서버 상태:
 
우 리 는 소비자 들 이 이미 정 보 를 소 비 했 고 ActiveMq 와 의 링크 를 끊 지 않 았 음 을 볼 수 있다.
4.5 모니터
실제 프로젝트 에서 우 리 는 스스로 수 동 으로 정 보 를 얻 는 일이 매우 적다.만약 수 동 으로 정 보 를 얻 으 려 면 ActiveMq 를 사용 할 필요 가 없다.Redis 를 사용 하면 충분 하 다.
수 동 으로 정 보 를 얻 을 수 없다 면,우 리 는 메시지 가 도 착 했 는 지 확인 하기 위해 감청 기 를 사용 할 수 있다.이렇게 하면 메시지 에 대한 처 리 를 빨리 끝 낼 수 있다.
4.5.1 applicationContext-ActiveMQ.xml 설정
위의 설정 파일 에 서 는 기본적으로 이 모니터 의 설정 파일 을 추 가 했 습 니 다.학생 들 이 이 모니터 를 사용 하고 싶 지 않 으 면 직접 설명 할 수 있 습 니 다.
  

 <!--          (Queue) -->
 <bean id="queueMessageListener" class="com.Jayce.Filter.QueueMessageListener" />

 <!--           (Queue),      ,      demoQueueDestination,             -->
 <bean id="queueListenerContainer"
   class="org.springframework.jms.listener.DefaultMessageListenerContainer">
  <property name="connectionFactory" ref="connectionFactory" />
  <property name="destination" ref="demoQueueDestination" />
  <property name="messageListener" ref="queueMessageListener" />
 </bean>

4.5.2 MessageListener
MessageListener 인 터 페 이 스 를 만 들 필요 가 있 습 니 다.

package com.Jayce.Filter;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

/**
 * Created by Administrator on 2017/1/5.
 */
public class QueueMessageListener implements MessageListener {
 public void onMessage(Message message) {
  TextMessage tm = (TextMessage) message;
  try {
   System.out.println("QueueMessageListener        :\t"
     + tm.getText());
   //do something ...
  } catch (JMSException e) {
   e.printStackTrace();
  }
 }
}

인 터 페 이 스 를 실현 하 는 onMessage 방법 은 우리 가 필요 로 하 는 업무 조작 을 안에서 해결 할 것 입 니 다.이렇게 하면 우리 생산자-미들웨어-소비자,이러한 디 결합 작업 을 완성 할 수 있 습 니 다. 
4.5.3 테스트
위 와 마찬가지 로 post Man 으로 post 요청 을 보 내 면 콘 솔 안 을 볼 수 있 습 니 다.메 시 지 는 바로 인쇄 될 수 있 습 니 다.
    
ActiveMQ 서버 상태 다시 보기:
 
모니터 를 사용 하 는 효 과 는 수 동 으로 메 시 지 를 받 는 효과 와 같다 는 것 을 알 수 있다.
이렇게 모든 프로젝트 에서 우 리 는 Spring 과 ActiveMQ 를 성공 적 으로 통합 시 켰 다.
4.6 압력 테스트
여 기 는 사실 스트레스 테스트 라 고 할 수 없습니다.pom.xml 파일 을 설정 할 때 comons-httpclient 의 의존 도 를 보 았 습 니 다.그 다음 에 http Client 를 사용 하여 서버 에서 메 시 지 를 보 내 고 싶 습 니 다.서버 가 메 시 지 를 해결 하 는 속도 가 어떤 지 보 겠 습 니 다.

package com.Jaycekon.test;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.PostMethod;
import org.junit.Test;

import java.io.IOException;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * Created by Administrator on 2017/1/5.
 */
public class Client {

 @Test
 public void test() {
  HttpClient httpClient = new HttpClient();
  new Thread(new Sender(httpClient)).start();

 }

}

class Sender implements Runnable {
 public static AtomicInteger count = new AtomicInteger(0);
 HttpClient httpClient;

 public Sender(HttpClient client) {
  httpClient = client;
 }

 public void run() {
   try {
    System.out.println(Thread.currentThread().getName()+"---Send message-"+count.getAndIncrement());
    PostMethod post = new PostMethod("http://127.0.0.1:8080/SendMessage");
    post.addParameter("msg", "Hello world!");
    httpClient.executeMethod(post);
    System.out.println(Thread.currentThread().getName()+"---Send message Success-"+count.getAndIncrement());

   } catch (IOException e) {
    e.printStackTrace();
   }
  }
 }

이 안 에는 HttpClient 를 사용 하여 서버 에 Post 요청 을 보 내 고 출력 을 계산 합 니 다.관심 있 는 학생 들 은 스스로 테스트 할 수 있 습 니 다.몇 개의 스 레 드 를 더 열 수 있 습 니 다.여 기 는 하나의 스 레 드 만 열 렸 습 니 다.
5.프로젝트 소스 코드:Crawl-Page_jb51.rar
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기