在Java世界中,消息队列还有一些选择,但在.Net中,只有少数几个.在评估使用哪一个时,应该寻找哪些特征?构成可靠消息排队系统的基本概念是什么?
我有一个后台线程来处理与外部服务的通信.每次后台线程收到消息时,我都想将其传递给UI线程进行进一步处理(显示给用户).
目前我已经创建了一个线程安全的消息队列,它在Timer.Tick中定期汇集并填充后台线程.但这种解决方案是次优的.
你知道如何使用消息泵将事件从后台线程传递到ui线程吗?
我正在使用 IPC 队列进行进程同步。
从 IPC 队列发送接收消息时,我总是收到 EIDRM 错误,但我可以看到队列与 ipcs 一起存在。
我已经搜索了 2 个小时,但我看不到错误。
下面的代码是一个精简的版本,它给了我同样的错误。
#define CLAVE 53543961
#define TAM_BUFFER 1024
#define PERMISOS 0777
#define DEBUG
int Cola_Mensages;
int msgqid;
typedef struct {
long mtype;
char mtext[TAM_BUFFER];
}msgbuf;
int main (int argc, char *argv[]){
msgbuf msg_ipc;
int num_cli,i, i_aux;
if(argc == 2){
num_cli = atoi(argv[1]);
}else{
num_cli = 1;
}
//Creating the queue
if(msgqid = msgget(CLAVE,PERMISOS|IPC_CREAT)<0){
fprintf(stderr,"Problema al crear la cola de mensages IPC\n");
exit(0);
}
if(msgqid < 0){
fprintf(stderr,"Problema al …Run Code Online (Sandbox Code Playgroud) 以前没有使用过MSMQ,我根本不清楚使用它的客户端环境要求.
我正在设计一个客户端/服务器解决方案,它将与遗留系统集成,而且我会通过消息传递出售.我想使用像MassTransit这样的服务总线实现,但这需要MSMQ.
我是否必须确保每台客户端PC都安装了MSMQ?
我不认为我向管理员密码管理员销售此产品的前景非常好.
现在我可以可靠地期望每台客户机都安装了Windows XP Professional,但这可能会改变,我的理解是默认情况下不会在更新的操作系统上安装MSMQ,这将是一个更大的麻烦.
任何人都可以为我阐明这是如何工作的吗?我无法想象任何商业软件如何依赖MSMQ,除非我遗漏了一些重要的东西(我希望我是).
(服务器不是问题 - 我完全可以控制它.)
仅游戏循环使用50%的CPU使用率,我还没有完成任何渲染工作.我在这做什么?
while(true)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if(msg.message == WM_QUIT ||
msg.message == WM_CLOSE ||
msg.message == WM_DESTROY)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
//Run game code, break out of loop when the game is over
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,我正在编写,需要在后台执行长计算,所以我基本上有以下工作流程:
计算服务器还提供有关工作状态的实时反馈,以便客户端可以观察进度.
我现在遇到的主要问题是弄清楚如何为队列中提交的消息获取唯一的作业ID,以及在服务器为消息提供服务的事实之后弄清楚.一旦最初提交作业(步骤1),客户端应该接收识别作业的唯一令牌.然后,客户端应该能够定期轮询调度程序服务器,以检查令牌的状态是否已经启动.
在计算服务器为请求提供服务之后,客户端应该在轮询调用中获取编码器服务器的DNS地址或IP地址.
我怎样才能做到这一点?消息队列是否为队列中的每条消息提供了唯一标识令牌的概念?
根据消息的相应JMS ID选择消息的正确语法是什么?
目前,我使用:
String selector = "JMSMessageID='ID:305:1:5:1:1'";
messageConsumer = session.createConsumer(getRetryQueue(), selector);
Run Code Online (Sandbox Code Playgroud)
上面的语法可以在模拟代理中进行测试。但是,对于ActiveMQ,不会轮询消息。
原始代码:
@Override
public Message readMessageFromRetryQueueByJmsId(String jmsId) throws QueueingException {
Connection connection = null;
Session session = null;
MessageConsumer messageConsumer = null;
Message message = null;
try {
connection = getConnectionFactory().createConnection();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
messageConsumer = session.createConsumer(getRetryQueue(), "JMSMessageID='"+jmsId+"'");
message = messageConsumer.receiveNoWait();
} catch (JMSException e) {
throw new QueueingException("Failed to read message from MessageConsumer.");
} finally {
try { messageConsumer.close(); } catch (Exception e) { /* NOP */ …Run Code Online (Sandbox Code Playgroud) 我尝试构建持久消息队列,每条消息有一些延迟.在Java代码中,它看起来像这样:
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.exchangeDeclare("WorkExchange", "direct");
channel.queueDeclare("WorkQueue", true, false, false, null);
channel.queueBind("WorkQueue", "WorkExchange", "");
Map<String, Object> args = new HashMap<>();
args.put("x-dead-letter-exchange", "WorkExchange");
channel.exchangeDeclare("RetryExchange", "direct");
channel.queueDeclare("RetryQueue", true, false, false, args);
channel.queueBind("RetryQueue", "RetryExchange", "");
channel.confirmSelect();
BasicProperties properties = new BasicProperties();
properties.setDeliveryMode(2);
properties.setExpiration("120000");
channel.basicPublish("RetryExchange", "", properties, "Hello world!".getBytes());
channel.waitForConfirmsOrDie();
connection.close();
Run Code Online (Sandbox Code Playgroud)
但是,我有一些持久性问题.当我停止服务器时,等待一段时间再次启动它,必须移动到WorkQueue的消息才会消失.我做错了什么?或者它是设计的?
我正在创建一个用于测试不同RabbitMQ客户端之间的性能的应用程序。
其中之一应该是SQL Server。
我发现存在用于SQL Server集成服务(SSIS)的RabbitMQ组件。
但是似乎尚未编写可以向交换机发送消息的目标组件。
任何想法如何执行?
将消息发布到MSMQ是否应该与之相似?
SWI-Prolog 宣称自己是LAMP堆栈的单一语言替代品.在更换M(ySQL)时,文档列举了几种方法,其中library(persistency)似乎是最简单的方法,能够提供持久的,可更新的数据库.
该文档library(persistency)提供了以下示例,该示例演示了如何在从数据库读取和更新数据时使用互斥锁来避免无效状态:
:- module(user_db,
[ attach_user_db/1, % +File
current_user_role/2, % ?User, ?Role
add_user/2, % +User, +Role
set_user_role/2 % +User, +Role
]).
:- use_module(library(persistency)).
:- persistent
user_role(name:atom, role:oneof([user,administrator])).
attach_user_db(File) :-
db_attach(File, []).
%% current_user_role(+Name, -Role) is semidet.
current_user_role(Name, Role) :-
with_mutex(user_db, user_role(Name, Role)).
add_user(Name, Role) :-
assert_user_role(Name, Role).
set_user_role(Name, Role) :-
user_role(Name, Role), !.
set_user_role(Name, Role) :-
with_mutex(user_db,
( retractall_user_role(Name, _),
assert_user_role(Name, Role))).
Run Code Online (Sandbox Code Playgroud)
但是,在有关线程同步的文档中mutex,它指出了这一点
谓词的
with_mutex/2 …
message-queue ×10
java ×3
rabbitmq ×3
.net ×2
messaging ×2
c ×1
c# ×1
easynetq ×1
game-loop ×1
ipc ×1
jms ×1
masstransit ×1
msmq ×1
persistence ×1
prolog ×1
sql-server ×1
swi-prolog ×1
winapi ×1