2

構成: 2 つのノード #1 と #2 を持つ WLS クラスター (10.3)。#1 で現在利用可能な 1 つの移行可能な JMSServer。1 つの移行可能な JMSQueue。

問題: 一部の EJB は、JSMQueue に timeToDeliever が 60 秒に設定されたメッセージを取り込みます。(60 秒で表示されなくなります。) 別の EJB が JMX を使用して、表示される前にその (表示されない) メッセージを取得しようとしています。この別の EJB が #2 で実行される場合、JMSServer が見つからないため、メッセージがポップされません。このコードは、クラスタ化されていない環境で正常に動作します。



    public class PurgeWLSQueue {

        private static final String WLS_USERNAME = "weblogic";
        private static final String WLS_PASSWORD = "weblogic";
        private static final String WLS_HOST = "localhost";
        private static final int WLS_PORT = 7001;
        private static final String JMS_SERVER = "wlsbJMSServer";
        private static final String JMS_DESTINATION = "test.q";

        private static JMXConnector getMBeanServerConnector(String jndiName) throws Exception {
            Hashtable h = new Hashtable();
            JMXServiceURL serviceURL = new JMXServiceURL("t3", WLS_HOST, WLS_PORT, jndiName);
            h.put(Context.SECURITY_PRINCIPAL, WLS_USERNAME);
            h.put(Context.SECURITY_CREDENTIALS, WLS_PASSWORD);
            h.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES, "weblogic.management.remote");
            JMXConnector connector = JMXConnectorFactory.connect(serviceURL, h);
            return connector;
        }

       public static void main(String[] args) {
            try {
                JMXConnector connector = 
                  getMBeanServerConnector("/jndi/"+RuntimeServiceMBean.MBEANSERVER_JNDI_NAME);
                MBeanServerConnection mbeanServerConnection = 
                  connector.getMBeanServerConnection();

                ObjectName service = new ObjectName("com.bea:Name=RuntimeService,Type=weblogic.management.mbeanservers.runtime.RuntimeServiceMBean");
                ObjectName serverRuntime = (ObjectName) mbeanServerConnection.getAttribute(service, "ServerRuntime");
                ObjectName jmsRuntime = (ObjectName) mbeanServerConnection.getAttribute(serverRuntime, "JMSRuntime");
                ObjectName[] jmsServers = (ObjectName[]) mbeanServerConnection.getAttribute(jmsRuntime, "JMSServers");
                for (ObjectName jmsServer: jmsServers) {
                    if (JMS_SERVER.equals(jmsServer.getKeyProperty("Name"))) {
                        ObjectName[] destinations = (ObjectName[]) mbeanServerConnection.getAttribute(jmsServer, "Destinations");
                        for (ObjectName destination: destinations) {
                            if (destination.getKeyProperty("Name").endsWith("!"+JMS_DESTINATION)) {
                                Object o = mbeanServerConnection.invoke(
                                    destination,
                                    "deleteMessages",
                                    new Object[] {""},        // selector expression
                                    new String[] {"java.lang.String"});
                                System.out.println("Result: "+o);
                                break;
                            }
                        }
                        break;
                    }
                }
                connector.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

(このコードは、このフォーラムの Miklos Csuka から借用したものです)

JMSServer を指定せずにそのメッセージを取得する他の方法はありますか。つまり、JMSQueue を直接アドレス指定できますか? 他のアイデアはありますか?

4

1 に答える 1

0

あ、解決した!
同じ問題に直面している他のユーザーについては、代わりにドメイン ランタイム サービスを使用してください。

ObjectName service = new ObjectName("com.bea:Name=DomainRuntimeService,Type=weblogic.management.mbeanservers.domainruntime.DomainRuntimeServiceMBean");

また、必ず WLS クラスタの管理ポートにアクセスしてください。

于 2011-10-07T07:53:35.567 に答える