2014-03-06 5 views
1

Tibco EMS JMS 서버를 탐색하고 모든 대기열을 표시하는 Java 클래스를 작성 중입니다. 문제없이 연결하고 특정 대기열을 탐색 할 수 있지만 가능한 경우 대기열 깊이가있는 모든 대기열의 목록을 반환하는 방법을 찾고 있습니다. 사용하려는 특정 EMS API가있는 경우 표준 JMS를 사용하고 있지 않습니다.Tibco EMS의 모든 JMS 대기열 나열

역방향 JNDI 조회를 수행하기 위해 다음 코드를 시도했지만 실패했습니다. 이 오류가 발생합니다

NamingEnumeration<?> queues = context.list(""); 
List<String> availableQueuesNames = new ArrayList<String>(); 
while (queues.hasMoreElements()) { 
    NameClassPair element = (NameClassPair) queues.nextElement(); 
    availableQueuesNames.add(element.getName()); 
} 

:

javax.naming.OperationNotSupportedException: Not supported 
    at com.tibco.tibjms.naming.TibjmsContext.list(TibjmsContext.java:1018) 
    at com.tibco.tibjms.naming.TibjmsContext.list(TibjmsContext.java:484) 
    at javax.naming.InitialContext.list(Unknown Source) 

내가 뒷조사를했고, 팁코 EMS는이 같은 JNDI를 조사 지원하지 않는 것 같습니다. 이것을 이루기위한 다른 방법이 있습니까?

답변

2

했다 당신은 모든 EMS 큐를 나열해야하는 이유

Map<String, TibjmsAdmin> map = new HashMap<String, TibjmsAdmin>(); 
addAdmin(txtServer.getText(), txtUser.getText(), txtPassword.getText(), map); 
_admin = new TibjmsAdmin[map.size()]; 
map.values().toArray(_admin); 

QueueInfo[] info = _admin[0].getQueues(null); 
for (int i = 0; i < info.length; i++) { 
    String queueName = info[i].getName(); 
    if (!queueName.startsWith("$") && !queueName.startsWith(">")) { 
     queues.add(queueName + ", 0"); 
    } 
} 
0

Tibco 세부 정보는 확실하지 않지만 list 대신 listBindings을 사용할 수 있습니까?

은이 같은 일반적인 방법으로 같은 일을 한

: 내가 할 수있는 가이드로 팁코와 함께 제공되는 tibjmsServerAdministrator.java 같은 클래스 (그리고 addAdmin() 메소드)를 사용하여

List<Queue> out = new ArrayList<>(); 
scanJndiForQueues(out, ""); 

... 

private void scanJndiForQueues(List<Queue> out, String path) throws NamingException { 
    InitialContext context = new InitialContext(); 
    Object resource = context.lookup(path); 
    if (isSubContext(resource)) { 
     NamingEnumeration<Binding> list = context.listBindings(path); 
     while (list.hasMoreElements()) { 
      Binding binding = list.nextElement(); 
      scanJndiForQueues(out, path + "/" + binding.getName()); 
     } 
    } else if (resource instanceof Queue) { 
     out.add((Queue) resource); 
    } // else ignore Topics 
} 

private boolean isSubContext(Object object) { 
    return javax.naming.Context.class.isAssignableFrom(object.getClass()); 
} 
+0

그건 좋은 생각이고 listBindings()도 같이 사용했지만 불행히도 "javax.naming.OperationNotSupportedException : Not supported"같은 문제가 발생합니다. – Matt

+0

좋아요 ... 티브 코를 사용하지 않는 또 다른 이유는 무엇입니까? 이 방법은 선택 사항으로 표시되지 않습니다. –

-1

이 몰라,하지만 당신은 GEMS 도구를 사용하여이 (그리고 많은 다른 것들)을 달성 할 수있는 모든 대기열을 나열하는 코드를 작성합니다.

tibcommunity (계정이 필요)에서 검색하거나 here에서 직접 최신 버전을 다운로드 할 수 있습니다.

+0

네, GEMS를 사용할 수 있습니다. 사용자는 Java 내부에서 대기열 목록에 액세스 할 수 있기를 원합니다. GEMS는 사용자가 다른 Tibco 구조에 대한 정보를 볼 수있는 DOS 스타일 응용 프로그램을 제공합니다. 필자가 아는 한, GEMS는 화면에 나열된 문자열을 잘라내어 붙여 넣을 수있는 기능이 없습니다. Java 프로그램을 작성하는 데 도움이되지 않습니다. –