[
https://issues.apache.org/jira/browse/AMQNET-836?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Pavel Borisov updated AMQNET-836:
-
Description:
When the ActiveMQ instance becomes inaccessible, and the failover happens, our
applications start to report the following error:
_A Task's exception(s) were not observed either by Waiting on the Task or
accessing its Exception property. As a result, the unobserved exception was
rethrown by the finalizer thread._
The actual unobserved error is a SocketException.
The origin of the issue is in {*}TcpTransportFactory.{*}{*}TryConnectSocket{*}
([github|https://github.com/apache/activemq-nms-openwire/blob/b89b7498d12fe2f68ee5ee248bb2168c62ceaf3a/src/Transport/Tcp/TcpTransportFactory.cs#L240]).
It starts an async task (socket.BeginConnect), but its result is not observed.
The result is checked by the `socket.Connected` only, and in case of failure,
the actual exception in the task stays unobserved and is eventually promoted to
the UnobservedTaskException event.
Also, for APM methods (Begin*), there are End* methods that *must* be called
according to the docs. But the call to EndConnect is missing in
{*}TryConnectSocket{*}, so a socket stays partially invalid after a successful
connection.
The [snippet
here|https://gist.github.com/Inok/9b17282532bca8a01cc5fc0ab9872433] contains
the same code with some logging, and it reproduces the issue (.NET 6, run in
Release mode).
The fix for both problems is probably [something like
this|https://gist.github.com/Inok/666d647b1bb337bcbef8cad02032237f].
was:
When the ActiveMQ becomes inaccessible, and the failover happens, our
applications start to report the following error:
_A Task's exception(s) were not observed either by Waiting on the Task or
accessing its Exception property. As a result, the unobserved exception was
rethrown by the finalizer thread._
The actual unobserved error is a SocketException.
The origin of the issue is in {*}TcpTransportFactory.{*}{*}TryConnectSocket{*}
([github|https://github.com/apache/activemq-nms-openwire/blob/b89b7498d12fe2f68ee5ee248bb2168c62ceaf3a/src/Transport/Tcp/TcpTransportFactory.cs#L240]).
It starts an async task (socket.BeginConnect), but its result is not observed.
The result is checked by the `socket.Connected` only, and in case of failure,
the actual exception in the task stays unobserved and is eventually promoted to
the UnobservedTaskException event.
Also, for APM methods (Begin*), there are End* methods that *must* be called
according to the docs. But the call to EndConnect is missing in
{*}TryConnectSocket{*}, so a socket stays partially invalid after a successful
connection.
The [snippet
here|https://gist.github.com/Inok/9b17282532bca8a01cc5fc0ab9872433] contains
the same code with some logging, and it reproduces the issue (.NET 6, run in
Release mode).
The fix for both problems is probably [something like
this|https://gist.github.com/Inok/666d647b1bb337bcbef8cad02032237f].
> UnobservedTaskException in the failover
> ---
>
> Key: AMQNET-836
> URL: https://issues.apache.org/jira/browse/AMQNET-836
> Project: ActiveMQ .Net
> Issue Type: Bug
> Components: ActiveMQ
> Environment: .NET 6
>Reporter: Pavel Borisov
>Priority: Major
>
> When the ActiveMQ instance becomes inaccessible, and the failover happens,
> our applications start to report the following error:
> _A Task's exception(s) were not observed either by Waiting on the Task or
> accessing its Exception property. As a result, the unobserved exception was
> rethrown by the finalizer thread._
> The actual unobserved error is a SocketException.
> The origin of the issue is in
> {*}TcpTransportFactory.{*}{*}TryConnectSocket{*}
> ([github|https://github.com/apache/activemq-nms-openwire/blob/b89b7498d12fe2f68ee5ee248bb2168c62ceaf3a/src/Transport/Tcp/TcpTransportFactory.cs#L240]).
> It starts an async task (socket.BeginConnect), but its result is not
> observed. The result is checked by the `socket.Connected` only, and in case
> of failure, the actual exception in the task stays unobserved and is
> eventually promoted to the UnobservedTaskException event.
> Also, for APM methods (Begin*), there are End* methods that *must* be called
> according to the docs. But the call to EndConnect is missing in
> {*}TryConnectSocket{*}, so a socket stays partially invalid after a
> successful connection.
> The [snippet
> here|https://gist.github.com/Inok/9b17282532bca8a01cc5fc0ab9872433] contains
> the same code with some logging, and it reproduces the issue (.NET 6, run in
> Release mode).
> The fix for both problems is probably [something like
> this|https://gist.github.com/Inok/666d647b1bb337bcbef8cad02032237f].
--
This message was sent by Atlassian Jira
(v8.20.10#820010)