消息驱动Bean停止使用消息

问题描述

我有一个REST端点,该端点将消息发送到三个单独的通用消息队列。每个队列都有一个与之关联的@MessageDriven bean,然后可以处理消息。

我遇到的问题是,所有三个MDB在部署(或重新启动)后仅在第一次调用端点时才接收消息。此后的每次调用都只有2/3或1/3的bean可以接听消息。我可以看到它们已被发送但未被bean识别。

有没有一种方法可以设置这些bean,以便它们始终识别正在添加到队列中的消息?

系统

  • JDK 11
  • JBoss EAP 7.2.9.GA(WildFly Core 6.0.30.Final-redhat-00001)
  • 通用消息传递(Software AG)队列

部署后的第一个日志语句

 INFO  [jms.MessageSender] (default task-3) MessageSender: Sending message
 INFO  [jms.MessageSender] (default task-3) Creating JMS session using realm 
 INFO  [jms.MessageSender] (default task-3) Initializing JMS Session..
 INFO  [jms.MessageSender] (default task-3) Finding JMS queue queue/TestQueue
 INFO  [jms.MessageSender] (default task-3) pushing event
 INFO  [jms.MessageSender] (default task-3) Event sent successfully
 INFO  [jms.MessageMDB] (Client-Push: 4:0)  Message Received <----This doesn't happen on subsequent calls

MessageSender

@Stateless(mappedname = "MessageSender")
@LocalBean
public class MessageSender {

    public static final String NAME = "MessageSender";
    public static final String JNDI_NAME = "java:global//MessageSender";

    private static final Logger logger = LoggerFactory.getLogger(MessageSender.class);

    public MessageSender() { super(); }
    
    public MessageSender(@SystemProperty("<REALM>") String rnames,@SystemProperty("<USERNAME>") String username,@SecurityVaultProperty("${<PASSWORD>}") char[] password,@SystemProperty("queue/TestQueue") String destinationName) {
        super(rnames,username,password,destinationName,logger);
    }

    public void sendMessage(Object message,String prop) throws Exception {
        logger.info("MessageSender: Sending message");

        String messageText = getMessage(message,messageClass);
        nSession session = null;
        try {
            nSessionAttributes nsa = new nSessionAttributes(rname);
            nsa.setFollowTheMaster(true);
            nsa.setdisconnectOnClusterFailure(true);

            logger.info("Creating JMS session using realm {}",rnames);
            session = nSessionFactory.create(nsa,new String(password));
            logger.info("Initializing JMS Session..");
            session.init(true);

            nChannelAttributes nca = new nChannelAttributes(destinationName);

            nEventAttributes attr = new nEventAttributes();
            attr.setMessageType(nEventAttributes.JMS_TEXT_MESSAGE_TYPE);

            nEventProperties props = new nEventProperties();
            props.put("prop",prop);

            nConsumeEvent event = new nConsumeEvent((String) null,messageText.getBytes("UTF-8"));
            event.setAttributes(attr);
            event.setProperties(props);

            logger.info("Finding JMS queue {}",destinationName);
            nQueue jmsQueue = session.findQueue(nca);
            logger.info("pushing event");
            jmsQueue.push(event);
            logger.info("Event sent successfully");

        } catch (Exception e) {
            logger.error("Failed to send JMS message",e);
            throw new Exception("Failed to send JMS message",e);
        } finally {
            if (session != null) {
                session.close();
            }
        }
    }
}

Message Bean

@MessageDriven(name = MessageMDB.JNDI_NAME,activationConfig = {
                @ActivationConfigProperty(propertyName = "connectionFactory",propertyValue = "java:/global/remoteJMS/ConnectionFactory"),@ActivationConfigProperty(propertyName = "destinationType",propertyValue = "javax.jms.Queue"),@ActivationConfigProperty(propertyName = "destination",propertyValue = "java:/global/remoteJMS/queue/TestQueue"),@ActivationConfigProperty(propertyName = "user",propertyValue = "${<USERNAME>}"),@ActivationConfigProperty(propertyName = "password",propertyValue = "${<Password>}")
        })
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(value = TransactionAttributeType.NOT_SUPPORTED)
@ResourceAdapter("org.jboss.genericjms")
public class MessageMDB implements MessageListener {
    public static final String JNDI_NAME = "MessageMDB";
    private static final Logger logger = LoggerFactory.getLogger(MessageMDB.class);



    public void onMessage(Message message) {
        logger.info("Message Received");
        try {
            if (message instanceof TextMessage) {
                //do stuff  
            
            } else {
                logger.error("Message of wrong type: {}",message.getClass().getName());
            }
        } catch (JMSException e) {
            logger.error("JMSException thrown: ",e);
            mdc.setRollbackOnly();
        }
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...