首页 \ 问答 \ Netty处理HTTP请求(Netty Handle HTTP requests)

Netty处理HTTP请求(Netty Handle HTTP requests)

我正在使用netty写一个HTTP服务器,它将收到一个http web服务请求。 从SnoopServer示例中获取参考,我能够在我的HTTP处理程序中获取请求。 现在我应该编写一个基于后端servlet的应用程序(例如:使用tomcat)来处理该请求,或者我应该使用switch case或其他东西在我的netty处理程序代码中处理它?

哪种方法更合适? 如果两者都错了,那么还有其他方法吗?


I am writing an HTTP server using netty which will recive an http webservice request. Taking reference from the SnoopServer Example, I was able to get the request in my HTTP handler. Now should I write a backend servlet based application( for ex: using tomcat) to process that request or a should I handle that in my netty handler code either using switch case or something else?

Which approach is more suitable? If both are wrong, then is there any other approach?


原文:https://stackoverflow.com/questions/32356362
更新时间:2023-07-16 15:07

最满意答案

基本上BlockingQueues使用锁来确保数据的一致性并避免数据丢失,因此在太高的并发环境中它会拒绝许多任务(您的情况)。

您可以使用RejectedExecutionHandler实现在trunk上播放以重试提供任务。 一种实现可以是:

new RejectedExecutionHandler() {
        @Override
        public void rejectedExecution(final Runnable r, final ThreadPoolExecutor executor) {
            for (int i = 0; i < 10; i++) {
                if (executor.getQueue().offer(r)) {
                    return;
                }

                try {
                    Thread.sleep(50);
                } catch (final InterruptedException e) {
                    // no-op
                }
            }
            throw new RejectedExecutionException();
        }
    }

随机睡眠(在最小和最大之间)它甚至可以更好地工作。

这个想法基本上是:如果队列已满,请等待一段时间以减少并发性。


Basically BlockingQueues use locks to ensure the consistency of data and avoid data loss, so in too highly concurrent environment it will reject a lot of tasks (your case).

You can play on trunk with the RejectedExecutionHandler implementation to retry to offer the task. One implementation can be:

new RejectedExecutionHandler() {
        @Override
        public void rejectedExecution(final Runnable r, final ThreadPoolExecutor executor) {
            for (int i = 0; i < 10; i++) {
                if (executor.getQueue().offer(r)) {
                    return;
                }

                try {
                    Thread.sleep(50);
                } catch (final InterruptedException e) {
                    // no-op
                }
            }
            throw new RejectedExecutionException();
        }
    }

It even works better with random sleep (between min and max).

The idea is basically: if the queue is full, wait some short time to reduce the concurrency.

相关问答

更多
  • 首先,您需要一个执行异步操作的包装器方法,它将返回一个信号。 假设异步操作操作完成一个完成块。 从它的声音,你不关心的值,你想要的副作用,在这种情况下,信号不发送值,它只完成。 - (RACSignal *)asyncOperation { return [RACSignal createSignal:^RACDisposable * (id subscriber) { [self asyncOperationWithCompletion:^{ ...
  • 我认为你的解决方案是正常的, Http status 202是在这种具体情况下使用的正确响应 ,指示请求已被接受处理,但处理尚未完成 。 在工作流程中我稍稍改变的是后续请求的Http status 。 如你所说, 202 response应该返回一个Location header指定客户端应该用来监视其先前请求的状态的URL。 调用这个check-the-status-of-process进程的 URL,而不是在进程待处理的情况下返回202,我会返回: 200 OK请求的进程仍处于待定状态。 响应应描述进程 ...
  • 我不能回答别人的偏好,但是我推出了自己的
  • 这取决于您运行的操作系统... 挂起的recv将使用一些非页面缓冲池,它将导致某些内存页面被锁定以进行I / O. 在Windows Vista之前,非页面缓冲池非常恐慌,并且它是一种机器范围的商品,如果它耗尽,可能会导致设计不良的驱动程序崩溃...所以在Vista之前的操作系统上你可能会从底层获得'ENOBUFS'错误由于缺少非分页池,重叠的I / O系统。 有关非分页池限制的更多详细信息,请参见http://www.lenholgate.com/blog/2009/03/excellent-articl ...
  • Servy解释说。 使用TaskCompletionSource本身不会创建(或驻留)任何线程,只要您正确使用异步模式即可。 .Net框架中有3种不同的异步模式: 异步编程模型(APM) 。 基于事件的异步模式(EAP) 。 基于任务的异步模式(TAP) 。 你试图实现的是将一种模式EAP转换为另一种模式TAP。 更简单的解决方案是使用.Net内置的从APM模式到TAP的“转换”, Task.Factory.FromAsync (内部使用TaskCompletionSource ): APM socket. ...
  • 基本上BlockingQueues使用锁来确保数据的一致性并避免数据丢失,因此在太高的并发环境中它会拒绝许多任务(您的情况)。 您可以使用RejectedExecutionHandler实现在trunk上播放以重试提供任务。 一种实现可以是: new RejectedExecutionHandler() { @Override public void rejectedExecution(final Runnable r, final ThreadPoolExecutor ex ...
  • 如果会话WCF服务具有启动会话的Login单向方法,此方法何时将控制权返回给调用者? 对于OneWay呼叫:一旦调度或排队服务呼叫,呼叫者将继续执行。 基本上,只要服务成功接收到呼叫。 我怎么能确定该方法是在服务上执行的? 如果客户端没有获得异常,则执行(或将要执行)服务调用。 当服务调用实际运行或者是否成功或抛出异常时,客户端都不知道。 如果我希望服务返回到客户端登录过程中可能发生的错误,那么异步调用是实现“即发即弃”行为的唯一方法吗? 这根本不符合逻辑。 根据定义,“一劳永逸”意味着忘记结果。 它不会向 ...
  • 我不确定我是否正确理解了你的问题,但听起来你想确保在操作完成之前没有销毁等待优秀异步操作的类? enable_shared_from_this惯用法可用于此目的,并在例如http://www.boost.org/doc/libs/1_46_1/doc/html/boost_asio/tutorial/tutdaytime7/src.html中进行演示。 如果你看一下tcp_connection :: start,你会看到类如何将shared_ptr传递给它自己以作为异步操作的处理程序进行绑定。 Solved ...
  • 您可以通过多种方式编写此程序,但使用计数器的简单方法可以正常工作。 重要的是要记住,这将起作用的原因是因为Javascript在单个线程中执行 。 所有浏览器和node.js AFAIK都是如此。 基于下面的深思熟虑的评论,该解决方案有效,因为JS事件循环将按以下顺序执行函数: 功能(工作) 工作(10) 计数器++ 启动异步功能 工作(20) 计数器++ 启动异步功能 工作(30) 计数器++ 启动异步功能 - 退回到事件循环 - 异步功能完成 计数器 - - 退回到事件循环 - 异步功能完成 计数器 - ...
  • 因为您正在创建的lambda表达式将保存为仿函数并存储在与io_service对象关联的数据结构中。 当您调用async_accept时,该调用立即返回。 它不会创建一个新的堆栈帧(语义上。从技术上讲,它确实如此,但它只存在几分之一毫秒) 当lambda表达式最终被调用时,它将在与io_service的任何关联线程的堆栈上,而不是原始堆栈。 Because the lambda expression you're creating is getting saved as a functor and stor ...

相关文章

更多

最新问答

更多
  • 如何在Laravel 5.2中使用paginate与关系?(How to use paginate with relationships in Laravel 5.2?)
  • linux的常用命令干什么用的
  • 由于有四个新控制器,Auth刀片是否有任何变化?(Are there any changes in Auth blades due to four new controllers?)
  • 如何交换返回集中的行?(How to swap rows in a return set?)
  • 在ios 7中的UITableView部分周围绘制边界线(draw borderline around UITableView section in ios 7)
  • 使用Boost.Spirit Qi和Lex时的空白队长(Whitespace skipper when using Boost.Spirit Qi and Lex)
  • Java中的不可变类(Immutable class in Java)
  • WordPress发布查询(WordPress post query)
  • 如何在关系数据库中存储与IPv6兼容的地址(How to store IPv6-compatible address in a relational database)
  • 是否可以检查对象值的条件并返回密钥?(Is it possible to check the condition of a value of an object and JUST return the key?)
  • GEP分段错误LLVM C ++ API(GEP segmentation fault LLVM C++ API)
  • 绑定属性设置器未被调用(Bound Property Setter not getting Called)
  • linux ubuntu14.04版没有那个文件或目录
  • 如何使用JSF EL表达式在param中迭代变量(How to iterate over variable in param using JSF EL expression)
  • 是否有可能在WPF中的一个单独的进程中隔离一些控件?(Is it possible to isolate some controls in a separate process in WPF?)
  • 使用Python 2.7的MSI安装的默认安装目录是什么?(What is the default installation directory with an MSI install of Python 2.7?)
  • 寻求多次出现的表达式(Seeking for more than one occurrence of an expression)
  • ckeditor config.protectedSource不适用于editor.insertHtml上的html元素属性(ckeditor config.protectedSource dont work for html element attributes on editor.insertHtml)
  • linux只知道文件名,不知道在哪个目录,怎么找到文件所在目录
  • Actionscript:检查字符串是否包含域或子域(Actionscript: check if string contains domain or subdomain)
  • 将CouchDB与AJAX一起使用是否安全?(Is it safe to use CouchDB with AJAX?)
  • 懒惰地初始化AutoMapper(Lazily initializing AutoMapper)
  • 使用hasclass为多个div与一个按钮问题(using hasclass for multiple divs with one button Problems)
  • Windows Phone 7:检查资源是否存在(Windows Phone 7: Check If Resource Exists)
  • 无法在新线程中从FREContext调用getActivity()?(Can't call getActivity() from FREContext in a new thread?)
  • 在Alpine上升级到postgres96(/ usr / bin / pg_dump:没有这样的文件或目录)(Upgrade to postgres96 on Alpine (/usr/bin/pg_dump: No such file or directory))
  • 如何按部门显示报告(How to display a report by Department wise)
  • Facebook墙贴在需要访问令牌密钥后无法正常工作(Facebook wall post not working after access token key required)
  • Javascript - 如何在不擦除输入的情况下更改标签的innerText(Javascript - how to change innerText of label while not wiping out the input)
  • WooCommerce / WordPress - 不显示具有特定标题的产品(WooCommerce/WordPress - Products with specific titles are not displayed)