Search in sources :

Example 1 with RuleEngineDeviceRpcRequest

use of org.thingsboard.rule.engine.api.RuleEngineDeviceRpcRequest in project thingsboard by thingsboard.

the class TbSendRPCRequestNode method onMsg.

@Override
public void onMsg(TbContext ctx, TbMsg msg) {
    JsonObject json = jsonParser.parse(msg.getData()).getAsJsonObject();
    String tmp;
    if (msg.getOriginator().getEntityType() != EntityType.DEVICE) {
        ctx.tellFailure(msg, new RuntimeException("Message originator is not a device entity!"));
    } else if (!json.has("method")) {
        ctx.tellFailure(msg, new RuntimeException("Method is not present in the message!"));
    } else if (!json.has("params")) {
        ctx.tellFailure(msg, new RuntimeException("Params are not present in the message!"));
    } else {
        int requestId = json.has("requestId") ? json.get("requestId").getAsInt() : random.nextInt();
        boolean restApiCall = msg.getType().equals(DataConstants.RPC_CALL_FROM_SERVER_TO_DEVICE);
        tmp = msg.getMetaData().getValue("oneway");
        boolean oneway = !StringUtils.isEmpty(tmp) && Boolean.parseBoolean(tmp);
        tmp = msg.getMetaData().getValue(DataConstants.PERSISTENT);
        boolean persisted = !StringUtils.isEmpty(tmp) && Boolean.parseBoolean(tmp);
        tmp = msg.getMetaData().getValue("requestUUID");
        UUID requestUUID = !StringUtils.isEmpty(tmp) ? UUID.fromString(tmp) : Uuids.timeBased();
        tmp = msg.getMetaData().getValue("originServiceId");
        String originServiceId = !StringUtils.isEmpty(tmp) ? tmp : null;
        tmp = msg.getMetaData().getValue(DataConstants.EXPIRATION_TIME);
        long expirationTime = !StringUtils.isEmpty(tmp) ? Long.parseLong(tmp) : (System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(config.getTimeoutInSeconds()));
        tmp = msg.getMetaData().getValue(DataConstants.RETRIES);
        Integer retries = !StringUtils.isEmpty(tmp) ? Integer.parseInt(tmp) : null;
        String params = parseJsonData(json.get("params"));
        String additionalInfo = parseJsonData(json.get(DataConstants.ADDITIONAL_INFO));
        RuleEngineDeviceRpcRequest request = RuleEngineDeviceRpcRequest.builder().oneway(oneway).method(json.get("method").getAsString()).body(params).tenantId(ctx.getTenantId()).deviceId(new DeviceId(msg.getOriginator().getId())).requestId(requestId).requestUUID(requestUUID).originServiceId(originServiceId).expirationTime(expirationTime).retries(retries).restApiCall(restApiCall).persisted(persisted).additionalInfo(additionalInfo).build();
        ctx.getRpcService().sendRpcRequestToDevice(request, ruleEngineDeviceRpcResponse -> {
            if (ruleEngineDeviceRpcResponse.getError().isEmpty()) {
                TbMsg next = ctx.newMsg(msg.getQueueName(), msg.getType(), msg.getOriginator(), msg.getCustomerId(), msg.getMetaData(), ruleEngineDeviceRpcResponse.getResponse().orElse("{}"));
                ctx.enqueueForTellNext(next, TbRelationTypes.SUCCESS);
            } else {
                TbMsg next = ctx.newMsg(msg.getQueueName(), msg.getType(), msg.getOriginator(), msg.getCustomerId(), msg.getMetaData(), wrap("error", ruleEngineDeviceRpcResponse.getError().get().name()));
                ctx.enqueueForTellFailure(next, ruleEngineDeviceRpcResponse.getError().get().name());
            }
        });
        ctx.ack(msg);
    }
}
Also used : RuleEngineDeviceRpcRequest(org.thingsboard.rule.engine.api.RuleEngineDeviceRpcRequest) DeviceId(org.thingsboard.server.common.data.id.DeviceId) JsonObject(com.google.gson.JsonObject) UUID(java.util.UUID) TbMsg(org.thingsboard.server.common.msg.TbMsg)

Aggregations

JsonObject (com.google.gson.JsonObject)1 UUID (java.util.UUID)1 RuleEngineDeviceRpcRequest (org.thingsboard.rule.engine.api.RuleEngineDeviceRpcRequest)1 DeviceId (org.thingsboard.server.common.data.id.DeviceId)1 TbMsg (org.thingsboard.server.common.msg.TbMsg)1