use of org.eclipse.milo.opcua.stack.core.types.structured.RequestHeader in project milo by eclipse.
the class DiscoveryClient method getEndpoints.
/**
* Query the GetEndpoints service at {@code endpointUrl}.
*
* @param endpointUrl the endpoint URL to get endpoints from.
* @param localeIds list of locales to use. Specifies the locale to use when returning human-readable strings.
* @param profileUris list of Transport Profile that the returned Endpoints shall support. All Endpoints are
* returned if the list is empty.
* @return the {@link GetEndpointsResponse} returned by the GetEndpoints service.
*/
public CompletableFuture<GetEndpointsResponse> getEndpoints(String endpointUrl, String[] localeIds, String[] profileUris) {
RequestHeader header = stackClient.newRequestHeader(NodeId.NULL_VALUE, stackClient.getConfig().getRequestTimeout());
GetEndpointsRequest request = new GetEndpointsRequest(header, endpointUrl, localeIds, profileUris);
return stackClient.sendRequest(request).thenApply(GetEndpointsResponse.class::cast);
}
use of org.eclipse.milo.opcua.stack.core.types.structured.RequestHeader 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));
}
});
}
use of org.eclipse.milo.opcua.stack.core.types.structured.RequestHeader in project milo by eclipse.
the class ClientServerTest method testClientReconnect.
@Test
public void testClientReconnect() throws Exception {
EndpointDescription endpoint = endpoints[0];
Variant input = new Variant(42);
logger.info("SecurityPolicy={}, MessageSecurityMode={}, input={}", SecurityPolicy.fromUri(endpoint.getSecurityPolicyUri()), endpoint.getSecurityMode(), input);
UaStackClient client = createClient(endpoint);
client.connect().get();
RequestHeader header = new RequestHeader(NodeId.NULL_VALUE, DateTime.now(), uint(0), uint(0), null, DEFAULT_TIMEOUT_HINT, null);
ReadRequest request = new ReadRequest(header, 0.0, TimestampsToReturn.Neither, new ReadValueId[] { new ReadValueId(NodeId.NULL_VALUE, AttributeId.Value.uid(), null, null) });
logger.info("sending request: {}", request);
UaResponseMessage response0 = client.sendRequest(request).get();
logger.info("got response: {}", response0);
logger.info("initiating a reconnect by closing channel in server...");
server.getConnectedChannels().forEach(c -> {
try {
c.close().await();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
logger.info("sending request: {}", request);
try {
UaResponseMessage response1 = client.sendRequest(request).get();
logger.info("got response: {}", response1);
} catch (Exception e) {
// try again because close() above is a race condition
UaResponseMessage response1 = client.sendRequest(request).get();
logger.info("got response: {}", response1);
}
client.disconnect().get();
}
Aggregations