我想删除在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
答案 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。