[英]Reading/Writing a websphere queue from an Async method
我有一个异步方法,该方法只负责连接到队列并从队列中读取。 在尝试读取时,我从WebSphere dll'amqmdnet.dll'中得到一个错误,提示“线程正在中止”。 每当我尝试以任何方式修改队列,并且仅当我尝试从异步方法进行修改时,都会出现此错误。 我也曾尝试实现IBM.XMS.net dll,因为据说它用于异步消息传递,尽管我遇到了同样的错误。 是否可以从异步方法内部读取队列? 如果是这样,那么在修改队列本身时,同步和异步的读/写实现是否有所不同? 我可以很好地连接到队列管理器,它可以修改给我带来问题的队列。
主要:
private async Task ReadAsync()
{
await MqMessanger.ConnectAsync(); // connects fine
await MqMessanger.StartReadingAsync(); // errors out
}
MqMessanger:(IBM.XMS.net dll)
private XMSFactoryFactory factoryFactory; //used for connection
private IConnectionFactory cf; //used for connection
private ISession sessionWMQ;
private IDestination destination;
private IMessageConsumer consumerAsync;
private MessageListener messageListener;
public IConnection QueueManager { get; set; }
//QueueManager has been connected prior to this
private void StartReadingAsync()
{
try
{
//Creates a session where an Ack is sent to the server to delete the message as soon the message is received.
sessionWMQ = QueueManager.CreateSession(false, AcknowledgeMode.AutoAcknowledge);
destination = sessionWMQ.CreateQueue(queueName);
// Create consumer object to read messages from the queue
consumerAsync = sessionWMQ.CreateConsumer(destination);
// Create a message listener to fire when a message is put on the queue and assign it to consumer
messageListener = new MessageListener(OnMessageCallback);
consumerAsync.MessageListener = messageListener;
}
catch (Exception ex)
{
throw new Exception($"Error reading from '{destination.Name}'.", ex);
}
}
MqMessanger:(amqmdnet dll)
//QueueManager has been connected prior to this
private void StartReadingAsync()
{
try
{
queue = queueManager.AccessQueue(queueName, MQC.MQOO_INPUT_AS_Q_DEF + MQC.MQOO_FAIL_IF_QUIESCING);
queueMessage = new MQMessage();
queueMessage.Format = MQC.MQFMT_STRING;
queueGetMessageOptions = new MQGetMessageOptions();
queue.Get(queueMessage, queueGetMessageOptions);
string message = queueMessage.ReadString(queueMessage.MessageLength);
//Do something with this message
}
catch (Exception ex)
{
throw new Exception($"Error reading from '{destination.Name}'.", ex);
}
我认为IBM MQ的异步消息传递模式与.NET Framework的异步编程概念之间存在一些混淆。
IBM MQ通过排队以异步方式启用应用程序到应用程序的连接。 在典型的客户端-服务器模式中,客户端和服务器应用程序都需要始终启动并运行以进行数据交换。 这是同步模式。 在异步模式, 不需要客户端应用程序和服务器应用程序中始终处于运行状态。 客户端可以向MQ发送一条消息,然后消失。 该消息将驻留在MQ队列中。 如果服务器应用程序正在运行,则该消息将传递到服务器应用程序。 服务器将处理该消息,并将回复消息放入MQ队列中,然后消失。 客户端应用程序可以在一段时间后返回并读取回复消息。 如您所见,客户端和服务器应用程序不是同时存在的,但是它们仍然能够通过MQ以异步方式进行通信。
我不是较新的.NET Framework概念的专家。 .NET Framework中的async
编程概念用于卸载CPU可以独立执行的短任务,而不会阻塞线程。 例如,当主线程忙于显示网页的内容时,可以将连接数据库的工作转移到.NET任务中,以便用户能够与网页进行交互。
IBM MQ .NET(amqmdnet和XMS)使用多个线程与队列管理器进行通信。 当涉及多个线程时,我不确定“异步”编程技术是否合适。 这可能是“线程被中止”错误的原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.