还没开始敲,想到几个问题。
Topic source启动时还会发现,基于tcp协议的JMS服务启动在了61616端口。
😊应该就是这个CORE吧,可以理解为Artemis的CORE把JMS基于TCP协议的实现类绑定在了61616端口。
还有基于其他协议的服务也可以绑定在这个端口,并不冲突,类似于前几节,TCP和UDP也可以绑定在同一端口下。也就是老师说的一鱼好几吃。
2023-02-10 11:21:07,072 INFO [org.apache.activemq.artemis.core.server] AMQ221020: Started NIO Acceptor at 0.0.0.0:61616 for protocols [CORE,MQTT,AMQP,STOMP,HORNET
Q,OPENWIRE]
2023-02-10 11:21:07,137 INFO [org.apache.activemq.artemis.core.server] AMQ221020: Started NIO Acceptor at 0.0.0.0:5445 for protocols [HORNETQ,STOMP]
2023-02-10 11:21:07,189 INFO [org.apache.activemq.artemis.core.server] AMQ221020: Started NIO Acceptor at 0.0.0.0:5672 for protocols [AMQP]
2023-02-10 11:21:07,243 INFO [org.apache.activemq.artemis.core.server] AMQ221020: Started NIO Acceptor at 0.0.0.0:1883 for protocols [MQTT]
2023-02-10 11:21:07,274 INFO [org.apache.activemq.artemis.core.server] AMQ221020: Started NIO Acceptor at 0.0.0.0:61613 for protocols [STOMP]
我很好奇为什么JMS接口为什么不像JDBC规范一样直接集成到JDK里面,是不是可以理解为JDK只集成了最最核心的接口和规范。
其他一些规范和接口需要单独的jar包。不过想想也是,类似于消息服务这种如果集成到JDK中反而臃肿了。刚看到JavaMail接口也是单独的,我们学那的时候也需要到一个接口包一个实现类的包。有意思
还有几个问题不明白,一个是在send的时候,假如有一百个客户端同时send,
jmsTemplate.send("/queue/mail", new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
return session.createTextMessage(writeValueAsString);
}
});
还是按照这里规定的只能同时接收十个,其余等待。
@JmsListener(destination ="/queue/mail",concurrency = "10")
还是说接收时候有个默认大小,这里规定的10,只是我批量处理的时候允许十个consumer并行执行。这里还好模糊,不知道廖大能不能看到
好玩,首先我在这里把@Component注释掉了,也就是说,启动tomcat服务器的时候并没有在Artemis服务器上创建/queue/mai队列对应的处理者consumer。
@Component
public class MessageListener {
但是当我发送邮件的时候,就已经在Artemis服务器上创建了一个/queue/mai队列。
jmsTemplate.send("/queue/mail", new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
return session.createTextMessage(writeValueAsString);
}
});
然后启动服务器,调用发送邮件接口,这时候是收不到邮件的。然后关闭服务器。打开@Component,启动服务器,这时候就会直接在Artemis服务上创建/queue/mail队列对应的处理方法,并且会直接处理producer产生在队列中的消息。此时你会发现,神奇的事情发生了,刚刚没有发送的邮件此时收到了。这个功能就很像,好友给你发送消息,此时你是离线的。他把消息发送到了Artemis服务器上,当你上线以后,直接收到了好友发送给你的消息。不过感觉这个应该比发邮件更复杂,牵涉http协议啥的,以后再考虑,哈哈。感谢廖大!!!!
- 1
Loading...
这里规定的实际上是我这个队列最多能并发处理十个producer产生的信息。每一个producer发送一个消息过来,jms从线程池中取一个线程调用onMailMessageReceived方法,所以十个线程可能同时调用onMailMessageReceived这个方法。
因此,要时刻牢记,onMailMessageReceived()方法可能被多线程并发执行,一定要保证线程安全。
是不是也就是说onMailMessageReceived发送邮件这个代码块在任意时刻最多只有一个线程执行。这块代码加个锁?又要回去补补线程知识了😂😂