消息驱动的 bean 没有收到任何消息

Posted

技术标签:

【中文标题】消息驱动的 bean 没有收到任何消息【英文标题】:Message driven bean not receiving any messages 【发布时间】:2018-11-21 14:18:42 【问题描述】:

我的消息驱动 bean 没有收到任何消息,尽管我可以看到消息已发送到队列。

EE 容器是 WildFly 10.1.0.Final,我使用的是嵌入式 Apache ActiveMQ Artemis。向队列发送消息工作正常,我已经使用 JConsole 验证了这一点。

消息驱动 bean:

import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

@MessageDriven(activationConfig = 
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
    @ActivationConfigProperty(propertyName = "destination", propertyValue = "Q1"),
    @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"))
public class Q1MDB implements MessageListener 
    public void onMessage(Message message) 
        TextMessage textMessage = (TextMessage) message;

        try 
            System.out.println(textMessage.getText());
         catch (JMSException e) 
            e.printStackTrace();
        
    

发送消息的代码:

ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory("vm://localhost?broker.persistent=false");
try 
    Connection connection = activeMQConnectionFactory.createConnection();
    connection.start();

    Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

    Destination destination = session.createQueue("Q1");

    MessageProducer producer = session.createProducer(destination);
    producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

    TextMessage message = session.createTextMessage("message ");

    producer.send(message);

    session.close();

 catch (JMSException e) 
    e.printStackTrace();

独立完整的.xml:

    <subsystem xmlns="urn:jboss:domain:ejb3:4.0">
        ...
        <mdb>
            <resource-adapter-ref resource-adapter-name="$ejb.resource-adapter-name:activemq-ra.rar"/>
            <bean-instance-pool-ref pool-name="mdb-strict-max-pool"/>
        </mdb>
        ...
    <subsystem xmlns="urn:jboss:domain:messaging-activemq:1.0">
        <server name="default">
            <security-setting name="#">
                <role name="guest" send="true" consume="true" create-non-durable-queue="true" delete-non-durable-queue="true"/>
            </security-setting>
            <address-setting name="#" dead-letter-address="jms.queue.DLQ" expiry-address="jms.queue.ExpiryQueue" max-size-bytes="10485760" page-size-bytes="2097152" message-counter-history-day-limit="10"/>
            <http-connector name="http-connector" socket-binding="http" endpoint="http-acceptor"/>
            <http-connector name="http-connector-throughput" socket-binding="http" endpoint="http-acceptor-throughput">
                <param name="batch-delay" value="50"/>
            </http-connector>
            <in-vm-connector name="in-vm" server-id="0"/>
            <http-acceptor name="http-acceptor" http-listener="default"/>
            <http-acceptor name="http-acceptor-throughput" http-listener="default">
                <param name="batch-delay" value="50"/>
                <param name="direct-deliver" value="false"/>
            </http-acceptor>
            <in-vm-acceptor name="in-vm" server-id="0"/>
            <jms-queue name="ExpiryQueue" entries="java:/jms/queue/ExpiryQueue"/>
            <jms-queue name="DLQ" entries="java:/jms/queue/DLQ"/>
            <jms-queue name="Q1" entries="java:/jms/queue/q1"/>
            <connection-factory name="InVmConnectionFactory" entries="java:/ConnectionFactory" connectors="in-vm"/>
            <connection-factory name="RemoteConnectionFactory" entries="java:jboss/exported/jms/RemoteConnectionFactory" connectors="http-connector"/>
            <pooled-connection-factory name="activemq-ra" entries="java:/JmsXA java:jboss/DefaultJMSConnectionFactory" connectors="in-vm" transaction="xa"/>
        </server>
    </subsystem>

日志很好:

09:01:29,880 INFO  [org.jboss.as.security] (ServerService Thread Pool -- 59) WFLYSEC0002: Activating Security Subsystem
09:01:30,047 WARN  [org.jboss.as.txn] (ServerService Thread Pool -- 60) WFLYTX0013: Node identifier property is set to the default value. Please make sure it isunique.
09:01:30,080 INFO  [org.jboss.as.naming] (ServerService Thread Pool -- 52) WFLYNAM0001: Activating Naming Subsystem
09:01:30,047 INFO  [org.jboss.as.webservices] (ServerService Thread Pool -- 62) WFLYWS0002: Activating WebServices Extension
09:01:30,029 INFO  [org.jboss.as.clustering.infinispan] (ServerService Thread Pool -- 41) WFLYCLINF0001: Activating Infinispan subsystem.
09:01:30,097 INFO  [org.jboss.as.jsf] (ServerService Thread Pool -- 48) WFLYJSF0007: Activated the following JSF Implementations: [main]
09:01:30,419 INFO  [org.wildfly.iiop.openjdk] (ServerService Thread Pool -- 42) WFLYIIOP0001: Activating IIOP Subsystem
09:01:30,451 INFO  [org.jboss.remoting] (MSC service thread 1-2) JBoss Remoting version 4.0.21.Final
09:01:30,555 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-2) WFLYUT0003: Undertow 1.4.0.Final starting
09:01:30,593 INFO  [org.wildfly.extension.io] (ServerService Thread Pool -- 40) WFLYIO001: Worker 'default' has auto-configured to 4 core threads with 32 task treads based on your 2 available processors
09:01:30,942 INFO  [org.jboss.as.connector] (MSC service thread 1-2) WFLYJCA0009: Starting JCA Subsystem (WildFly/IronJacamar 1.3.4.Final)
09:01:31,240 INFO  [org.jboss.as.connector.subsystems.datasources] (ServerService Thread Pool -- 36) WFLYJCA0005: Deploying non-JDBC-compliant driver class com.ysql.jdbc.Driver (version 5.1)
09:01:31,276 INFO  [org.jboss.as.connector.deployers.jdbc] (MSC service thread 1-2) WFLYJCA0018: Started Driver service with driver-name = mysql
09:01:31,279 INFO  [org.jboss.as.connector.subsystems.datasources] (ServerService Thread Pool -- 36) WFLYJCA0004: Deploying JDBC-compliant driver class org.h2.Diver (version 1.3)
09:01:31,647 INFO  [org.jboss.as.security] (MSC service thread 1-1) WFLYSEC0001: Current PicketBox version=4.9.6.Final
09:01:31,695 INFO  [org.wildfly.extension.undertow] (ServerService Thread Pool -- 61) WFLYUT0014: Creating file handler for path 'C:\Program Files\wildfly-10.1..Final/welcome-content' with options [directory-listing: 'false', follow-symlink: 'false', case-sensitive: 'true', safe-symlink-paths: '[]']
09:01:32,448 INFO  [org.jboss.as.naming] (MSC service thread 1-1) WFLYNAM0003: Starting Naming Service
09:01:32,755 INFO  [org.wildfly.iiop.openjdk] (MSC service thread 1-3) WFLYIIOP0009: CORBA ORB Service started
09:01:32,791 INFO  [org.jboss.as.connector.deployers.jdbc] (MSC service thread 1-1) WFLYJCA0018: Started Driver service with driver-name = h2
09:01:32,836 INFO  [org.jboss.as.ejb3] (MSC service thread 1-1) WFLYEJB0481: Strict pool slsb-strict-max-pool is using a max instance size of 32 (per class), whch is derived from thread worker pool sizing.
09:01:32,838 INFO  [org.jboss.as.ejb3] (MSC service thread 1-1) WFLYEJB0482: Strict pool mdb-strict-max-pool is using a max instance size of 8 (per class), whic is derived from the number of CPUs on this host.
09:01:32,958 INFO  [org.jboss.as.mail.extension] (MSC service thread 1-1) WFLYMAIL0001: Bound mail session [java:jboss/mail/Default]
09:01:33,049 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-1) WFLYUT0012: Started server default-server.
09:01:33,096 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-4) WFLYUT0018: Host default-host starting
09:01:33,357 INFO  [org.jboss.as.connector.subsystems.datasources] (MSC service thread 1-1) WFLYJCA0001: Bound data source [java:jboss/datasources/ExampleDS]
09:01:33,711 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-4) WFLYUT0006: Undertow HTTP listener default listening on 127.0.0.1:8080
09:01:33,898 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-1) WFLYSRV0027: Starting deployment of "javaee.war" (runtime-name: "javaee.war")
09:01:33,985 WARN  [org.jboss.as.domain.management.security] (MSC service thread 1-3) WFLYDM0111: Keystore C:\Program Files\wildfly-10.1.0.Final\standalone\confguration\application.keystore not found, it will be auto generated on first use with a self signed certificate for host localhost
09:01:33,997 INFO  [org.jboss.as.connector.subsystems.datasources] (MSC service thread 1-3) WFLYJCA0001: Bound data source [java:jboss/datasources/javaee]
09:01:34,022 INFO  [org.jboss.as.server.deployment.scanner] (MSC service thread 1-1) WFLYDS0013: Started FileSystemDeploymentService for directory C:\Program Fies\wildfly-10.1.0.Final\standalone\deployments
09:01:34,423 INFO  [org.wildfly.extension.messaging-activemq] (MSC service thread 1-1) WFLYMSGAMQ0001: AIO wasn't located on this platform, it will fall back tousing pure Java NIO.
09:01:35,161 INFO  [org.apache.activemq.artemis.core.server] (ServerService Thread Pool -- 64) AMQ221000: live Message Broker is starting with configuration Broer Configuration (clustered=false,journalDirectory=C:\Program Files\wildfly-10.1.0.Final\standalone\data\activemq\journal,bindingsDirectory=C:\Program Files\wilfly-10.1.0.Final\standalone\data\activemq\bindings,largeMessagesDirectory=C:\Program Files\wildfly-10.1.0.Final\standalone\data\activemq\largemessages,pagingDirctory=C:\Program Files\wildfly-10.1.0.Final\standalone\data\activemq\paging)
09:01:35,406 INFO  [org.apache.activemq.artemis.core.server] (ServerService Thread Pool -- 64) AMQ221013: Using NIO Journal
09:01:35,443 INFO  [org.infinispan.factories.GlobalComponentRegistry] (MSC service thread 1-2) ISPN000128: Infinispan version: Infinispan 'Chakra' 8.2.4.Final
09:01:35,691 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-4) WFLYUT0006: Undertow HTTPS listener https listening on 127.0.0.1:8443
09:01:35,808 INFO  [org.infinispan.configuration.cache.EvictionConfigurationBuilder] (ServerService Thread Pool -- 69) ISPN000152: Passivation configured withou an eviction policy being selected. Only manually evicted entities will be passivated.
09:01:35,808 INFO  [org.infinispan.configuration.cache.EvictionConfigurationBuilder] (ServerService Thread Pool -- 69) ISPN000152: Passivation configured withou an eviction policy being selected. Only manually evicted entities will be passivated.
09:01:35,807 INFO  [org.infinispan.configuration.cache.EvictionConfigurationBuilder] (ServerService Thread Pool -- 66) ISPN000152: Passivation configured withou an eviction policy being selected. Only manually evicted entities will be passivated.
09:01:35,812 INFO  [org.infinispan.configuration.cache.EvictionConfigurationBuilder] (ServerService Thread Pool -- 68) ISPN000152: Passivation configured withou an eviction policy being selected. Only manually evicted entities will be passivated.
09:01:35,813 INFO  [org.infinispan.configuration.cache.EvictionConfigurationBuilder] (ServerService Thread Pool -- 68) ISPN000152: Passivation configured withou an eviction policy being selected. Only manually evicted entities will be passivated.
09:01:35,832 INFO  [org.infinispan.configuration.cache.EvictionConfigurationBuilder] (ServerService Thread Pool -- 66) ISPN000152: Passivation configured withou an eviction policy being selected. Only manually evicted entities will be passivated.
09:01:36,138 INFO  [org.apache.activemq.artemis.core.server] (ServerService Thread Pool -- 64) AMQ221043: Protocol module found: [artemis-server]. Adding protocl support for: CORE
09:01:36,145 INFO  [org.apache.activemq.artemis.core.server] (ServerService Thread Pool -- 64) AMQ221043: Protocol module found: [artemis-amqp-protocol]. Addingprotocol support for: AMQP
09:01:36,163 INFO  [org.apache.activemq.artemis.core.server] (ServerService Thread Pool -- 64) AMQ221043: Protocol module found: [artemis-hornetq-protocol]. Addng protocol support for: HORNETQ
09:01:36,167 INFO  [org.apache.activemq.artemis.core.server] (ServerService Thread Pool -- 64) AMQ221043: Protocol module found: [artemis-stomp-protocol]. Addin protocol support for: STOMP
09:01:36,226 INFO  [org.jboss.ws.common.management] (MSC service thread 1-1) JBWS022052: Starting JBossWS 5.1.5.Final (Apache CXF 3.1.6)
09:01:39,075 INFO  [org.jboss.as.jpa] (MSC service thread 1-3) WFLYJPA0002: Read persistence.xml for javaee
09:01:39,485 INFO  [org.jboss.weld.deployer] (MSC service thread 1-3) WFLYWELD0003: Processing weld deployment javaee.war
09:01:39,596 INFO  [org.hibernate.validator.internal.util.Version] (MSC service thread 1-3) HV000001: Hibernate Validator 5.2.4.Final
09:01:39,601 INFO  [org.jboss.as.jpa] (ServerService Thread Pool -- 66) WFLYJPA0010: Starting Persistence Unit (phase 1 of 2) Service 'javaee.war#javaee'
09:01:39,690 INFO  [org.hibernate.jpa.internal.util.LogHelper] (ServerService Thread Pool -- 66) HHH000204: Processing PersistenceUnitInfo [
    name: javaee
    ...]
09:01:40,371 INFO  [org.wildfly.extension.messaging-activemq] (MSC service thread 1-1) WFLYMSGAMQ0016: Registered HTTP upgrade for activemq-remoting protocol hadled by http-acceptor acceptor
09:01:40,371 INFO  [org.wildfly.extension.messaging-activemq] (MSC service thread 1-4) WFLYMSGAMQ0016: Registered HTTP upgrade for activemq-remoting protocol hadled by http-acceptor-throughput acceptor
09:01:40,371 INFO  [org.wildfly.extension.messaging-activemq] (MSC service thread 1-2) WFLYMSGAMQ0016: Registered HTTP upgrade for activemq-remoting protocol hadled by http-acceptor acceptor
09:01:40,635 INFO  [org.jboss.weld.Version] (MSC service thread 1-3) WELD-000900: 2.3.5 (Final)
09:01:40,698 INFO  [org.wildfly.extension.messaging-activemq] (MSC service thread 1-3) WFLYMSGAMQ0016: Registered HTTP upgrade for activemq-remoting protocol hadled by http-acceptor-throughput acceptor
09:01:40,757 INFO  [org.hibernate.Version] (ServerService Thread Pool -- 66) HHH000412: Hibernate Core 5.0.10.Final
09:01:40,819 INFO  [org.hibernate.cfg.Environment] (ServerService Thread Pool -- 66) HHH000206: hibernate.properties not found
09:01:40,827 INFO  [org.hibernate.cfg.Environment] (ServerService Thread Pool -- 66) HHH000021: Bytecode provider name : javassist
09:01:41,245 INFO  [org.hibernate.annotations.common.Version] (ServerService Thread Pool -- 66) HCANN000001: Hibernate Commons Annotations 5.0.1.Final
09:01:41,361 INFO  [org.apache.activemq.artemis.core.server] (ServerService Thread Pool -- 64) AMQ221007: Server is now live
09:01:41,361 INFO  [org.apache.activemq.artemis.core.server] (ServerService Thread Pool -- 64) AMQ221001: Apache ActiveMQ Artemis Message Broker version 1.1.0.wldfly-017 [nodeID=f533a10c-caf1-11e7-9497-41b29e726a53]
09:01:41,545 INFO  [org.wildfly.extension.messaging-activemq] (ServerService Thread Pool -- 69) WFLYMSGAMQ0002: Bound messaging object to jndi name java:jboss/eported/jms/RemoteConnectionFactory
09:01:41,614 INFO  [org.apache.activemq.artemis.core.server] (ServerService Thread Pool -- 67) AMQ221003: trying to deploy queue jms.queue.DLQ
09:01:41,648 INFO  [org.apache.activemq.artemis.core.server] (ServerService Thread Pool -- 64) AMQ221003: trying to deploy queue jms.queue.ExpiryQueue
09:01:41,648 INFO  [org.jboss.as.jpa] (ServerService Thread Pool -- 66) WFLYJPA0010: Starting Persistence Unit (phase 2 of 2) Service 'javaee.war#javaee'
09:01:41,653 INFO  [org.apache.activemq.artemis.core.server] (ServerService Thread Pool -- 70) AMQ221003: trying to deploy queue jms.queue.Q1
09:01:41,655 INFO  [org.wildfly.extension.messaging-activemq] (ServerService Thread Pool -- 68) WFLYMSGAMQ0002: Bound messaging object to jndi name java:/ConnecionFactory
09:01:41,708 INFO  [org.jboss.as.connector.deployment] (MSC service thread 1-2) WFLYJCA0007: Registered connection factory java:/JmsXA
09:01:41,909 INFO  [org.apache.activemq.artemis.ra] (MSC service thread 1-2) Resource adaptor started
09:01:41,910 INFO  [org.jboss.as.connector.services.resourceadapters.ResourceAdapterActivatorService$ResourceAdapterActivator] (MSC service thread 1-2) IJ020002 Deployed: file://RaActivatoractivemq-ra
09:01:41,943 INFO  [org.jboss.as.connector.deployment] (MSC service thread 1-1) WFLYJCA0002: Bound JCA ConnectionFactory [java:/JmsXA]
09:01:41,944 INFO  [org.wildfly.extension.messaging-activemq] (MSC service thread 1-1) WFLYMSGAMQ0002: Bound messaging object to jndi name java:jboss/DefaultJMSonnectionFactory
09:01:41,984 INFO  [org.hibernate.dialect.Dialect] (ServerService Thread Pool -- 66) HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
09:01:42,149 INFO  [org.jboss.as.ejb3] (MSC service thread 1-2) WFLYEJB0042: Started message driven bean 'Q1MDB' with 'activemq-ra.rar' resource adapter
09:01:42,186 INFO  [org.hibernate.envers.boot.internal.EnversServiceImpl] (ServerService Thread Pool -- 66) Envers integration enabled? : true
09:01:43,143 INFO  [org.hibernate.tool.hbm2ddl.SchemaExport] (ServerService Thread Pool -- 66) HHH000227: Running hbm2ddl schema export
09:01:43,297 INFO  [org.hibernate.tool.hbm2ddl.SchemaExport] (ServerService Thread Pool -- 66) HHH000230: Schema export complete
09:01:45,064 INFO  [javax.enterprise.resource.webcontainer.jsf.config] (ServerService Thread Pool -- 72) Initializing Mojarra 2.2.13.SP1 20160303-1204 for contet '/javaee'
09:01:48,030 INFO  [org.jboss.resteasy.resteasy_jaxrs.i18n] (ServerService Thread Pool -- 72) RESTEASY002225: Deploying javax.ws.rs.core.Application: class org.boss.weld.proxies.ResourceConfig$Proxy$_$$_WeldClientProxy
09:01:48,113 INFO  [org.wildfly.extension.undertow] (ServerService Thread Pool -- 72) WFLYUT0021: Registered web context: /javaee
09:01:48,227 INFO  [org.jboss.as.server] (ServerService Thread Pool -- 37) WFLYSRV0010: Deployed "javaee.war" (runtime-name : "javaee.war")
09:01:48,479 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0060: Http management interface listening on http://127.0.0.1:9990/management
09:01:48,479 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0051: Admin console listening on http://127.0.0.1:9990
09:01:48,480 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: WildFly Full 10.1.0.Final (WildFly Core 2.2.0.Final) started in 24788ms - Started 490 of737 services (422 services are lazy, passive or on-demand)

有什么建议吗?

【问题讨论】:

您具体如何使用 JConsole 来确认消息已正确发送?您是否还使用 JConsole 来确认队列中有消费者? 我可以看到队列属性QueueSize 每次运行代码发送消息时都会增加。但是,ConsumerCount 仍然为零。 【参考方案1】:

我相信这个问题是您在 MDB 的激活配置中引用“目标”的方式。您指定了不是 JNDI 名称的“Q1”,并且由于它不是 JNDI 名称,Artemis JCA RA 将假定您正在尝试使用底层核心队列的实现名称(如果找不到它只会创建)。但是,您已经定义了一个名为“Q1”的 JMS 队列,我相信这将导致一个名为“jms.queue.Q1”的核心队列。因此,您应该指定“jms.queue.Q1”(即底层核心队列的实际名称)或使用“java:/jms/queue/q1”(即队列的 JNDI 名称)。

【讨论】:

感谢贾斯汀,非常感谢您的帮助。不幸的是它没有用,我尝试了“jms.queue.Q1”和“java:/jms/queue/q1”。没有工作。但是,我在部署期间在日志中发现了这一点:11:28:37,307 INFO [org.apache.activemq.artemis.ra] (default-threads - 1) AMQ151001: Attempting to reconnect org.apache.activemq.artemis.ra.inflow.ActiveMQActivationSpec(ra=org.apache.activemq.artemis.ra.ActiveMQResourceAdapter@78712571 destination=jms.queue.Q1 destinationType=javax.jms.Queue ack=Auto-acknowledge durable=false clientID=null user=null maxSession=15)

以上是关于消息驱动的 bean 没有收到任何消息的主要内容,如果未能解决你的问题,请参考以下文章

Intellij IDEA 创建消息驱动Bean - 接收JMS消息

是否可以在运行时手动将消息驱动 bean 订阅到 JMS 队列/主题?

WFLYEJB0137:仅允许具有 bean 管理的事务划分的会话和消息驱动的 bean 访问 UserTransaction

WebSphere 7 中的消息驱动 bean (EJB3)、XA 事务、错误处理

消息驱动的 bean (MDB) 可以在“外部”MQ 上侦听吗?

消息驱动bean(MDB)实例