Comments (4)
Initially I thought this was a bug, but now that I've investigated it more fully, I don't believe it is.
The reason this doesn't work with synchronous handlers is because the adapter expects the write-body-to-stream
protocol method to also be synchronous. That is, the response is complete when both the handler and write-body-to-stream
have completed.
This seems like reasonable behavior to have, as synchronous functions have guarantees that asynchronous ones do not. A thread is assigned to the handler, and then to write the body stream, and then given back up to the pool. There's no instance where the body stream could be left open without also blocking the request thread.
Going back to the handler function you gave as an example, we could rewrite this to work correctly just by removing the future
. The only case where this doesn't work is if we want to write data asynchronously to the output stream, without blocking a worker thread; but this is what :async? true
is for.
My current thinking is that it's better to keep the guarantees that synchronous, blocking I/O give us. Particularly if Java's virtual threads allow us to park a thread for relatively little cost in future.
from ring.
My current thinking is that it's better to keep the guarantees that synchronous, blocking I/O give us. Particularly if Java's virtual threads allow us to park a thread for relatively little cost in future.
I think I understand your point, this seems simpler and safer.
I'm re-reading the doc string of the protocol now:
(write-body-to-stream [body response output-stream]
"Write a value representing a response body to an output stream. The stream
will be closed after the value had been written. The stream may be written
asynchronously.")
In retrospect, maybe "after the value has been written" means "after write-body-to-stream
returns"? Which would then only true in the "ring sync" case. I guess this is quite tricky to document because details from the implementation seem to leak into the protocol. The lifecycle of output-stream
is managed by ring sync, but left completely up to the user by ring async.
from ring.
Yes, I think we want to update the protocol docstring to explain the use-case more clearly.
from ring.
Back to servlet spec, it does not allow async thread to write to HttpServletResponse
outside handler methods of HttpServlet
. Jetty has flexible requirement for this but it requires a callback to be resolved when write finished. For now, it's recommended to use :async
ring handlers for this I think.
from ring.
Related Issues (20)
- upgrade of Apache Commons FileUpload to 1.5 HOT 13
- Websocket support HOT 1
- The AES / CBC algorithm used in the cookie session store _might_ be insecure HOT 3
- Attributes in the `Set-Cookie` header are formatted incorrectly HOT 1
- How to measure time that it takes to complete a request? HOT 2
- Documentation for cookies HOT 2
- How to change UriCompliance mode HOT 2
- Add support for Partitioned cookies (CHIPS) HOT 1
- JettyWebSocketServerContainer can not implement WebSocketPolicy because it is not an interface HOT 4
- Reflection warnings HOT 2
- ring hangs when attempting to use websockets with :async? true HOT 3
- Catch up rename of `websocket-request?` to `upgrade-request?` in Wiki HOT 1
- How do I specify an optional field when accepting multipart-params for a request? HOT 1
- wrap-multipart-params creates an empty file when an empty file input is submitted HOT 4
- ring and ring-jetty-adapter 1.12.1 fails to work with simple example from wiki HOT 2
- cleaning up after a websocket goes aways is not clear HOT 4
- Update jetty-server HOT 3
- False positive circular dependency in wrap-reload due to as-alias HOT 2
- `(wrap-not-modified)` is better off removing `Content-Length` header from 304 Not Modified responses HOT 1
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 ring.