@GET @Path("{instanceName}/messages/{messageId}") public Response getMessageOnInstance(@PathParam("clusterId") String clusterId, @PathParam("instanceName") String instanceName, @PathParam("messageId") String messageId) throws IOException { HelixDataAccessor accessor = getDataAccssor(clusterId); Message message = accessor.getProperty(accessor.keyBuilder().message(instanceName, messageId)); if (message != null) { return JSONRepresentation(message.getRecord()); } return notFound(); }
for (String messageId : messageIds) { if (changeType.equals(HelixConstants.ChangeType.MESSAGE)) { keys.add(keyBuilder.message(instanceName, messageId)); } else if (changeType.equals(HelixConstants.ChangeType.MESSAGES_CONTROLLER)) { keys.add(keyBuilder.controllerMessage(messageId));
for (String messageId : messageIds) { if (changeType.equals(HelixConstants.ChangeType.MESSAGE)) { keys.add(keyBuilder.message(instanceName, messageId)); } else if (changeType.equals(HelixConstants.ChangeType.MESSAGES_CONTROLLER)) { keys.add(keyBuilder.controllerMessage(messageId));
keys.add(keyBuilder.message(message.getTgtName(), message.getId()));
continue; PropertyKey msgKey = keyBuilder.message(instance, msg.getId()); boolean success = accessor.getBaseDataAccessor() .create(msgKey.getPath(), msg.getRecord(), AccessOption.PERSISTENT);
msg.setSrcName("127.101.1.23_2234"); msg.setCorrelationId(UUID.randomUUID().toString()); accessor.setProperty(keyBuilder.message("someInstance", msg.getId()), msg); messageIds.add(msg.getId());
continue; PropertyKey msgKey = keyBuilder.message(instance, msg.getId()); boolean success = accessor.getBaseDataAccessor() .create(msgKey.getPath(), msg.getRecord(), AccessOption.PERSISTENT);
private void sendReply(HelixDataAccessor replyDataAccessor, Message message, HelixTaskResult taskResult) { if (message.getCorrelationId() != null && !message.getMsgType() .equals(MessageType.TASK_REPLY.name())) { logger.info("Sending reply for message " + message.getCorrelationId()); _statusUpdateUtil.logInfo(message, HelixTask.class, "Sending reply", _manager); taskResult.getTaskResultMap().put("SUCCESS", "" + taskResult.isSuccess()); taskResult.getTaskResultMap().put("INTERRUPTED", "" + taskResult.isInterrupted()); if (!taskResult.isSuccess()) { taskResult.getTaskResultMap().put("ERRORINFO", taskResult.getMessage()); } Message replyMessage = Message .createReplyMessage(message, _manager.getInstanceName(), taskResult.getTaskResultMap()); replyMessage.setSrcInstanceType(_manager.getInstanceType()); Builder keyBuilder = replyDataAccessor.keyBuilder(); if (message.getSrcInstanceType() == InstanceType.PARTICIPANT) { replyDataAccessor .setProperty(keyBuilder.message(message.getMsgSrc(), replyMessage.getMsgId()), replyMessage); } else if (message.getSrcInstanceType() == InstanceType.CONTROLLER) { replyDataAccessor .setProperty(keyBuilder.controllerMessage(replyMessage.getMsgId()), replyMessage); } _statusUpdateUtil.logInfo(message, HelixTask.class, String .format("1 msg replied to %s in cluster %s.", replyMessage.getTgtName(), message.getSrcClusterName() == null ? _manager.getClusterName() : message.getSrcClusterName()), _manager); } }
@GET @Path("{instanceName}/messages") public Response getMessagesOnInstance(@PathParam("clusterId") String clusterId, @PathParam("instanceName") String instanceName) throws IOException { HelixDataAccessor accessor = getDataAccssor(clusterId); ObjectNode root = JsonNodeFactory.instance.objectNode(); root.put(Properties.id.name(), instanceName); ArrayNode newMessages = root.putArray(InstanceProperties.new_messages.name()); ArrayNode readMessages = root.putArray(InstanceProperties.read_messages.name()); List<String> messages = accessor.getChildNames(accessor.keyBuilder().messages(instanceName)); if (messages == null || messages.size() == 0) { return notFound(); } for (String messageName : messages) { Message message = accessor.getProperty(accessor.keyBuilder().message(instanceName, messageName)); if (message.getMsgState() == Message.MessageState.NEW) { newMessages.add(messageName); } if (message.getMsgState() == Message.MessageState.READ) { readMessages.add(messageName); } } root.put(InstanceProperties.total_message_count.name(), newMessages.size() + readMessages.size()); root.put(InstanceProperties.read_message_count.name(), readMessages.size()); return JSONRepresentation(root); }
keys.add(keyBuilder.message(message.getTgtName(), message.getId()));
private void sendReply(HelixDataAccessor accessor, Message message, HelixTaskResult taskResult) { if (_message.getCorrelationId() != null && !message.getMsgType().equals(MessageType.TASK_REPLY.name())) { logger.info("Sending reply for message " + message.getCorrelationId()); _statusUpdateUtil.logInfo(message, HelixTask.class, "Sending reply", _manager); taskResult.getTaskResultMap().put("SUCCESS", "" + taskResult.isSuccess()); taskResult.getTaskResultMap().put("INTERRUPTED", "" + taskResult.isInterrupted()); if (!taskResult.isSuccess()) { taskResult.getTaskResultMap().put("ERRORINFO", taskResult.getMessage()); } Message replyMessage = Message.createReplyMessage(_message, _manager.getInstanceName(), taskResult.getTaskResultMap()); replyMessage.setSrcInstanceType(_manager.getInstanceType()); if (message.getSrcInstanceType() == InstanceType.PARTICIPANT) { Builder keyBuilder = accessor.keyBuilder(); accessor.setProperty(keyBuilder.message(message.getMsgSrc(), replyMessage.getMsgId()), replyMessage); } else if (message.getSrcInstanceType() == InstanceType.CONTROLLER) { Builder keyBuilder = accessor.keyBuilder(); accessor.setProperty(keyBuilder.controllerMessage(replyMessage.getMsgId()), replyMessage); } _statusUpdateUtil.logInfo(message, HelixTask.class, "1 msg replied to " + replyMessage.getTgtName(), _manager); } }
@Test public void testGroupCommitAddCurrentStateBack() throws InterruptedException { HelixDataAccessor accessor = _manager.getHelixDataAccessor(); Message initMessage = generateMessage("OFFLINE", "ONLINE"); accessor.setProperty( accessor.keyBuilder().message(_participant.getInstanceName(), initMessage.getMsgId()), initMessage); Assert.assertTrue(waitForMessageProcessed(accessor, initMessage.getMsgId())); Message toOffline = generateMessage("ONLINE", "OFFLINE"); accessor.setProperty( accessor.keyBuilder().message(_participant.getInstanceName(), toOffline.getMsgId()), toOffline); Assert.assertTrue(waitForMessageProcessed(accessor, toOffline.getMsgId())); // Consequential 10 messages for (int i = 0; i < 10; i++) { Message dropped = generateMessage("OFFLINE", "DROPPED"); accessor.setProperty( accessor.keyBuilder().message(_participant.getInstanceName(), dropped.getMsgId()), dropped); Assert.assertTrue(waitForMessageProcessed(accessor, dropped.getMsgId())); Assert.assertFalse(accessor.getBaseDataAccessor().exists(accessor.keyBuilder() .currentState(_participant.getInstanceName(), _participant.getSessionId(), WorkflowGenerator.DEFAULT_TGT_DB).getPath(), 0)); } }
private void sendNopMessage() { if (_manager.isConnected()) { try { Message nopMsg = new Message(MessageType.NO_OP, UUID.randomUUID().toString()); nopMsg.setSrcName(_manager.getInstanceName()); HelixDataAccessor accessor = _manager.getHelixDataAccessor(); Builder keyBuilder = accessor.keyBuilder(); if (_manager.getInstanceType() == InstanceType.CONTROLLER || _manager.getInstanceType() == InstanceType.CONTROLLER_PARTICIPANT) { nopMsg.setTgtName(InstanceType.CONTROLLER.name()); accessor.setProperty(keyBuilder.controllerMessage(nopMsg.getId()), nopMsg); } if (_manager.getInstanceType() == InstanceType.PARTICIPANT || _manager.getInstanceType() == InstanceType.CONTROLLER_PARTICIPANT) { nopMsg.setTgtName(_manager.getInstanceName()); accessor.setProperty(keyBuilder.message(nopMsg.getTgtName(), nopMsg.getId()), nopMsg); } logger.info("Send NO_OP message to " + nopMsg.getTgtName() + ", msgId: " + nopMsg.getId()); } catch (Exception e) { logger.error(e.toString()); } } }
private void sendNopMessage() { if (_manager.isConnected()) { try { Message nopMsg = new Message(MessageType.NO_OP, UUID.randomUUID().toString()); nopMsg.setSrcName(_manager.getInstanceName()); HelixDataAccessor accessor = _manager.getHelixDataAccessor(); Builder keyBuilder = accessor.keyBuilder(); if (_manager.getInstanceType() == InstanceType.CONTROLLER || _manager.getInstanceType() == InstanceType.CONTROLLER_PARTICIPANT) { nopMsg.setTgtName(InstanceType.CONTROLLER.name()); accessor.setProperty(keyBuilder.controllerMessage(nopMsg.getId()), nopMsg); } if (_manager.getInstanceType() == InstanceType.PARTICIPANT || _manager.getInstanceType() == InstanceType.CONTROLLER_PARTICIPANT) { nopMsg.setTgtName(_manager.getInstanceName()); accessor.setProperty(keyBuilder.message(nopMsg.getTgtName(), nopMsg.getId()), nopMsg); } logger.info("Send NO_OP message to " + nopMsg.getTgtName() + ", msgId: " + nopMsg.getId()); } catch (Exception e) { logger.error(e.toString()); } } }
private void sendNopMessageInternal() { try { Message nopMsg = new Message(MessageType.NO_OP, UUID.randomUUID().toString()); nopMsg.setSrcName(_manager.getInstanceName()); HelixDataAccessor accessor = _manager.getHelixDataAccessor(); Builder keyBuilder = accessor.keyBuilder(); if (_manager.getInstanceType() == InstanceType.CONTROLLER || _manager.getInstanceType() == InstanceType.CONTROLLER_PARTICIPANT) { nopMsg.setTgtName(InstanceType.CONTROLLER.name()); accessor.setProperty(keyBuilder.controllerMessage(nopMsg.getId()), nopMsg); } if (_manager.getInstanceType() == InstanceType.PARTICIPANT || _manager.getInstanceType() == InstanceType.CONTROLLER_PARTICIPANT) { nopMsg.setTgtName(_manager.getInstanceName()); accessor.setProperty(keyBuilder.message(nopMsg.getTgtName(), nopMsg.getId()), nopMsg); } } catch (Exception e) { _logger.error(e.toString()); } }
/** * trigger dummy message handler and verify it's invoked * @param manager * @param handledMsgSet * @throws Exception */ private static void checkDummyMsgHandler(HelixManager manager, final Set<String> handledMsgSet) throws Exception { final Message aMsg = newMsg(); HelixDataAccessor accessor = manager.getHelixDataAccessor(); PropertyKey.Builder keyBuilder = accessor.keyBuilder(); accessor.setProperty(keyBuilder.message(manager.getInstanceName(), aMsg.getId()), aMsg); boolean result = TestHelper.verify(new TestHelper.Verifier() { @Override public boolean verify() throws Exception { return handledMsgSet.contains(aMsg.getId()); } }, 5 * 1000); Assert.assertTrue(result); }
private void sendNopMessageInternal() { try { Message nopMsg = new Message(MessageType.NO_OP, UUID.randomUUID().toString()); nopMsg.setSrcName(_manager.getInstanceName()); HelixDataAccessor accessor = _manager.getHelixDataAccessor(); Builder keyBuilder = accessor.keyBuilder(); if (_manager.getInstanceType() == InstanceType.CONTROLLER || _manager.getInstanceType() == InstanceType.CONTROLLER_PARTICIPANT) { nopMsg.setTgtName(InstanceType.CONTROLLER.name()); accessor.setProperty(keyBuilder.controllerMessage(nopMsg.getId()), nopMsg); } if (_manager.getInstanceType() == InstanceType.PARTICIPANT || _manager.getInstanceType() == InstanceType.CONTROLLER_PARTICIPANT) { nopMsg.setTgtName(_manager.getInstanceName()); accessor.setProperty(keyBuilder.message(nopMsg.getTgtName(), nopMsg.getId()), nopMsg); } } catch (Exception e) { _logger.error(e.toString()); } }
private boolean waitForMessageProcessed(HelixDataAccessor accessor, String messageId) throws InterruptedException { String path = accessor.keyBuilder().message(_participant.getInstanceName(), messageId).getPath(); long startTime = System.currentTimeMillis(); while (accessor.getBaseDataAccessor().exists(path, 0)) { if (System.currentTimeMillis() - startTime > DEFAULT_TIMEOUT) { return false; } Thread.sleep(200); } return true; } }
/** * Get the {@link PropertyKey} for this message * @param keyBuilder PropertyKey Builder * @param instanceName target instance * @return message PropertyKey */ public PropertyKey getKey(Builder keyBuilder, String instanceName) { if (isControlerMsg()) { return keyBuilder.controllerMessage(getId()); } else { return keyBuilder.message(instanceName, getId()); } }
/** * Get the {@link PropertyKey} for this message * @param keyBuilder PropertyKey Builder * @param instanceName target instance * @return message PropertyKey */ public PropertyKey getKey(Builder keyBuilder, String instanceName) { if (isControlerMsg()) { return keyBuilder.controllerMessage(getId()); } else { return keyBuilder.message(instanceName, getId()); } }