Search in sources :

Example 1 with JMSBridgeStore

use of com.sun.messaging.bridge.api.JMSBridgeStore in project openmq by eclipse-ee4j.

the class BridgeServiceManagerImpl method init.

/**
 * Initialize the bridge service manager
 */
@Override
public synchronized void init(BridgeBaseContext ctx) throws Exception {
    com.sun.messaging.jmq.jmsclient.Debug.setUseLogger(true);
    FaultInjection.setBridgeBaseContext(ctx);
    _bc = ctx;
    Properties props = _bc.getBridgeConfig();
    String activekey = props.getProperty(BridgeBaseContext.PROP_PREFIX) + ".activelist";
    List<String> alist = BridgeUtil.getListProperty(activekey, props);
    int size = alist.size();
    String name = null;
    Iterator<String> itr = alist.iterator();
    while (itr.hasNext()) {
        name = itr.next();
        try {
            loadBridge(name);
        } catch (BridgeException e) {
            if (e.getStatus() == Status.NOT_MODIFIED) {
                continue;
            }
            _bc.logError(_bmr.getKString(_bmr.E_LOAD_BRIDGE_FAILED, name, e.getMessage()), null);
            throw e;
        }
    }
    if (_bc.isHAEnabled()) {
        JMSBridgeStore store = (JMSBridgeStore) _bc.getJDBCStore();
        if (store == null) {
            throw new BridgeException("null JDBC store");
        }
        List jmsbridges = store.getJMSBridges(null);
        name = null;
        itr = alist.iterator();
        while (itr.hasNext()) {
            name = itr.next();
            String type = props.getProperty(props.getProperty(BridgeBaseContext.PROP_PREFIX) + "." + name + ".type");
            if (type == null) {
                throw new BridgeException(_bmr.getString(_bmr.X_BRIDGE_NO_TYPE, name));
            }
            if (!type.trim().toUpperCase(_bmr.getLocale()).equals(Bridge.JMS_TYPE)) {
                continue;
            }
            if (jmsbridges.contains(name)) {
                continue;
            }
            try {
                store.addJMSBridge(name, true, null);
            } catch (DupKeyException e) {
                _bc.logInfo(_bmr.getKString(_bmr.I_JMSBRIDGE_NOT_OWNER, name), null);
                itr.remove();
            }
        }
        jmsbridges = store.getJMSBridges(null);
        itr = jmsbridges.iterator();
        while (itr.hasNext()) {
            name = itr.next();
            if (alist.contains(name)) {
                continue;
            }
            alist.add(name);
            try {
                loadBridge(name);
            } catch (BridgeException e) {
                _bc.logError(_bmr.getKString(_bmr.E_LOAD_BRIDGE_FAILED, name, e.getMessage()), null);
                throw e;
            }
        }
        if (alist.size() != size) {
            StringBuilder sb = new StringBuilder();
            int i = 0;
            itr = alist.iterator();
            while (itr.hasNext()) {
                if (i > 0) {
                    sb.append(',');
                }
                sb.append(itr.next());
                i++;
            }
            Properties p = new Properties();
            p.setProperty(activekey, sb.toString());
            _bc.updateBridgeConfig(p);
        }
    }
    String keyu = props.getProperty(BridgeBaseContext.PROP_PREFIX) + ctx.PROP_ADMIN_USER_SUFFIX;
    String keyp = props.getProperty(BridgeBaseContext.PROP_PREFIX) + ctx.PROP_ADMIN_PASSWORD_SUFFIX;
    _user = props.getProperty(keyu);
    _passwd = props.getProperty(keyp);
    if (_user == null || _user.trim().length() == 0) {
        throw new JMSException(_bmr.getString(_bmr.X_BRIDGE_NO_ADMIN_USER, keyu));
    }
    _user = _user.trim();
    if (_passwd == null || _passwd.trim().length() == 0) {
        throw new JMSException(_bmr.getString(_bmr.X_BRIDGE_NO_ADMIN_PASSWORD, keyp));
    }
    _passwd = _passwd.trim();
    _adminHandler = new AdminMessageHandler(this);
    _state = State.STOPPED;
}
Also used : BridgeException(com.sun.messaging.bridge.api.BridgeException) AdminMessageHandler(com.sun.messaging.bridge.admin.handlers.AdminMessageHandler) DupKeyException(com.sun.messaging.bridge.api.DupKeyException) JMSBridgeStore(com.sun.messaging.bridge.api.JMSBridgeStore) ArrayList(java.util.ArrayList) List(java.util.List) Properties(java.util.Properties)

Example 2 with JMSBridgeStore

use of com.sun.messaging.bridge.api.JMSBridgeStore in project openmq by eclipse-ee4j.

the class DBTool method doBackup.

/**
 * Backup the JDBC store to filebased backup files.
 */
private void doBackup() throws BrokerException {
    if (!Globals.getHAEnabled()) {
        throw new BrokerException(br.getKString(BrokerResources.I_HA_NOT_ENABLE, dbmgr.getBrokerID()));
    }
    // instantiate the file store.
    Properties props = System.getProperties();
    String clusterID = Globals.getClusterID();
    String backupDir = (String) props.get(Globals.IMQ + ".backupdir") + File.separator + clusterID;
    logger.logToAll(Logger.INFO, "Backup persistent store for HA cluster " + clusterID);
    final FileStore fileStore = new FileStore(backupDir, false);
    // for backup, need to clear the store before storing anything.
    fileStore.clearAll(false);
    JDBCStore jdbcStore = null;
    try {
        jdbcStore = (JDBCStore) StoreManager.getStore();
        /*
             * For data that are not broker specific, i.e. properties, change records, consumers, brokers, and sessions, we will
             * store those data on the top level directory (a.k.a cluster filestore).
             */
        // Properties table
        Properties properties = jdbcStore.getAllProperties();
        Iterator propItr = properties.entrySet().iterator();
        while (propItr.hasNext()) {
            Map.Entry entry = (Map.Entry) propItr.next();
            fileStore.updateProperty((String) entry.getKey(), entry.getValue(), false);
        }
        propItr = null;
        properties = null;
        // Configuration Change Record table
        List<ChangeRecordInfo> records = jdbcStore.getAllConfigRecords();
        for (int i = 0, len = records.size(); i < len; i++) {
            fileStore.storeConfigChangeRecord(records.get(i).getTimestamp(), records.get(i).getRecord(), false);
        }
        records = null;
        // Consumer table
        Consumer[] consumerArray = jdbcStore.getAllInterests();
        for (int i = 0; i < consumerArray.length; i++) {
            fileStore.storeInterest(consumerArray[i], false);
        }
        consumerArray = null;
        // Broker & Session table - store all HABrokerInfo as a property
        HashMap bkrMap = jdbcStore.getAllBrokerInfos(true);
        List haBrokers = new ArrayList(bkrMap.values());
        fileStore.updateProperty(STORE_PROPERTY_HABROKERS, haBrokers, true);
        /*
             * For each broker in the cluster, we will store broker specific data, destinations, messages, transactions,
             * acknowledgements in their own filestore (a.k.a broker filestore).
             */
        Iterator bkrItr = haBrokers.iterator();
        while (bkrItr.hasNext()) {
            // Backup data for each broker
            HABrokerInfo bkrInfo = (HABrokerInfo) bkrItr.next();
            String brokerID = bkrInfo.getId();
            logger.logToAll(Logger.INFO, "Backup persistent data for broker " + brokerID);
            FileStore bkrFS = null;
            JMSBridgeStore jmsbridgeStore = null;
            try {
                String instanceRootDir = backupDir + File.separator + brokerID;
                bkrFS = new FileStore(instanceRootDir, false);
                bkrFS.clearAll(false);
                // Destination table.
                Destination[] dstArray = jdbcStore.getAllDestinations(brokerID);
                for (int i = 0, len = dstArray.length; i < len; i++) {
                    DestinationUID did = dstArray[i].getDestinationUID();
                    Destination dst = bkrFS.getDestination(did);
                    if (dst == null) {
                        // Store the destination if not found
                        bkrFS.storeDestination(dstArray[i], false);
                    }
                }
                // Storing messages for each destination.
                for (int i = 0, len = dstArray.length; i < len; i++) {
                    Enumeration e = jdbcStore.messageEnumeration(dstArray[i]);
                    try {
                        for (; e.hasMoreElements(); ) {
                            DestinationUID did = dstArray[i].getDestinationUID();
                            Packet message = (Packet) e.nextElement();
                            SysMessageID mid = message.getSysMessageID();
                            // Get interest states for the message; Consumer State table
                            HashMap stateMap = jdbcStore.getInterestStates(did, mid);
                            if (stateMap == null || stateMap.isEmpty()) {
                                bkrFS.storeMessage(did, message, false);
                            } else {
                                int size = stateMap.size();
                                ConsumerUID[] iids = new ConsumerUID[size];
                                int[] states = new int[size];
                                Iterator stateItr = stateMap.entrySet().iterator();
                                int j = 0;
                                while (stateItr.hasNext()) {
                                    Map.Entry entry = (Map.Entry) stateItr.next();
                                    iids[j] = (ConsumerUID) entry.getKey();
                                    states[j] = ((Integer) entry.getValue()).intValue();
                                    j++;
                                }
                                bkrFS.storeMessage(did, message, iids, states, false);
                            }
                        }
                    } finally {
                        jdbcStore.closeEnumeration(e);
                    }
                }
                // Transaction table
                Collection txnList = jdbcStore.getTransactions(brokerID);
                Iterator txnItr = txnList.iterator();
                while (txnItr.hasNext()) {
                    TransactionUID tid = (TransactionUID) txnItr.next();
                    TransactionInfo txnInfo = jdbcStore.getTransactionInfo(tid);
                    TransactionAcknowledgement[] txnAck = jdbcStore.getTransactionAcks(tid);
                    bkrFS.storeTransaction(tid, txnInfo, false);
                    for (int i = 0, len = txnAck.length; i < len; i++) {
                        bkrFS.storeTransactionAck(tid, txnAck[i], false);
                    }
                }
                /**
                 ************************************************
                 * JMSBridge
                 *************************************************
                 */
                Properties bp = new Properties();
                bp.setProperty("instanceRootDir", instanceRootDir);
                bp.setProperty("reset", "true");
                bp.setProperty("logdomain", "imqdbmgr");
                bp.setProperty("identityName", Globals.getIdentityName());
                BridgeServiceManager.getExportedService(JMSBridgeStore.class, "JMS", bp);
                List bnames = jdbcStore.getJMSBridgesByBroker(brokerID, null);
                Collections.sort(bnames);
                String bname = null;
                String currbname = null;
                Iterator itr = bnames.iterator();
                while (itr.hasNext()) {
                    bname = (String) itr.next();
                    if (currbname == null || !currbname.equals(bname)) {
                        currbname = bname;
                        bp.setProperty("jmsbridge", bname);
                        if (jmsbridgeStore != null) {
                            jmsbridgeStore.closeJMSBridgeStore();
                            jmsbridgeStore = null;
                        }
                        logger.logToAll(logger.INFO, "Backup JMS bridge " + bname);
                        jmsbridgeStore = (JMSBridgeStore) BridgeServiceManager.getExportedService(JMSBridgeStore.class, "JMS", bp);
                        List lrs = jdbcStore.getLogRecordsByNameByBroker(bname, brokerID, null);
                        logger.logToAll(logger.INFO, "\tBackup JMS bridge " + bname + " with " + lrs.size() + " TM log records");
                        byte[] lr = null;
                        Iterator itr1 = lrs.iterator();
                        while (itr1.hasNext()) {
                            lr = (byte[]) itr1.next();
                            jmsbridgeStore.storeTMLogRecord(null, lr, currbname, true, null);
                        }
                    }
                }
            } finally {
                bkrFS.close();
                if (jmsbridgeStore != null) {
                    jmsbridgeStore.closeJMSBridgeStore();
                }
            }
        }
        logger.logToAll(Logger.INFO, "Backup persistent store complete.");
    } catch (Throwable ex) {
        ex.printStackTrace();
        throw new BrokerException(ex.getMessage());
    } finally {
        assert fileStore != null;
        try {
            fileStore.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        StoreManager.releaseStore(true);
    }
}
Also used : Destination(com.sun.messaging.jmq.jmsserver.core.Destination) HABrokerInfo(com.sun.messaging.jmq.jmsserver.persist.api.HABrokerInfo) Consumer(com.sun.messaging.jmq.jmsserver.core.Consumer) TransactionInfo(com.sun.messaging.jmq.jmsserver.persist.api.TransactionInfo) JMSBridgeStore(com.sun.messaging.bridge.api.JMSBridgeStore) Packet(com.sun.messaging.jmq.io.Packet) TransactionAcknowledgement(com.sun.messaging.jmq.jmsserver.data.TransactionAcknowledgement) ConsumerUID(com.sun.messaging.jmq.jmsserver.core.ConsumerUID) TransactionUID(com.sun.messaging.jmq.jmsserver.data.TransactionUID) FileStore(com.sun.messaging.jmq.jmsserver.persist.file.FileStore) DestinationUID(com.sun.messaging.jmq.jmsserver.core.DestinationUID) SysMessageID(com.sun.messaging.jmq.io.SysMessageID) ChangeRecordInfo(com.sun.messaging.jmq.jmsserver.persist.api.ChangeRecordInfo)

Example 3 with JMSBridgeStore

use of com.sun.messaging.bridge.api.JMSBridgeStore in project openmq by eclipse-ee4j.

the class DBTool method doRestore.

/*
     * Restore the JDBC store from filebased backup files.
     */
private void doRestore() throws BrokerException {
    if (!Globals.getHAEnabled()) {
        throw new BrokerException(br.getKString(BrokerResources.I_HA_NOT_ENABLE, dbmgr.getBrokerID()));
    }
    // instantiate the file store.
    Properties props = System.getProperties();
    String clusterID = Globals.getClusterID();
    String backupDir = (String) props.get(Globals.IMQ + ".backupdir") + File.separator + clusterID;
    logger.logToAll(Logger.INFO, "Restore persistent store for HA cluster " + clusterID + " from backup dir: " + backupDir);
    final FileStore fileStore = new FileStore(backupDir, false);
    // Brokers table.
    JDBCStore jdbcStore = null;
    try {
        // Re-create the jdbc store
        doRecreate();
        jdbcStore = (JDBCStore) StoreManager.getStore();
        /*
             * For data that are not broker specific, i.e. properties, change records, consumers, brokers, and sessions, we will
             * retrieve those data from the top level directory (a.k.a cluster filestore).
             */
        // Properties table
        List haBrokers = null;
        Properties properties = fileStore.getAllProperties();
        Iterator propItr = properties.entrySet().iterator();
        while (propItr.hasNext()) {
            Map.Entry entry = (Map.Entry) propItr.next();
            String name = (String) entry.getKey();
            if (name.equals(STORE_PROPERTY_HABROKERS)) {
                // Retrieve all HABrokerInfo from a property
                haBrokers = (List) entry.getValue();
            } else {
                jdbcStore.updateProperty(name, entry.getValue(), false);
            }
        }
        propItr = null;
        properties = null;
        if (haBrokers == null || haBrokers.isEmpty()) {
            throw new BrokerException(br.getKString(BrokerResources.X_LOAD_ALL_BROKERINFO_FAILED));
        }
        // Configuration Change Record table
        List<ChangeRecordInfo> records = fileStore.getAllConfigRecords();
        for (int i = 0, len = records.size(); i < len; i++) {
            jdbcStore.storeConfigChangeRecord(records.get(i).getTimestamp(), records.get(i).getRecord(), false);
        }
        records = null;
        // Consumer table
        Consumer[] consumerArray = fileStore.getAllInterests();
        for (int i = 0; i < consumerArray.length; i++) {
            jdbcStore.storeInterest(consumerArray[i], false);
        }
        consumerArray = null;
        // Broker & Session table.
        Iterator bkrItr = haBrokers.iterator();
        while (bkrItr.hasNext()) {
            HABrokerInfo bkrInfo = (HABrokerInfo) bkrItr.next();
            jdbcStore.addBrokerInfo(bkrInfo, false);
        }
        /*
             * For each broker in the cluster, we will retrieve broker specific data, destinations, messages, transactions,
             * acknowledgements from their own filestore (a.k.a broker filestore).
             */
        bkrItr = haBrokers.iterator();
        while (bkrItr.hasNext()) {
            // Backup data for each broker
            HABrokerInfo bkrInfo = (HABrokerInfo) bkrItr.next();
            String brokerID = bkrInfo.getId();
            long sessionID = bkrInfo.getSessionID();
            logger.logToAll(Logger.INFO, "Restore persistent data for broker " + brokerID);
            FileStore bkrFS = null;
            JMSBridgeStore jmsbridgeStore = null;
            try {
                String instanceRootDir = backupDir + File.separator + brokerID;
                bkrFS = new FileStore(instanceRootDir, false);
                // Destination table.
                Destination[] dstArray = bkrFS.getAllDestinations();
                for (int i = 0, len = dstArray.length; i < len; i++) {
                    DestinationUID did = dstArray[i].getDestinationUID();
                    Destination dst = jdbcStore.getDestination(did);
                    if (dst == null) {
                        // Store the destination if not found
                        jdbcStore.storeDestination(dstArray[i], sessionID);
                    }
                }
                // Retrieve messages for each destination.
                for (int i = 0, len = dstArray.length; i < len; i++) {
                    for (Enumeration e = bkrFS.messageEnumeration(dstArray[i]); e.hasMoreElements(); ) {
                        DestinationUID did = dstArray[i].getDestinationUID();
                        Packet message = (Packet) e.nextElement();
                        SysMessageID mid = message.getSysMessageID();
                        // Get interest states for the message; Consumer State table
                        HashMap stateMap = bkrFS.getInterestStates(did, mid);
                        if (stateMap == null || stateMap.isEmpty()) {
                            jdbcStore.storeMessage(did, message, null, null, sessionID, false);
                        } else {
                            int size = stateMap.size();
                            ConsumerUID[] iids = new ConsumerUID[size];
                            int[] states = new int[size];
                            Iterator stateItr = stateMap.entrySet().iterator();
                            int j = 0;
                            while (stateItr.hasNext()) {
                                Map.Entry entry = (Map.Entry) stateItr.next();
                                iids[j] = (ConsumerUID) entry.getKey();
                                states[j] = ((Integer) entry.getValue()).intValue();
                                j++;
                            }
                            jdbcStore.storeMessage(did, message, iids, states, sessionID, false);
                        }
                    }
                }
                // Transaction table
                Collection txnList = bkrFS.getTransactions(brokerID);
                Iterator txnItr = txnList.iterator();
                while (txnItr.hasNext()) {
                    TransactionUID tid = (TransactionUID) txnItr.next();
                    TransactionInfo txnInfo = bkrFS.getTransactionInfo(tid);
                    TransactionAcknowledgement[] txnAck = bkrFS.getTransactionAcks(tid);
                    jdbcStore.storeTransaction(tid, txnInfo, sessionID);
                    for (int i = 0, len = txnAck.length; i < len; i++) {
                        jdbcStore.storeTransactionAck(tid, txnAck[i], false);
                    }
                }
                /**
                 ************************************************
                 * JMSBridge
                 *************************************************
                 */
                Properties bp = new Properties();
                bp.setProperty("instanceRootDir", instanceRootDir);
                bp.setProperty("reset", "false");
                bp.setProperty("logdomain", "imqdbmgr");
                jmsbridgeStore = (JMSBridgeStore) BridgeServiceManager.getExportedService(JMSBridgeStore.class, "JMS", bp);
                if (jmsbridgeStore != null) {
                    List bnames = jmsbridgeStore.getJMSBridges(null);
                    String bname = null;
                    Iterator itr = bnames.iterator();
                    while (itr.hasNext()) {
                        bname = (String) itr.next();
                        jdbcStore.addJMSBridge(bname, true, null);
                    }
                    jmsbridgeStore.closeJMSBridgeStore();
                    jmsbridgeStore = null;
                    bname = null;
                    itr = bnames.iterator();
                    while (itr.hasNext()) {
                        bname = (String) itr.next();
                        bp.setProperty("jmsbridge", bname);
                        if (jmsbridgeStore != null) {
                            jmsbridgeStore.closeJMSBridgeStore();
                            jmsbridgeStore = null;
                        }
                        logger.logToAll(logger.INFO, "Restore JMS bridge " + bname);
                        jmsbridgeStore = (JMSBridgeStore) BridgeServiceManager.getExportedService(JMSBridgeStore.class, "JMS", bp);
                        List xids = jmsbridgeStore.getTMLogRecordKeysByName(bname, null);
                        logger.logToAll(logger.INFO, "\tRestore JMS bridge " + bname + " with " + xids.size() + " TM log records");
                        String xid = null;
                        byte[] lr = null;
                        Iterator itr1 = xids.iterator();
                        while (itr1.hasNext()) {
                            xid = (String) itr1.next();
                            lr = jmsbridgeStore.getTMLogRecord(xid, bname, null);
                            if (lr == null) {
                                logger.logToAll(Logger.INFO, "JMSBridge TM log record not found for " + xid);
                                continue;
                            }
                            jdbcStore.storeTMLogRecord(xid, lr, bname, true, null);
                        }
                    }
                }
            } finally {
                bkrFS.close();
                if (jmsbridgeStore != null) {
                    jmsbridgeStore.closeJMSBridgeStore();
                }
            }
        }
        logger.logToAll(Logger.INFO, "Restore persistent store complete.");
    } catch (Throwable ex) {
        ex.printStackTrace();
        throw new BrokerException(ex.getMessage());
    } finally {
        assert fileStore != null;
        try {
            fileStore.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        StoreManager.releaseStore(true);
    }
}
Also used : Destination(com.sun.messaging.jmq.jmsserver.core.Destination) HABrokerInfo(com.sun.messaging.jmq.jmsserver.persist.api.HABrokerInfo) Consumer(com.sun.messaging.jmq.jmsserver.core.Consumer) TransactionInfo(com.sun.messaging.jmq.jmsserver.persist.api.TransactionInfo) JMSBridgeStore(com.sun.messaging.bridge.api.JMSBridgeStore) Packet(com.sun.messaging.jmq.io.Packet) TransactionAcknowledgement(com.sun.messaging.jmq.jmsserver.data.TransactionAcknowledgement) ConsumerUID(com.sun.messaging.jmq.jmsserver.core.ConsumerUID) TransactionUID(com.sun.messaging.jmq.jmsserver.data.TransactionUID) FileStore(com.sun.messaging.jmq.jmsserver.persist.file.FileStore) DestinationUID(com.sun.messaging.jmq.jmsserver.core.DestinationUID) SysMessageID(com.sun.messaging.jmq.io.SysMessageID) ChangeRecordInfo(com.sun.messaging.jmq.jmsserver.persist.api.ChangeRecordInfo)

Aggregations

JMSBridgeStore (com.sun.messaging.bridge.api.JMSBridgeStore)3 Packet (com.sun.messaging.jmq.io.Packet)2 SysMessageID (com.sun.messaging.jmq.io.SysMessageID)2 Consumer (com.sun.messaging.jmq.jmsserver.core.Consumer)2 ConsumerUID (com.sun.messaging.jmq.jmsserver.core.ConsumerUID)2 Destination (com.sun.messaging.jmq.jmsserver.core.Destination)2 DestinationUID (com.sun.messaging.jmq.jmsserver.core.DestinationUID)2 TransactionAcknowledgement (com.sun.messaging.jmq.jmsserver.data.TransactionAcknowledgement)2 TransactionUID (com.sun.messaging.jmq.jmsserver.data.TransactionUID)2 ChangeRecordInfo (com.sun.messaging.jmq.jmsserver.persist.api.ChangeRecordInfo)2 HABrokerInfo (com.sun.messaging.jmq.jmsserver.persist.api.HABrokerInfo)2 TransactionInfo (com.sun.messaging.jmq.jmsserver.persist.api.TransactionInfo)2 FileStore (com.sun.messaging.jmq.jmsserver.persist.file.FileStore)2 AdminMessageHandler (com.sun.messaging.bridge.admin.handlers.AdminMessageHandler)1 BridgeException (com.sun.messaging.bridge.api.BridgeException)1 DupKeyException (com.sun.messaging.bridge.api.DupKeyException)1 ArrayList (java.util.ArrayList)1 List (java.util.List)1 Properties (java.util.Properties)1