微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

jBOSS EAP 7.3 消息驱动 Bean 在 Artemis 故障回复期间无法部署应用程序

如何解决jBOSS EAP 7.3 消息驱动 Bean 在 Artemis 故障回复期间无法部署应用程序

我试图在一个集群中运行两个 JBoss EAP 7.3 实例。两个实例都运行 2 个 Artemis activemq 服务器,一个是活动的,另一个是备份另一个 EAP 实例上的活动服务器。实时备份对配置为使用网络复制来同步它们的数据。

我遇到的问题是,如果实时 Artemis 实例需要在启动时(故障回复期间)与备份 Artemis 实例同步,我的应用程序将无法部署。我得到的错误是:

"WFLYCTL0412: required services that are not installed:" => [
        "jboss.naming.context.java.jboss.exported.jms.RemoteConnectionFactory","jboss.ra.activemq-ra","jboss.naming.context.java.jboss.DefaultJMSConnectionFactory"
    ],"WFLYCTL0180: Services with missing/unavailable dependencies" => [
 

在收到这些错误后不久,我可以在日志中看到以下消息:

WFLYJCA0002: Bound JCA ConnectionFactory [java:/JmsXA]

WFLYMSGAMQ0002: Bound messaging object to jndi name java:jboss/DefaultJMSConnectionFactory

我相信 Jboss 正在尝试在 Artemis 准备好之前部署我的应用程序。在故障恢复的情况下,备份服务器(变为活动状态)需要在启动之前将其状态复制到活动服务器。这显然比干净启动需要更长的时间。我相信正是这个额外的时间导致 Artemis 稍后启动,因此在部署应用程序时连接工厂不可用。

如果我将依赖添加到 MDB bean 以表明它依赖于 java:jboss/DefaultJMSConnectionFactory,那就太好了。

这是 MDB 豆

@MessageDriven(activationConfig = {
    @ActivationConfigProperty(propertyName = "destinationType",propertyValue = "javax.jms.Queue"),@ActivationConfigProperty(propertyName = "ackNowledgeMode",propertyValue = "Auto-ackNowledge"),@ActivationConfigProperty(propertyName = "destination",propertyValue = "java:jboss/exported/queue/siguard/serverQueue"),@ActivationConfigProperty(propertyName = "clientFailureCheckPeriod",propertyValue = "600000"),@ActivationConfigProperty(propertyName = "connectionTTL",propertyValue = "-1") })
public class ServerQueueListenerBean implements MessageListener {

@EJB
private ClientMessageHandlerLocal clientMessageHandler;

@EJB
private NodeMessageHandlerLocal nodeMessageHandler;

@EJB
private ServerMessageHandlerLocal serverMessageHandler;

private static final Logger logger = LoggingManager.getLogger(ServerQueueListenerBean.class);

/**
 * @see MessageListener#onMessage(Message)
 */
public void onMessage(Message message) {
    try {
        if (message instanceof ObjectMessage) {
            Object msgData = ((ObjectMessage)message).getobject();
            if (msgData instanceof NodeMessage) {
                NodeMessage nodeMessage = (NodeMessage)msgData;
                nodeMessageHandler.handleMessage(nodeMessage);
            } else if (msgData instanceof ClientMessage) {
                ClientMessage clientMessage = (ClientMessage)msgData;
                clientMessage.setinitiatorUID(message.getJMSCorrelationID());
                clientMessageHandler.handleMessage(clientMessage);
            } else if (msgData instanceof ServerMessage) {
                ServerMessage serverMessage = (ServerMessage)msgData;
                serverMessageHandler.handleMessage(serverMessage);
            } else {
                throw new Exception("Unexpected message content:" + msgData);
            }
        }
    } catch (Exception e) {
        logger.fatal(e);
    }

}

解决方法

您无法在备份上部署您的应用程序,因为代理在实时停止之前不会启动。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。