Comments (6)
I worked out what's going on.
amqplib is catching the error in what it calls it's main accept loop and [re-emitting]((https://github.com/amqp-node/amqplib/blob/bbe579e467866a40ff1c0ae2428c416111340364/lib/connection.js#L429) it as a frame error. This is handled by the socket error code, which expects a socket close due to the connection having been dropped, and does nothing.
I'll change Rascal to emit the error event (and schedule the reconnection) from within a setImmediate. This will cause the error bypasses amqplib's main accept loop and bubble up to the process as expected.
I've tested locally and it is caught by the uncaughtException
handler
from rascal.
Hi @Zoddo. Have you added error handlers as described in the very important section about error handling?
from rascal.
I added the following code to your example, and the app restarts the connection as expected
broker.on('error', (err) => {
console.error({ err })
});
However I'm confused as to why the application doesn't crash without this. The error event documentation still say
If an EventEmitter does not have at least one listener registered for the 'error' event, and an 'error' event is emitted, the error is thrown, a stack trace is printed, and the Node.js process exits.
I'll continue to investigate
from rascal.
Oh, I have an uncaughtException
handler, that's why my app didn't crash (and why I didn't explicitly register an error listener).
I believe you check if an error listener is attached to the broker instance and don't automatically reconnect if none are attached?
I confirm explicitly attaching an error listener to the broker instance fix the issue.
from rascal.
Hi @Zoddo,
Rascal doesn't check whether an error listener is attached. The code simply emits an error then schedules the retry. I don't think that uncaughtException handlers catch error events, so it should have crashed your application.
from rascal.
Hi @Zoddo
[email protected] emits the error events via setImmediate. I issued a major release in case there are unintended side effects, but I can't see a reason why there would be. You do need to add the explicit error handlers, when I tested using a global uncaughtException
handler, it caught the errors but prevented the reconnection / resubscription code from running.
In making the change, I spotted that I had been handling channel close and connection error events incorrectly - the code was shared with the channel close and connection error, and expected an error event. Consequently it threw an exception that was being swallowed by the aforementioned main accept loop. In practice, I'm not sure this mattered though, as connection close and channel close events are only emitted without errors during a client initiated shutdown.
from rascal.
Related Issues (20)
- How to update subscriptions after use Broker.create(config) HOT 1
- MaxListenersExceededWarning HOT 4
- Config with only subscribers HOT 11
- Customize consumer tag HOT 2
- Failed to assert vhost: Timeout of 1000ms exceeded HOT 3
- How can I do multi-ack? HOT 6
- Potential messages multiply? HOT 21
- Rascal fatal error - Timed out waiting for broker to confirm publication HOT 3
- withDefaultConfig does not work properly with url connection strings HOT 3
- FEATURE: Consumer prefetch update? HOT 7
- Messages multiply in queues (part II) HOT 13
- No channels left to allocate HOT 3
- No channels left to allocate HOT 5
- Rascal connects to RabbitMQ stop receiving messages under high load HOT 13
- BUG: no way to use passwords in connection url that would make the url invalid HOT 3
- FEATURE: Add support for updatable authentication secrets
- FEATURE: Upgrade dependency superagent to v9.0.0+ to include vulnerability fix HOT 2
- FEATURE: Add NodeJS Streams support to subscriptions HOT 2
- FEATURE: Improve the republish strategy with immediateNack and dead-letter queue HOT 7
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from rascal.