这是我的错误:
*** Uncaught remote exception! (Exceptions are not yet supported across processes.)
android.util.AndroidRuntimeException: { what=1008 when=368280372 } This message is already in use.
at android.os.MessageQueue.enqueueMessage(MessageQueue.java:171)
at android.os.Handler.sendMessageAtTime(Handler.java:457)
at android.os.Handler.sendMessageDelayed(Handler.java:430)
at android.os.Handler.sendMessage(Handler.java:367)
at android.view.ViewRoot.dispatchAppVisibility(ViewRoot.java:2748)
Run Code Online (Sandbox Code Playgroud)
我正在尝试的是有一个listview,由自定义列表项填充,每个列表项有多个视图,每个视图都附加一个onclick监听器.当按下这个onClickListener时,它会向一个带有what和arg1参数的Handler发送一条消息.单击我的一个元素会触发启动新活动的意图.单击另一个显示祝酒词.当组合按下这些时,我得到上面的错误.即单击文本以触发意图,(然后按回)然后单击图像以显示吐司,然后当您单击文本再次触发意图时,我获得FC.
这是下面的代码,我试图尽可能多地删除错误的骨头:
如果你想跳到什么重要的,请看ConversationAdapter.class中的onClickListener以及它们如何与StartPage.class交互
Android清单:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.handler.test"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".StartPage"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".DetailsPage"
android:label="DetailsPage"
>
</activity>
</application>
<uses-sdk android:minSdkVersion="3" />
</manifest>
Run Code Online (Sandbox Code Playgroud)
StartPage.class:
package com.handler.test;
import java.util.ArrayList;
import android.app.ListActivity;
import android.app.ProgressDialog;
import …Run Code Online (Sandbox Code Playgroud) 我在一个名为"MessageQueueReceive"的类中有这个.
public MessageQueueTransaction BlockingReceive(out Message message)
{
MessageQueueTransaction tran = null;
message = null;
tran = new MessageQueueTransaction();
tran.Begin();
try
{
message = Queue.Receive(new TimeSpan(0, 0, 5), tran);
}
catch (MessageQueueException ex)
{
// If the exception was a timeout, then just continue
// otherwise re-raise it.
if (ex.MessageQueueErrorCode != MessageQueueErrorCode.IOTimeout)
throw ex;
}
return tran;
}
Run Code Online (Sandbox Code Playgroud)
然后我的处理循环有: -
while (!Abort)
{
try
{
tran = this.Queue.BlockingReceive(out msg);
if (msg != null)
{
// Process message here
if (tran != …Run Code Online (Sandbox Code Playgroud) 我有一个简单的RabbitMQ测试程序随机排队消息,另一个读取它们,都使用Spring-AMQP.如果消费者死亡(例如,在没有机会关闭其连接或通道的情况下终止进程),则任何未确认的消息似乎永远不会被确认.
我已经看到了许多引用(例如这个问题),它说当通道在没有连接时死亡,并且将重新传送剩余的未包装的消息.这不是我看到的行为 - 相反,我得到了一个越来越多的标记为IDLE的频道列表,以及越来越多的标记正在运行但没有活动的连接列表.
一旦进程被杀死,是否需要一些配置才能注意到连接已经死亡?
编辑: 我在VirtualBox VM中运行rabbitmq服务器,显然无法通过NAT正确管理死入站连接.这对于直接在物理主机上运行的mq服务器来说效果很好.
我试图以更加非常规的方式使用RabbitMq(尽管此时我可以选择任何其他消息队列实现,如果需要).消费者不是将Rabbit推送消息留给我的消费者,而是连接到队列并获取一批N个消息(在此期间消耗一些消息并且可能拒绝一些消息),然后它跳转到另一个队列,依此类推.这样做是为了冗余.如果某些消费者崩溃,则保证所有消息都被其他消费者消费.
问题是我有多个消费者,我不希望他们在同一个队列中竞争.有没有办法保证队列锁定?如果没有,我是否至少可以确保如果2个消费者连接到同一个队列,他们不会读取相同的消息?交易可能在某种程度上帮助了我,但我听说他们将从RabbitMQ中删除.
其他建筑建议也受到欢迎.
谢谢!
编辑: 正如评论中所指出的那样,我需要如何处理消息.它们只在组中有意义,并且相关消息很可能在队列中聚集在一起.例如,如果我拉了一批100条消息,那么很有可能我会对1-3,4-5,6-10等消息做一些事情.如果我找不到某些消息的组,我将他们重新提交到队列中.WorkQueue不起作用,因为它会将来自同一组的消息传播给不知道如何处理它们的多个工作人员.
当Web角色将消息放入存储队列时,如何轮询特定的相关响应?我希望后端的Worker Role将消息放入响应队列,目的是让调用者选择响应并从那里开始.
我们的目的是利用Queue将一些繁重的处理卸载到后端的Worker Roles上,以确保Web角色的高性能.但是,在后端Worker完成并做出响应之前,我们不希望响应HTTP请求.
我正在向运行Windows Server 2008 R2的计算机上创建的非常标准的消息队列发送消息.
QueueName:
directionsTest
MachineName:
usernameDev
Run Code Online (Sandbox Code Playgroud)
当我尝试将消息发送到队列时,我收到错误.:
队列路径名无效.
我感到困惑的是,我实际上是通过SSMS查询窗口发送此消息,我们有存储过程将这些消息发送到队列,我们只提供机器名称,队列名称和消息.所以,这基本上是我多次使用的保存查询,实际上我在上周末使用了这个完全相同的查询.从那时起,我没有更改查询/我的机器/队列/,并且创建和发送这些消息的存储过程没有改变.所以,我不确定为什么这会给我这个错误.
我已经尝试了太阳下的一切,我尝试在我的计算机上创建新的队列并收到相同的错误.我还确保每个人都可以访问这些队列.关于什么会导致此错误弹出的任何想法?我已经搜索过网络,但我没有发现可能导致此问题的线索.(**我还测试了在不同服务器上发送到队列,这没有错误)
感谢任何建议/方向提前.
我正在开始使用节点的集群API和mongoose为节点编写工作队列.
我注意到很多lib已经存在,但已经使用redis和forking.是否有充分的理由进行分叉而不是使用集群API?
编辑,现在我也发现:https://github.com/xk/node-threads-a-gogo - 太多的选择!
因为我已经使用了mongo,所以我宁愿不添加redis.此外,我的要求非常宽松,我希望持久性,但第一个版本可能没有它.
问题的第二部分:今天有哪些最稳定/最常用的nodejs工作队列库?
我正在使用RabbitMQ 我的任务池逐个按顺序运行.但是如何添加时间参数以使任务仅在未来的定义时间运行(如a scheduled tasks).
我发现后端消息处理中出现了常见的模式:
ServiceA生成大量消息.
ServiceB一次处理一条消息.
ServiceC发出对数据库或Web服务调用的调用,这可以通过批量调用获得显着的性能和可靠性.
在某些情况下,从ServiceA预批处理消息或在ServiceB中批量处理消息是不可行的,因此首选项将是单独处理所有消息,直到在ServiceC上进行最终调用.这需要在ServiceC调用之前进行批处理.
看似理想的情况是拥有一个NServiceBus处理程序签名,该签名可选择在批处理中传递消息,例如:
public void Handle(FooMessage[] messageBatch)
{
}
Run Code Online (Sandbox Code Playgroud)
其中,在处理程序执行之前,messageBatch中的所有消息都不会被提交.
在NServiceBus中似乎没有本机支持.我可以在队列中一次处理消息并写入内存直到批量刷新.但在这种情况下,消息是在刷新之前提交的,如果进程崩溃,我们不会保留批处理中所有消息的传递保证.
所以问题是:由于某种原因我不会想到这是一个糟糕的模式吗?我知道知道何时刷新批次存在一个固有的问题,但似乎至少有一些传输实现缓冲了已经在引擎盖下的批处理中的消息,并且只是一次一个地交付.在这个级别进行批处理或者为定期刷新设置一个简单的超时似乎会起作用.
是否有解决方法或我缺少的首选模式?