- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个独立的 Java 进程,它从 JMS 持久主题读取消息并将它们提交到线程池进行处理。我这样做是出于明显的并发原因,但保持这些消息的处理顺序,我仍然将它们提交到单个线程池。现在这是我对 JVM 崩溃的担忧..
--非事务性
我不会在事务上下文中读取和处理每条消息,我避免这样做,因为它会减慢我的流程。因此,我正在线程池的阻塞队列中累积消息。但是,如果 JVM 崩溃,而线程池中有 10 条消息等待处理,我将丢失该数据。
--事务性
我相信,如果我读取并处理事务中的每条消息,如果出现问题,该消息将在备份时重新传送到进程。
由于这是许多在低延迟系统中工作的人的常见问题,想知道有经验的人如何解决这个问题?谢谢。
最佳答案
彼得的据我所知是正确的。解决此问题的一种方法是,如果该模式适用于您,则使用某种划分来创建不同的队列来将消息分组到其中。也就是说,这一要求经常被分解为“一个帐户的所有消息必须按顺序处理”之类的意思。因此,如果您有类似的东西,您可以创建:
那么您的发布商必须确定:
执行此操作的一种易于维护的模式是使用您的业务字段之一(例如帐号)并对其计算 mod(x),其中 x> 是您希望分担工作负载的订阅者数量。希望您的业务 key 是数字,并且会给您一个不错的分布,但是您始终可以使用其他一些确定性算法通过反转 key 和/或散列其非数字值来生成此数字。
顺便说一句,您的大纲更多地具有点对点/JMS 队列的感觉,而不是发布-订阅/JMS 主题的感觉。您确定要使用主题吗?
如果您绝对不能丢失数据,那么您应该使用事务性消息。如果您使用事务性消息,则无法委托(delegate)给线程池。 JMS 消息的事务上下文(即 session )绑定(bind)到接收消息的线程,因此除非您启用一些“有趣的业务”将此上下文传输到另一个线程......
我什至不知道如何结束这句话。
====更新====
现在我想了一下,如果您可以从并行处理消息中受益,您可以在一个事务中检索一批消息,并将它们全部委托(delegate)给 ExecutorService.invokeAll调用,等待完成并在全部完成后提交事务。如果 invokeAll 超时,或者其中一个任务引发异常,那么您将必须回滚事务或采取某种补偿操作。
关于java - 使用 ThreadPool 和 JMS 时处理 JVM 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14693155/
我在我的应用程序中使用 Windows ThreadPools,每次调用 CreateThreadPoolWork() 时都会遇到 136 字节的内存泄漏,如通过 UMDH 所见: + 1257728
摘自对我之前一个问题的回答( Task.Factory.StartNew starts with a great delay despite having available threads in t
这有什么区别?请引用选项1和选项2。因为我遇到了麻烦,因为它们好像是一样的。它们运行正确 Thread ThreadPoolExecutor executor = (ThreadPoolExecuto
Windows Phone 8 SDK 文档没有描述 Windows.System.Threading.ThreadPool 之间的区别。和 System.Threading.ThreadPool .
我无法通过JSP使用Elasticsearch Java API。在下面,我试图解释我所做的事情。 :| 我已经按照 flex 指令在系统上安装了elasticseach 2.3.3,并在命令提示符下
我试图在 Thread 的帮助下找出控制台应用程序中运行的线程数: new Thread(() => { while (true) {
我们对来自 Android 应用程序的所有网络流量使用 Retrofit/OkHttp3。到目前为止,一切似乎都很顺利。 但是,我们现在偶尔会遇到我们的应用程序/进程用完文件句柄的情况。 Androi
我们应该为长时间运行的线程使用线程池还是启动我们自己的线程?有什么设计模式吗? 最佳答案 不幸的是,这取决于。没有硬性规定说您应该始终使用线程池。 线程池提供两个主要功能: 线程的委托(delegat
我只是实现了一个线程池,如这里所述 Allen Bauer on thread pools 非常简单的实现,可以正常工作,但是我的应用程序不再关闭。似乎有两个工作线程(和另一个线程,我想是排队线程)卡
我有以下代码: static void Main(string[] args) { Console.Write("Press ENTER to start..."); Console.
我在下面编写了一个示例程序。 class Program { static int x = 2; static void Main(string[] args)
我试图了解Parralel.For和ThreadPool.QueueUserWorkItem之间的区别。 硬件和软件: 英特尔i5(四核) Windows 7 64位教授 DotNet 4.5 案例1
当用户单击按钮时,我使用ThreadPool.QueueUserWorkItem生成了一个启动长时间运行的线程的线程。我想在线程完成时使按钮可见,以便用户可以单击它。 ThreadPool中是否有已完
我想要一个类似的功能: public static V callAsyncAndWait(Func func) { ThreadPool.QueueUserWorkItem(obj =>
我正在尝试编写一个 Java 多线程程序,对作为文件给出的 2 个矩阵执行乘法,并使用有限的线程总数。 例如,如果我将线程数设置为 16,我希望我的线程池能够重用这 16 个线程,直到所有任务完成。
我有一个 C# 控制台应用程序,其中有一个线程池。在线程池中会有一个类执行一个连续的方法(直到它运行了一段时间或者知道什么时候停止)。该方法连接到 HttpWebResponse 流并继续读取它。 问
我正在使用 Reflector 仔细阅读 .Net ThreadPool 的一些源代码,当它显示以下内容时: private static bool QueueUserWorkItemHelper(W
每当用户扫描条形码时,我都会触发一个线程。 大多数时候它是一个相当短的运行线程。但有时可能需要很长时间(等待调用 GUI 线程)。 我读到过,为此使用 ThreadPool 可能是个好主意,而不是为每
我有一个场景,我试图通过在可能的情况下在用户实际需要之前预取结果的一些子元素来转变为响应速度更快的 UI。我不清楚如何最好地处理线程,所以我希望有人可以提供一些建议。 场景 有一个搜索表单(.NET
我需要对事件进行排队并并行执行它们。 我的 C# 代码在阻塞集合中对事件进行排队,并使用 ThreadPool 在工作线程上执行每个事件。但是,如果事件以 2000 事件/秒或更高的速率排队,则会错过
我是一名优秀的程序员,十分优秀!