Discuss / Java / 还没开始敲,想到几个问题。

还没开始敲,想到几个问题。

Topic source

Loading...

#1 Created at ... [Delete] [Delete and Lock User]

这里规定的实际上是我这个队列最多能并发处理十个producer产生的信息。每一个producer发送一个消息过来,jms从线程池中取一个线程调用onMailMessageReceived方法,所以十个线程可能同时调用onMailMessageReceived这个方法。

 @JmsListener(destination = "jms/queue/mail", concurrency = "10")
    public void onMailMessageReceived(Message message) throws Exception {

因此,要时刻牢记,onMailMessageReceived()方法可能被多线程并发执行,一定要保证线程安全。

是不是也就是说onMailMessageReceived发送邮件这个代码块在任意时刻最多只有一个线程执行。这块代码加个锁?又要回去补补线程知识了😂😂

Loading...

#2 Created at ... [Delete] [Delete and Lock User]

启动时还会发现,基于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] 

Loading...

#3 Created at ... [Delete] [Delete and Lock User]

我很好奇为什么JMS接口为什么不像JDBC规范一样直接集成到JDK里面,是不是可以理解为JDK只集成了最最核心的接口和规范。

其他一些规范和接口需要单独的jar包。不过想想也是,类似于消息服务这种如果集成到JDK中反而臃肿了。刚看到JavaMail接口也是单独的,我们学那的时候也需要到一个接口包一个实现类的包。有意思

Loading...

#4 Created at ... [Delete] [Delete and Lock User]

还有几个问题不明白,一个是在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并行执行。这里还好模糊,不知道廖大能不能看到

Loading...

#5 Created at ... [Delete] [Delete and Lock User]

好玩,首先我在这里把@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

Reply