Je veux découvrir toutes les destinations de Solace (files d'attente et sujets) p>
J'ai essayé d'utiliser MBeanServerConnection et interrogez après des noms (mais je n'ai pas trouvé de manière appropriée d'utiliser ceci) ou jndi Recherches Destination Destint = (Destination) Contexte.Lookup (Name), mais je n'ai pas les noms de les files d'attente / sujets. J'utilise Solace - JMS Bibliothèque. p>
Je cherche smth comme ceci: (mais pour le réconfort, pas Activeemq) Obtenez toute la file d'attente d'Activemq P>
3 Réponses :
Vous devrez utiliser SEMP sur l'interface de gestion pour cela.
échantillons de commandes: p> Notez que j'utilise Documentation sur SEMP peut être trouvé ICI . P> Cependant, la question plus grande, c'est pourquoi avez-vous besoin de découvrir toutes les destinations? p> L'une des caractéristiques du courtier de messages consiste à découpler les éditeurs et les consommateurs. < / p> Si vous avez besoin de savoir si votre message persistant est publié sur un sujet sans consommateurs, vous pouvez utiliser le paramètre Rejeter-Msg-Msg-Sender-ON-No-Abonnement dans la publication. Profile client de l'application.
Cela signifie que l'éditeur obtiendra un accusé de réception négatif dans le cas où il essaie de publier un message sur un sujet qui n'a aucun abonné correspondant. P> Vous pouvez vous reporter à "Manipulation de messages garantis sans correspondance" à < un href = "https://docs.solace.com/configuring-and-maning/configuring-client-profiles.htm" rel = "Nofollow Noreferrer"> https://docs.solace.com/configuring-and-Maning /Configuring-client-profiles.htm pour plus de détails. P> p> CURL < / Code> Pour la simplicité, mais toute application peut effectuer des messages HTTP pour exécuter ces commandes.
Si vous utilisez Java, vous pouvez vous reporter au
SEMPHTTPSetReQuest CODE> Sample figurant dans les échantillons de l'API de Solace. P>
Voici un code source qui pourrait aider. Avec l'appareil configuré correctement, SEMP est également disponible sur JMS sur thème "# SEMP / (routeur) / spectacle".
/** * Return the SolTopicInfo for this topic (or all topics if 'topic' is null). * * @param session * @param endpointName * @return */ public static SolTopicInfo[] getTopicInfo(JCSMPSession session, String endpointName, String vpn, String sempVersion) { XMLMessageConsumer cons = null; XMLMessageProducer prod = null; Map<String, SolTopicInfo> tiMap = new HashMap<String, SolTopicInfo>(); try { // Create a producer and a consumer, and connect to appliance. prod = session.getMessageProducer(new PubCallback()); cons = session.getMessageConsumer(new SubCallback()); cons.start(); if (vpn == null) vpn = (String) session.getProperty(JCSMPProperties.VPN_NAME); if (sempVersion == null) sempVersion = getSempVersion(session); // Extract the router name. final String SEMP_SHOW_TE_TOPICS = "<rpc semp-version=\"" + sempVersion + "\"><show><topic-endpoint><name>" + endpointName + "</name><vpn-name>"+ vpn + "</vpn-name></topic-endpoint></show></rpc>"; RpcReply teTopics = sendRequest(session, SEMP_SHOW_TE_TOPICS); for (TopicEndpoint2 te : teTopics.getRpc().getShow().getTopicEndpoint().getTopicEndpoints() .getTopicEndpointArray()) { SolTopicInfo ti = new SolTopicInfo(); ti.setBindCount(te.getInfo().getBindCount()); //qi.setDescription(qt.getInfo().getNetworkTopic()); ti.setEndpoint(te.getName()); ti.setMessageVPN(te.getInfo().getMessageVpn()); ti.setTopic(te.getInfo().getDestination()); ti.setDurable(te.getInfo().getDurable()); ti.setInSelPres(te.getInfo().getIngressSelectorPresent()); ti.setHwmMB(formatter.format(te.getInfo().getHighWaterMarkInMb())); ti.setSpoolUsageMB(formatter.format(te.getInfo().getCurrentSpoolUsageInMb())); ti.setMessagesSpooled(te.getInfo().getNumMessagesSpooled().longValue()); String status = te.getInfo().getIngressConfigStatus().substring(0, 1).toUpperCase(); status += " " + te.getInfo().getEgressConfigStatus().substring(0, 1).toUpperCase(); status += " " + te.getInfo().getIngressSelectorPresent().substring(0, 1).toUpperCase(); status += " " + te.getInfo().getType().substring(0, 1).toUpperCase(); ti.setStatus(status); tiMap.put(ti.getEndpoint(), ti); } } catch (JCSMPException e) { throw new RuntimeException(e.getMessage(), e); } finally { if (cons != null) cons.close(); if (prod != null) prod.close(); } return tiMap.values().toArray(new SolTopicInfo[0]); } /** * Return the SolQueueInfo for this queue (or all queues if 'queue' is null). * * @param session * @param queue * @param vpn (if null, use the session's vpn name) * @param sempVersion, if null use 'soltr/7_1_1' * @return */ public static SolQueueInfo[] getQueueInfo(JCSMPSession session, String queue, String vpn, String sempVersion) { XMLMessageConsumer cons = null; XMLMessageProducer prod = null; Map<String, SolQueueInfo> qiMap = new HashMap<String, SolQueueInfo>(); try { // Create a producer and a consumer, and connect to appliance. prod = session.getMessageProducer(new PubCallback()); cons = session.getMessageConsumer(new SubCallback()); cons.start(); if (vpn == null) vpn = (String) session.getProperty(JCSMPProperties.VPN_NAME); if (sempVersion == null) sempVersion = getSempVersion(session); // Extract the router name. final String SEMP_SHOW_QUEUE_SUBS = "<rpc semp-version=\"" + sempVersion + "\"><show><queue><name>" + queue + "</name><vpn-name>"+ vpn + "</vpn-name><subscriptions/><count/><num-elements>200</num-elements></queue></show></rpc>"; RpcReply queueSubs = sendRequest(session, SEMP_SHOW_QUEUE_SUBS); for (QueueType qt : queueSubs.getRpc().getShow().getQueue().getQueues().getQueueArray()) { SolQueueInfo qi = new SolQueueInfo(); qi.setBindCount(qt.getInfo().getBindCount()); //qi.setDescription(qt.getInfo().getNetworkTopic()); qi.setName(qt.getName()); qi.setMessageVPN(qt.getInfo().getMessageVpn()); qi.setDurable(qt.getInfo().getDurable()); qi.setEgSelPres(qt.getInfo().getEgressSelectorPresent()); qi.setHwmMB(formatter.format(qt.getInfo().getHighWaterMarkInMb())); qi.setMessagesSpooled(qt.getInfo().getNumMessagesSpooled().longValue()); qi.setSpoolUsageMB(formatter.format(qt.getInfo().getCurrentSpoolUsageInMb())); String status = qt.getInfo().getIngressConfigStatus().substring(0, 1).toUpperCase(); status += " " + qt.getInfo().getEgressConfigStatus().substring(0, 1).toUpperCase(); status += " " + qt.getInfo().getAccessType().substring(0, 1).toUpperCase(); status += " " + qt.getInfo().getEgressSelectorPresent().substring(0, 1).toUpperCase(); status += " " + qt.getInfo().getType().substring(0, 1).toUpperCase(); status += qt.getInfo().getDurable() ? " D" : " N"; qi.setStatus(status); for (Subscription sub : qt.getSubscriptions().getSubscriptionArray()) { qi.addSubscription(sub.getTopic()); } qiMap.put(qi.getName(), qi); } } catch (JCSMPException e) { throw new RuntimeException(e.getMessage(), e); } finally { if (cons != null) cons.close(); if (prod != null) prod.close(); } return qiMap.values().toArray(new SolQueueInfo[0]); } private static String getSempVersion(JCSMPSession session) { String retval = "soltr/7_1_1"; try { String peerVersion = (String)session.getCapability(CapabilityType.PEER_SOFTWARE_VERSION); if (peerVersion != null) { retval = "soltr/"; String[] version = peerVersion.split("\\."); retval += version[0]; retval += "_" + version[1]; if (!version[2].equals("0")) retval += "_" + version[2]; } } catch (Throwable e) { System.err.println(e); } return retval; } private static RpcReply sendRequest(JCSMPSession session, final String requestStr) { try { // Set up the requestor and request message. String routerName = (String) session .getCapability(CapabilityType.PEER_ROUTER_NAME); final String SEMP_TOPIC_STRING = String.format("#SEMP/%s/SHOW", routerName); final Topic SEMP_TOPIC = JCSMPFactory.onlyInstance().createTopic( SEMP_TOPIC_STRING); Requestor requestor = session.createRequestor(); BytesXMLMessage requestMsg = JCSMPFactory.onlyInstance().createMessage( BytesXMLMessage.class); requestMsg.writeAttachment(requestStr.getBytes()); BytesXMLMessage replyMsg = requestor .request(requestMsg, 5000, SEMP_TOPIC); String replyStr = new String(); if (replyMsg.getAttachmentContentLength() > 0) { byte[] bytes = new byte[replyMsg.getAttachmentContentLength()]; replyMsg.readAttachmentBytes(bytes); replyStr = new String(bytes, "US-ASCII"); } RpcReplyDocument doc = RpcReplyDocument.Factory.parse(replyStr); RpcReply reply = doc.getRpcReply(); if (reply.isSetPermissionError()) { throw new RuntimeException( "Permission Error: Make sure SEMP over message bus SHOW commands are enabled for this VPN"); } if( reply.isSetParseError() ) { throw new RuntimeException( "SEMP Parse Error: " + reply.getParseError() ); } if( reply.isSetLimitError() ) { throw new RuntimeException( "SEMP Limit Error: " + reply.getLimitError() ); } if( reply.isSetExecuteResult() && reply.getExecuteResult().isSetReason() ) { // axelp: encountered this error on invalid 'queue' name throw new RuntimeException( "SEMP Execution Error: " + reply.getExecuteResult().getReason() ); } return reply; } catch (JCSMPException e) { throw new RuntimeException(e.getMessage(), e); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e.getMessage(), e); } catch (XmlException e) { throw new RuntimeException(e.getMessage(), e); } }
Vous pouvez obtenir des files d'attente et de sujets spécifiques de messagerie VPN à l'aide de la commande SEMPV2 suivante.
curl -s -X GET -u semp_user:semp_pass management_host:management_port/SEMP/v2/monitor/msgVpns/{vpn-name}/queues?select="queueName" curl -s -X GET -u semp_user:semp_pass management_host:management_port/SEMP/v2/monitor/msgVpns/{vpn-name}/topicEndpoints?select="topicEndpointName"