>  기사  >  Java  >  Tomcat에 ActiveMQ 내장: 세 가지 중요한 지식 포인트를 숙지해야 합니다.

Tomcat에 ActiveMQ 내장: 세 가지 중요한 지식 포인트를 숙지해야 합니다.

php是最好的语言
php是最好的语言원래의
2018-08-03 14:34:172390검색

Tomcat에 내장된 ActiveMQ

일부 프로젝트에서는 ActiveMQ를 별도로 여는 것이 프로젝트 구현에 다소 번거로울 때가 있습니다. 그래서 우리는 ActiveMQ를 Tomcat에 포함시키고, ActiveMQ는 Tomcat이 시작되는 것과 동시에 시작됩니다. 여기서 우리는 세 가지 중요한 지식 포인트를 숙지해야 합니다
  • BrokerService in ActiveMQ

  • Self-start Servlet 구성

  • jconsole을 사용하여 임베디드 ActiveMQ의 실행 상태 이해

1. BrokerService 활성화

# 🎜🎜#pom.xml에 ActiveMQ 종속성을 추가합니다. 이 코드 예제는 버전 5.7을 사용합니다.

activemq-core만 필요하다는 점을 기억하세요.

<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-core</artifactId>
    <version>5.7.0</version>
</dependency>
activemq-core就行

    // author:herbert qq:464884492
    BrokerService broker = new BrokerService();
    broker.setUseJmx(true); // 开启监控
    broker.setPersistent(true); // 持久化
    broker.setBrokerName("Test");
    SimpleAuthenticationPlugin sap = new SimpleAuthenticationPlugin();
    AuthenticationUser au = new AuthenticationUser("admin", "admin","users");
    ArrayList<AuthenticationUser> d = new ArrayList<AuthenticationUser>();
    d.add(au);
    sap.setUsers(d); // 用户验证
    broker.setPlugins(new BrokerPlugin[] { sap });
    String mqDataPath = "/activemq"; // 存储位置 
    broker.getPersistenceAdapter().setDirectory(new File(mqDataPath));
    broker.addConnector("tcp://localhost:61616"); // 连接地址
    broker.start();

在编写BrokerService代码部分,主要注意三个点

  1. 是否需要在jconsole中显示监控信息 broker.setUseJmx(true)

  2. 设置连接用户名和密码,如何使用验证插件

  3. 是否持久化,存储位置设置,持久化配置

所以需要启动一个连接地址 tcp://localhost:61616,用户名为admin,密码为admin,需要持久化,持久化数据文件存储地址为 /activemq ,需要启动jconsole监控的BrokerService的代码如下:

 // author:herbert qq:464884492
String mqConnUrl = "tcp://localhost:61616";
String connUrl = "failover:(" + mqConnUrl.trim()+ ")?initialReconnectDelay=1000&maxReconnectDelay=30000";
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("admin","admin", connUrl);
javax.jms.Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue("system");
MessageProducer messageProducer = session.createProducer(destination);

for (int i = 0; i < 10; i++) {
 javax.jms.TextMessage message = session.createTextMessage("ActiveMQ 发送的消息" + i);
 System.out.println("发送消息:" + "ActiveMQ 发送的消息" + i);
 messageProducer.send(message);
}

二、生产者和消费者

ActiveMQ中,通用的消息传递方式有两种

  • 队列,支持消息持久化,未消费的消息,在重启后依然存在。若有多个消费者,在每次提取一条消息的前提下,所有消费均分队列中的消息

  • 主题,不支持消息持久化,未消费的消息,在重启后消息丢失。若有多个消费,每个消费者依次消费主题中所有消息

不管是生产者还是消费者代码编写,主要是4个步骤

  1. 建立连接,采用failover:()方式,自动断线重连

  2. 建立Session,获取发送或接收目标Destination ,指定是队列(session.createQueue(queueName)),还是主题(session.createTopic(topicName))

  3. 通过Session获取生产者或消费者

  4. 生产或消费消息

我们现在编写一个生产者的代码,并循环产生10条消息

 // author:herbert qq:464884492
String mqConnUrl = "tcp://localhost:61616";
String connUrl = "failover:(" + mqConnUrl.trim()+ ")?initialReconnectDelay=1000&maxReconnectDelay=30000";
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("admin", "admin", connUrl);
javax.jms.Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue("system");
MessageConsumer messageConsumer = session.createConsumer(destination);
messageConsumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(javax.jms.Message message) {
   ActiveMQTextMessage m = (ActiveMQTextMessage) message;
    try {
          System.out.println("接收到:" + m.getText());
         } catch (JMSException e) {
         e.printStackTrace();
        }
     }
});

编写一个消费,消费上边的10条消息

 // author:herbert qq:464884492
@WebServlet(urlPatterns = "/initmq", loadOnStartup = 1)
public class InitMqServlet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
        super.init(config);
        // 这里编写启动ActiveMQ代码
 }
}

运行效果

Tomcat에 ActiveMQ 내장: 세 가지 중요한 지식 포인트를 숙지해야 합니다.

可见,我们生产者,产生的10条消息,已成功被消费者处理了。

三、监控嵌入的ActiveMQ

对于嵌入的ActiveMQ,在BrokerService启动前需要设置 broker.setUseJmx(true);然后找到你的JAVA_HOME,切换到bin,输入jconsole命令。

Tomcat에 ActiveMQ 내장: 세 가지 중요한 지식 포인트를 숙지해야 합니다.

待jconsole启动后,选择ActiveMQ所在的进程。连接后选择Mbean页签

Tomcat에 ActiveMQ 내장: 세 가지 중요한 지식 포인트를 숙지해야 합니다.

红框的地方分别为已消费和已进入MQ中的消息的条数。选择操作,找到那个SendTextMessage还可以想此队列发送消息。

四、Selvelt跟随Tomcat启动

对于Tomcat7.x版本之后Tomcat,Selvelt都可以通过直接在代码中通过注解的方式配置URl连接,一起是否自启动loadOnStartup 这个值>=0表示需要自启动,值越小优先级越高

rrreee

五、总结

这次以ActiveMQ作为消息队列使用切入点,总体上说还比较顺利。其中唯一出现问题的地方就是对于activeMQ依赖过多,多依赖了jaractivemq-broker,导致消息能连接,但不能发送消息。后边直接换成 activemq-all,有出现slf4j日志冲突,使用exclusions依然不能解决问题。最终只依赖 activemq-coreBrokerService 코드 부분 작성 시 주의할점 3가지

    # 🎜🎜 # jconsolebroker.setUseJmx(true)에 모니터링 정보를 표시해야 하는지 여부


    설정 연결 사용자 이름과 비밀번호, 인증 플러그인 사용법

    영속성 여부, 저장 위치 설정, 지속성 구성

    따라서 필수입니다 연결 주소 tcp://localhost:61616 시작, 사용자 이름은 admin, 비밀번호는 admin , 지속성이 필요하며 데이터 파일은 지속됩니다. 저장소 주소는 /activemq입니다. jconsole 모니터링에서 시작해야 하는 BrokerService의 코드는 다음과 같습니다.

    rrreee#🎜🎜# 2. 생산자와 소비자 #🎜🎜# #🎜🎜#ActiveMQ에는 두 가지 일반적인 메시지 전달 방법이 있습니다 #🎜🎜##🎜🎜##🎜🎜##🎜🎜# 큐는 메시지 지속성을 지원하며, 다시 시작한 후에도 사용되지 않은 메시지는 계속 존재합니다. Consumer가 여러 명인 경우 매번 하나의 메시지를 추출한다는 전제하에 모든 Consumer는 대기열의 메시지를 동일하게 공유합니다. #🎜🎜##🎜🎜##🎜🎜##🎜🎜# 주제는 메시지 지속성을 지원하지 않습니다. 다시 시작하면 소비된 메시지가 손실됩니다. Consumer가 여러 명일 경우 각 Consumer는 차례로 해당 토픽의 모든 메시지를 소비합니다 #🎜🎜##🎜🎜##🎜🎜##🎜🎜#Producer가 작성한 코드인지 Consumer 코드인지 여부에 관계없이 주로 #🎜🎜 #4failover:() 메서드를 사용하여 연결을 설정하는 #🎜🎜#
      #🎜🎜##🎜🎜# 단계 , Connect #🎜🎜##🎜🎜##🎜🎜##🎜🎜#을 자동으로 연결 해제하고 재설정하여 세션을 생성하고 전송 또는 수신 대상 대상을 가져오고 지정합니다. 대기열(session.createQueue(queueName)) 또는 주제(session.createTopic(topicName))#🎜🎜##🎜🎜##🎜🎜##🎜🎜 # 세션을 통해 생산자 또는 소비자 가져오기#🎜🎜##🎜🎜##🎜🎜##🎜🎜#생산 또는 소비자 메시지#🎜🎜##🎜🎜#
    #🎜🎜# 이제 생산자 코드를 작성하고 루프를 통해 10개의 메시지를 생성합니다 #🎜🎜#rrreee#🎜🎜#위의 10개 메시지를 소비하도록 소비자 작성#🎜🎜#rrreee#🎜🎜#실행 효과#🎜🎜##🎜🎜# Tomcat에 ActiveMQ 내장: 세 가지 중요한 지식 포인트를 숙지해야 합니다.#🎜🎜# #🎜🎜 #우리 생산자가 생성한 10개의 메시지가 소비자에 의해 성공적으로 처리된 것을 볼 수 있습니다. #🎜🎜##🎜🎜#3. 내장형 ActiveMQ 모니터링#🎜🎜##🎜🎜#내장형 ActiveMQ의 경우 BrokerService를 시작하기 전에 broker.setUseJmx(true)를 설정한 다음 JAVA_HOME을 찾아 bin으로 전환해야 합니다. jconsole 명령. #🎜🎜##🎜🎜#1. png#🎜🎜##🎜🎜#jconsole이 시작된 후 ActiveMQ가 있는 프로세스를 선택합니다. 연결 후 Mbean 탭 #🎜🎜##🎜🎜#Tomcat에 ActiveMQ 내장: 세 가지 중요한 지식 포인트를 숙지해야 합니다.#🎜🎜##🎜🎜#빨간색 상자는 소비된 메시지 수와 MQ에 들어간 메시지 수를 나타냅니다. 작업을 선택하고 SendTextMessage를 찾으면 이 큐에 메시지를 보낼 수도 있습니다. #🎜🎜##🎜🎜# 4. Selvelt는 Tomcat으로 시작합니다. #🎜🎜##🎜🎜# Tomcat 및 Tomcat7 이후의 Selvelt 버전의 경우 loadOnStartup 이 값>=0은 자체 시작이 필요함을 의미합니다. . 값이 작을수록 우선순위가 높습니다.#🎜🎜#rrreee#🎜🎜#5. 요약#🎜🎜##🎜🎜#이번에는 ActiveMQ를 사용하여 메시지 대기열을 사용하기 위한 진입점으로 전반적으로 매끄러운. 유일한 문제는 activeMQ에 너무 많이 의존하고 jaractivemq-broker에 너무 많이 의존하여 메시지가 연결될 수 있지만 전송되지 않는다는 것입니다. 나중에 activemq-all로 직접 변경했습니다. slf4j 로그 충돌이 발생하여 exclusions를 사용해도 문제가 해결되지 않았습니다. 결국 activemq-core에만 의존하여 모든 문제를 완벽하게 해결했습니다. #🎜🎜##🎜🎜#관련 기사: #🎜🎜##🎜🎜#관련 기사: #🎜🎜##🎜🎜##🎜🎜##🎜🎜#JMS 메시지 지속성, ActiveMQ 메시지를 mySql로 지속 관련 이해 ActiveMQ의 세션 설정#🎜🎜##🎜🎜##🎜🎜##🎜🎜#

위 내용은 Tomcat에 ActiveMQ 내장: 세 가지 중요한 지식 포인트를 숙지해야 합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.