标签: message-queue

消息传递,队列和ESB - 我知道我想成为什么但不知道如何到达那里

简而言之,我正在开发一个项目,我们正在为所有常见原因重写大型Web应用程序.重写的主要目的是将在单个服务器上运行的大型单个应用程序分离为许多较小的解耦应用程序,这些应用程序可以在许多服务器上运行.

好的,这就是我想要的:

我想HTTP成为主要的运输机制.当一个应用程序(例如CMS)已更新时,它将通过http联系经纪人并说"I've changed",然后经纪人将发回一个200 OK说"thanks I got the message".

然后,代理将查看其他想要了解CMS更改的应用程序列表,并将该消息传递给应用程序在告知代理希望了解该消息时所留下的URL.

其他应用程序将200 OK在收到消息时返回,如果不是,则代理会保留消息并将其排队,以便下次有人尝试联系该应用程序时.

问题是我甚至不知道从哪里开始或我需要做什么.我一直在寻找XMPP,ActiveMQ,RabbitMQ,Mule ESB等,并可以看到我可以花明年兜兜转转这个东西.

任何人都可以提供个人经验的建议,因为我非常希望避免以艰难的方式吸取教训.

queue messaging esb message-queue

5
推荐指数
2
解决办法
6960
查看次数

可以在Linux上跨用户使用POSIX消息队列吗?

我已经实现了POSIX消息队列.在听众方面,我打开这样的队列:

mqdes = mq_open(s_mailbox_name.c_str(), O_RDONLY | O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO, NULL);

在发件人方面,我正在打开这样的队列:

mqdes = mq_open(m_s_mailbox_name.c_str(), O_WRONLY);

字符串在两者上都是相同的,让我们调用它 /foobox

现在,当我将发送者和接收者作为盒子上的同一个用户运行时,一切都运行良好.但是,如果发送方和接收方是2个不同的用户,则接收方无法打开队列.我认为这不会是一个问题,因为我打开队列为0777,所以每个人都可以RWX.

有什么明显的东西我做错了吗?或者这是不可能的(请不要让它成为这个)

谢谢

c++ linux posix message-queue

5
推荐指数
1
解决办法
761
查看次数

erlang - 如何限制消息队列或模拟它?

现在我正在做过程!消息,但正如我google了一下,消息队列大小仅限于内存.我有一个进程树,其中叶子生成消息并提供给根,我需要限制队列或切换到另一种方法来做同样的事情.

更多的是,有时Process从一片叶片中获取消息,有时从两片叶片中获取消息.在第二种情况下,我需要不同的有限队列的屋檐叶.

erlang message-queue

5
推荐指数
1
解决办法
2928
查看次数

尝试使用Nservice总线时出错

我是NServcie总线的新手,我正试图实现发布和订阅消息.这是我得到的错误

启动端点时出现异常,已记录错误.原因:找不到目标队列"mygateway".您可能在配置文件中的UnicastBusConfig部分的MessageEndpointMappings中错误配置了此类消息的目标(NServiceBus.Unicast.Transport.CompletionMessage).也可能是尚未创建给定队列的情况,或已被删除.

这是我在app config中使用的配置

         <MsmqTransportConfig
                       InputQueue="publisherqueue"
                       ErrorQueue="error"
                       NumberOfWorkerThreads="1"
                        MaxRetries="5" />

      <UnicastBusConfig
         DistributorControlAddress=""
         DistributorDataAddress=""
         ForwardReceivedMessagesTo="">

         <MessageEndpointMappings>
           <add Messages="Messages"
               Endpoint="mygateway" />
         </MessageEndpointMappings>
       </UnicastBusConfig>

       <MsmqSubscriptionStorageConfig
              Queue="GateWaySubscriptions" />
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么这个"mygateway"队列不是自动创建的?我做错了吗?请帮忙.

谢谢Alex.

nservicebus message-queue

5
推荐指数
1
解决办法
2221
查看次数

MessageQueue不止一次处理

我在其他帖子上看到过这个错误,但不是这个确切的情况.

我有两个类使用MessageQueue执行相同的操作.因此,我将队列的创建和处理抽象为helper类.我收到此错误,我无法看到队列如何被多次处理.

对象'messageQueue'可以在方法'MsmqHelper.DisposeQueue(MessageQueue)'中多次处理

在其中一个类中,这是队列的使用方式:

private MessageQueue _messageQueue;
Run Code Online (Sandbox Code Playgroud)

然后,在类的构造函数中:

this._messageQueue = MsmqHelper.InitializeQueue();
Run Code Online (Sandbox Code Playgroud)

这并不重要,但为了完整性,这里是使用队列的地方:

this._messageQueue.Send(workflowCreated);
Run Code Online (Sandbox Code Playgroud)

以下是Dispose方法:

public void Dispose()
{
    Dispose(true);
    GC.SuppressFinalize(this);
}

private void Dispose(bool disposing)
{
    if (disposing == false) { return; }

    MsmqHelper.DisposeQueue(this._messageQueue);
}
Run Code Online (Sandbox Code Playgroud)

这是helper类中实际调用Dispose()的代码:

public static void DisposeQueue(MessageQueue messageQueue)
{
    if (messageQueue != null)
    {
        messageQueue.Close();
        messageQueue.Dispose();
        messageQueue = null;
    }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,队列可以在哪里被处置多次?

**编辑**

我认为在下面的对话中添加我的评论会很高兴.这是一个很好的总结,以及接受的答案:

我想我现在明白了.messageQueue方法参数与对象的原始(this._messageQueue)引用无关.因此,检查messageQueue为null,并将其设置为null,没有用.即使在被处理之后,调用者仍然可以传入其变量(this._messageQueue).因此,能够不止一次地处置.

顺便说一句,即使在调用方法中将调用者的变量(this._messageQueue)设置为null也无济于事.该问题仅存在于MsmqHelper.DisposeQueue()中.所以答案是通过ref传递或者根本不调用DisposeQueue()并在调用方法中完成所有操作.

**编辑2**

尝试这个后,我得到了同样的错误.我根本就没有得到它.

public static void DisposeQueue(ref MessageQueue messageQueue)
{
    if (messageQueue == null) { return; }

    messageQueue.Close();
    messageQueue.Dispose();
    messageQueue = null; …
Run Code Online (Sandbox Code Playgroud)

c# dispose message-queue

5
推荐指数
1
解决办法
1235
查看次数

在上一条消息发送得太快之后,MessageQueue丢弃消息

我有一个Windows服务和Office加载项通过私有MessageQueue进行通信,我使用此MSDN Library示例在每一侧实现EventHandlers.

我在加载项中添加了一个按钮来发送消息.它成功发送一次,但是如果在某些线程退出之前再次单击按钮太快,则不会发送消息.

这可能是由Eventhandler引起的,还是接收方发生的任何处理?我BeginReceive在处理消息之前尝试过调用,但它似乎没有什么区别.

如果有任何其他IPC方法需要更少的资源但不需要太多的实现,我绝对愿意接受建议!

.net c# msmq message-queue

5
推荐指数
0
解决办法
75
查看次数

如何使用消息队列构建多步骤过程?

假设我有一个具有这些限制的多步骤异步过程:

  1. 任何工人都可以执行各个步骤
  2. 步骤必须按顺序执行

我正在考虑的方法:

  1. 插入表示整个过程的数据库行,并显示"已完成步骤"列以跟踪进度.
  2. 订阅将在整个过程完成后收到消息的队列.
  3. 完成每个步骤后,更新db行并排队该过程的下一步.
  4. 完成最后一步后,排队"进程完成"消息.
  5. 删除db行.

思考?陷阱?更聪明的方法吗?

asynchronous message-queue amqp rabbitmq

5
推荐指数
1
解决办法
1834
查看次数

JMS主题与队列 - 意图

我试图了解使用Queue的用例.

我的理解:队列意味着一对一.唯一的用例(如果不罕见,很少)将是:消息仅用于一次消费.

但即使在这些情况下,我也可能想要使用Topic(只是为了将来安全).唯一需要特别注意的是使订阅持久.或者,在特殊情况下,我会使用桥接/调度机制.

鉴于上述情况,我总是(或在大多数情况下)想要发布主题.订阅者可以是持久主题或分派队列.

请让我知道我在这里缺少什么,或者我错过了原来的意图?

java jms message-queue publish-subscribe jms-topic

5
推荐指数
1
解决办法
5143
查看次数

将消息发布到先前未显示的帧后,应用程序挂起

我有PageControl两个TabSheets.在他们每个人都有一个Frame,让我们称之为Frame2.我有一个后台线程,Frame2它在完成任务时发布消息.的Frame2是第二TabSheet,所以当用户启动应用程序是不可见的.

问题是我的应用程序在线程发布消息时停止刷新其内容Frame2,但仅限于Frame2之前未显示过的情况.这使我认为该消息队列Frame2尚未初始化,并且Frame2在第一次显示在屏幕上时会初始化.我猜对了吗?

有人可以给我提示如何在构建之后Frame2立即初始化消息队列,以便它可以立即收听消息吗?

delphi multithreading message-queue delphi-2009

5
推荐指数
1
解决办法
161
查看次数

SQS队列中的确认消息

我正在将Amazon SQS与带有Java EE 7的Amazon SQS-JMS Java库一起使用。我想要实现的是在收到一条消息之后,根据应用程序的业务逻辑,是确认(使用)消息还是再次将其重新发送到队列,然后重试3次失败后,将其移至DLQ。

我虽然要在JMS中使用CLIENT_Acknowledge模式,并且只确认已成功处理的消息,但这来自其官方文档:

在这种模式下,当确认一条消息时,在此消息之前收到的所有消息也会被隐式确认。例如,如果接收到10条消息,并且仅确认了第10条消息(按照接收消息的顺序),则前面的9条消息也全部被确认。

这个示例似乎也证实了这一点:http : //docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/code-examples.html#example-synchronous-receiver-client-acknowledge-mode。

对我来说,这是一种奇怪的行为,与我对client_acknowledge的期望相反。除了根据过程状态手动将整个代码中的消息手动发送到主SQS队列或DLQ之外,还有一种更优雅的解决方案吗?

java jms message-queue amazon-sqs amazon-web-services

5
推荐指数
1
解决办法
2476
查看次数