17.10.2012, 15:24 | #1 |
Участник
|
«Метка» для сообщения AIF MSMQ в Dynamics AX 2009
Работаю со стандартными средствами AIF через MSMQ. Сообщения нормально отправляются, приходят. Но у этих сообщений в окне MSMQ поле «Метка» пустое.
Может, кто знает, как задать метку? Попутно ещё вопрос. В документации везде сказано, что MSMQ необходимо установить на комп с AOS’ом. Но, похоже, что это не так. Какой путь в поле «Адрес» в Каналах указать, туда сообщение очереди и уходит. И это нормально работает. Чем вызвано требование использовать MSMQ только на компе с AOS’ом? Последний раз редактировалось LRA; 17.10.2012 в 16:51. |
|
17.10.2012, 15:29 | #2 |
Участник
|
Для тестирования использую следующий код.
Для тестирования использую следующий код. В теле сообщения произвольный текст, а не XML, но это прокатывает.
X++: AifChannelId channelId = "myTstChannelOut"; // TODO необходимо задать код канала с формы Каналы AifChannel channel = AifChannel::find(channelId); AifAdapter adapter = AifAdapter::find(channel.AdapterClassId); AifInfoLog aifInfoLog = new AifInfoLog(); AifMessageId messageId = newguid(); UserID userID = curuserid(); SysDictClass adapterClassObject; AifMSMQSendAdapter sendAdapter; AifResourceLockId channelLockId; boolean inAdapterTransaction = false; AifGatewayMessage gatewayMessage; AifMessage message; AIfresourceLock resourceLock; AifIntegrationAdapter integrationAdapter; ; // delete_from resourceLock; channelLockId = AifResourceLock::lockResource(channelId, AifResourceType::Channel, AifResourceLockType::Gateway); if (guid2str(channelLockId) != #EmptyGuidString) { try { aifInfoLog.reset(); adapterClassObject = new SysDictClass(channel.AdapterClassId); if (adapterClassObject.isImplementing(classnum(AifIntegrationAdapter))) { integrationAdapter = adapterClassObject.makeObject(); sendAdapter = new AifMSMQSendAdapter(); if (sendAdapter == null) throw error(strfmt("@SYS95140", classId2Name(classidget(integrationAdapter)))); } // new InteropPermission(InteropKind::ClrInterop).assert(); // TODO Раскоментарить если выполняется на сервере sendAdapter.initialize(channel.TransportAddress, channelId); ttsbegin; sendAdapter.begin(); inAdapterTransaction = true; gatewayMessage = new AifGatewayMessage( 'Привет мир!', enum2str(AifGlobalSettings::getEncodingFormat()), userID, messageId); // Send message sendAdapter.sendMessage(gatewayMessage); // Update messageLog message as Processed if (AifMessageManager::isNewMessage(gatewayMessage.parmMessageId()) == false) { message = AifMessageManager::read(gatewayMessage.parmMessageId()); message.status(AifMessageStatus::Processed); AifMessageManager::update(message, classstr(AifGatewaySendService), false); } // Commit transaction sendAdapter.commit(); ttscommit; CodeAccessPermission::revertAssert(); } catch(Exception::CLRError) { AifResourceLock::releaseResource(channelLockId); throw error(AifUtil::getClrErrorMessage()); } } sendAdapter.terminate(); AifResourceLock::releaseResource(channelLockId); info(strFmt("Готово! %1", messageId)); Последний раз редактировалось LRA; 17.10.2012 в 15:32. |
|
17.10.2012, 15:58 | #3 |
Участник
|
По поводу System.Messaging
В Visual Studio когда пользуешься службой сообщений, необходимо отдельно подключать сборку System.Messaging. Под рукой DAX2009 сейчас нет, посмотрите есть ли в узле AOT References ссылка на System.Messaging |
|
|
За это сообщение автора поблагодарили: LRA (1). |
17.10.2012, 16:53 | #4 |
Участник
|
Извините, не в той аксапте смотрел. С этим все правильно. Если использовать System.Messaging, то проблем никаких, но хотелось бы максимально юзать стандартный функционал AIF'а.
Последний раз редактировалось LRA; 17.10.2012 в 16:56. |
|
Теги |
aif, label, msmq |
|
|