通过JMX删除队列Websphere 8.5 SIB中的所有消息

时间:2014-01-18 14:46:50

标签: queue websphere jmx messages

我想删除在Websphere 8.5 SIB中配置的队列中的所有消息。下面是我尝试过的两种方法,但它们似乎都没有工作,每种方法都会抛出不同的异常。有人可以告诉你实现这个目标的正确方法。

方法1

MBeanServerConnection connection = getServerConnection();
connection.invoke(new ObjectName("WebSphere:*,type=SIBQueuePoint,name=jms.queue.MY_QUEUE"), "deleteAllQueuedMessages", null, null);

此方法抛出以下异常。

  

javax.management.InstanceNotFoundException:WebSphere:type = SIBQueuePoint,name = jms.queue.MY_QUEUE

方法2

MBeanServerConnection connection = getServerConnection();
ObjectName objQueue = new ObjectName(WAS85_RESOURCE_URL + ",type=SIBQueuePoint");
Set<ObjectName> objNames = connection.queryNames(objQueue, null);
for(ObjectName objName: objNames) {
    String qName = connection.getAttribute(objName,"identifier").toString();
    if(qName.equals("jms.queue.MY_QUEUE")) {
        connection.invoke(objName, "deleteAllQueuedMessages", null, null);
    }
}

此方法抛出以下异常。

  

javax.management.ReflectionException:找不到目标方法:com.ibm.ws.sib.admin.impl.JsQueuePoint.deleteAllQueuedMessages

2 个答案:

答案 0 :(得分:0)

找出问题。

第二种方法有效。问题在于我调用了deleteAllQueuedMessages消息。该方法采用一个布尔参数,指示应将消息移动到异常目标。我没有传递这个论点!!!

我更正了下面的实现,现在可以正常使用。

connection.invoke(objName, "deleteAllQueuedMessages", new Object[]{false}, new String[]{"java.lang.Boolean"});

答案 1 :(得分:0)

删除所有消息的更好方法是:

String queryString = "WebSphere:*,type=JMSAdministration";
        ObjectName queryServer = new ObjectName(queryString);
        String serverStr = "";

        Set pet = aClient.queryNames(queryServer, null);

        Iterator itsServer = pet.iterator();

        if (itsServer.hasNext())
            serverStr = itsServer.next().toString();

        ObjectName obj = new ObjectName(serverStr);

        Object param[] = { "jms/messageQueue","jms/messageCF" };
        String signature[] = { "java.lang.String","java.lang.String" };

        aClient.invoke(obj, "clear", param, signature);

使用MBean JMS管理更好,因为您可以完全设置Query。