use of org.eclipse.milo.opcua.stack.core.types.structured.PublishRequest in project milo by eclipse.
the class SubscriptionManager method publish.
public void publish(ServiceRequest service) {
PublishRequest request = (PublishRequest) service.getRequest();
SubscriptionAcknowledgement[] acknowledgements = request.getSubscriptionAcknowledgements();
if (acknowledgements != null) {
StatusCode[] results = new StatusCode[acknowledgements.length];
for (int i = 0; i < acknowledgements.length; i++) {
SubscriptionAcknowledgement acknowledgement = acknowledgements[i];
UInteger sequenceNumber = acknowledgement.getSequenceNumber();
UInteger subscriptionId = acknowledgement.getSubscriptionId();
Subscription subscription = subscriptions.get(subscriptionId);
if (subscription == null) {
logger.debug("Can't acknowledge sequenceNumber={} on subscriptionId={}; id not valid for this session", sequenceNumber, subscriptionId);
results[i] = new StatusCode(StatusCodes.Bad_SubscriptionIdInvalid);
} else {
logger.debug("Acknowledging sequenceNumber={} on subscriptionId={}", sequenceNumber, subscriptionId);
results[i] = subscription.acknowledge(sequenceNumber);
}
}
service.attr(KEY_ACK_RESULTS).set(results);
}
if (!transferred.isEmpty()) {
Subscription subscription = transferred.remove(0);
subscription.returnStatusChangeNotification(service, new StatusCode(StatusCodes.Good_SubscriptionTransferred));
return;
}
if (subscriptions.isEmpty()) {
service.setServiceFault(StatusCodes.Bad_NoSubscription);
return;
}
publishQueue.addRequest(service);
}
use of org.eclipse.milo.opcua.stack.core.types.structured.PublishRequest in project milo by eclipse.
the class OpcUaSubscriptionManager method sendPublishRequest.
private void sendPublishRequest(UaSession session, AtomicLong pendingCount) {
List<SubscriptionAcknowledgement> subscriptionAcknowledgements = new ArrayList<>();
subscriptions.values().forEach(subscription -> {
synchronized (subscription.availableAcknowledgements) {
subscription.availableAcknowledgements.forEach(sequenceNumber -> subscriptionAcknowledgements.add(new SubscriptionAcknowledgement(subscription.getSubscriptionId(), sequenceNumber)));
subscription.availableAcknowledgements.clear();
}
});
RequestHeader requestHeader = client.getStackClient().newRequestHeader(session.getAuthenticationToken(), getTimeoutHint());
UInteger requestHandle = requestHeader.getRequestHandle();
PublishRequest request = new PublishRequest(requestHeader, subscriptionAcknowledgements.toArray(new SubscriptionAcknowledgement[0]));
if (logger.isDebugEnabled()) {
String[] ackStrings = subscriptionAcknowledgements.stream().map(ack -> String.format("id=%s/seq=%s", ack.getSubscriptionId(), ack.getSequenceNumber())).toArray(String[]::new);
logger.debug("Sending PublishRequest, requestHandle={}, acknowledgements={}", requestHandle, Arrays.toString(ackStrings));
}
client.<PublishResponse>sendRequest(request).whenComplete((response, ex) -> {
if (response != null) {
logger.debug("Received PublishResponse, sequenceNumber={}", response.getNotificationMessage().getSequenceNumber());
processingQueue.submit(() -> onPublishComplete(response, pendingCount));
} else {
StatusCode statusCode = UaException.extract(ex).map(UaException::getStatusCode).orElse(StatusCode.BAD);
logger.debug("Publish service failure (requestHandle={}): {}", requestHandle, statusCode, ex);
pendingCount.getAndUpdate(p -> (p > 0) ? p - 1 : 0);
if (statusCode.getValue() != StatusCodes.Bad_NoSubscription && statusCode.getValue() != StatusCodes.Bad_TooManyPublishRequests) {
maybeSendPublishRequests();
}
UaException uax = UaException.extract(ex).orElse(new UaException(ex));
subscriptionListeners.forEach(l -> l.onPublishFailure(uax));
}
});
}
Aggregations