SAPфорум.RU
https://sapboard.ru/forum/

UDF для извлечения данных из служебной части сообщения
https://sapboard.ru/forum/viewtopic.php?f=70&t=64911
Страница 1 из 1

Автор:  sapman [ Пн, окт 25 2010, 11:10 ]
Заголовок сообщения:  UDF для извлечения данных из служебной части сообщения

хочу UDF, которая достанет мне имя пользователя в SAP, который осуществил вызов прокси.
Порывшись на sdn, я изобрел вот такой код:
Code:
public String getUser(Container container){
DynamicConfiguration conf = (DynamicConfiguration) container.getTransformationParameters().get(StreamTransformationConstants.DYNAMIC_CONFIGURATION);

DynamicConfigurationKey keyURL1 = DynamicConfigurationKey.create( "http://sap.com/xi/XI/Message/30", "User");
String ourUser = conf.get(keyURL1);
return ourUser;
}

но он мне возвращает null :(
Есть у кого какие мнения? может без udf можно юзера как-то достать? или код ошибочный?

Автор:  chumpa [ Пн, окт 25 2010, 11:23 ]
Заголовок сообщения:  Re: UDF для извлечения данных из служебной части сообщения

Что-то я такой записи в DC ни разу не видел.
Скорее всего не заполняется на стороне клиента прокси.
А в SXI_MONITOR оно видно? если да то грабли в коде если нет то надо EJB приделывать или что-то ещё придумывать.

И видно ли пользователя в трейсе?

Да, кстати, возможно Principal propagation в канале-сендере не включен.

Автор:  sapman [ Пн, окт 25 2010, 12:24 ]
Заголовок сообщения:  Re: UDF для извлечения данных из служебной части сообщения

в SXI_MONITOR оно вот так выглядит (нужен <SAP:User>):
Code:
<SAP:RunTime xmlns:SAP="http://sap.com/xi/XI/Message/30" xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/">
  <SAP:Date>20101021</SAP:Date>
  <SAP:Time>143854</SAP:Time>
  <SAP:Host>xida</SAP:Host>
  <SAP:SystemId>XID</SAP:SystemId>
  <SAP:SystemNr>00</SAP:SystemNr>
  <SAP:OS>Linux</SAP:OS>
  <SAP:DB>ORACLE</SAP:DB>
  <SAP:Language />
  <SAP:ProcStatus>012</SAP:ProcStatus>
  <SAP:AdapterStatus>000</SAP:AdapterStatus>
  <SAP:User>TESTUSER1</SAP:User>
  <SAP:TraceLevel>1</SAP:TraceLevel>
  <SAP:LogSeqNbr>000</SAP:LogSeqNbr>
  <SAP:RetryLogSeqNbr>000</SAP:RetryLogSeqNbr>
  <SAP:PipelineIdInternal>SAP_CENTRAL</SAP:PipelineIdInternal>
  <SAP:PipelineIdExternal>CENTRAL</SAP:PipelineIdExternal>
  <SAP:PipelineElementId>5DC3C53B4BB7B62DE10000000A1148F5</SAP:PipelineElementId>
  <SAP:PipelineStartElementId>5EC3C53B4BB7B62DE10000000A1148F5</SAP:PipelineStartElementId>
  <SAP:PipelineService>PLSRV_RECEIVER_MESSAGE_SPLIT</SAP:PipelineService>
  <SAP:QIdInternal>XBTOP___0000</SAP:QIdInternal>
  <SAP:CommitActor>X</SAP:CommitActor>
  <SAP:ParentId ChildNo="0" ChildTotal="0">4CB947A43E1369A9E1000000AC1F0242</SAP:ParentId>
  <SAP:SplitNumber>0</SAP:SplitNumber>
  <SAP:NumberOfRetries>0</SAP:NumberOfRetries>
  <SAP:NumberOfManualRetries>0</SAP:NumberOfManualRetries>
  <SAP:TypeOfEngine client="001">CENTRAL</SAP:TypeOfEngine>
  <SAP:PlsrvExceptionCode />
  <SAP:EOReferenceRuntime type="TID">AC1F022975A94CC0183E0157</SAP:EOReferenceRuntime>
  <SAP:EOReferenceInbound type="TID" />
  <SAP:EOReferenceOutbound type="TID" />
  <SAP:MessageSizePayload>1866</SAP:MessageSizePayload>
  <SAP:MessageSizeTotal>13603</SAP:MessageSizeTotal>
  <SAP:PayloadSizeRequest>1866</SAP:PayloadSizeRequest>
  <SAP:PayloadSizeRequestMap>0</SAP:PayloadSizeRequestMap>
  <SAP:PayloadSizeResponse>0</SAP:PayloadSizeResponse>
  <SAP:PayloadSizeResponseMap>0</SAP:PayloadSizeResponseMap>
  <SAP:Reorganization>INI</SAP:Reorganization>
  <SAP:AdapterInbound>IENGINE</SAP:AdapterInbound>
  <SAP:InterfaceAction>DEL</SAP:InterfaceAction>
  <SAP:RandomNumber>77</SAP:RandomNumber>
  <SAP:AckStatus>000</SAP:AckStatus>
  <SAP:SkipReceiverDetermination />
  <SAP:Serialize_Children>X</SAP:Serialize_Children>
  </SAP:RunTime>


Автор:  chumpa [ Пн, окт 25 2010, 12:31 ]
Заголовок сообщения:  Re: UDF для извлечения данных из служебной части сообщения

Это не то, нужна секция не SAP:RunTime а SAP:DynamicConfiguration

Как из RunTime вытаскивать данные в меппинге, я не знаю, хотя наверняка возможно. Но в штатном TransformationInput-классе сходу такого нет.

PS А вы пользователей не путаете случаем?

Автор:  sapman [ Пн, окт 25 2010, 12:39 ]
Заголовок сообщения:  Re: UDF для извлечения данных из служебной части сообщения

жаль...
пользователей не путаю, мне нужен тот, который работал в сап системе и своими действиями вызвал запуск прокси.
Хорошо, а того, под которым прокся законнектилась к XI можно как-то определить? Дело в том, что они в отправляющей сап системе и в ХИ совпадают, поэтому мне все равно, либо того, который был в сап, либо того, который в ХИ.... я так понял, в куске сообщения, что я привел, там как раз пользователь XI находится?

Автор:  sapman [ Пн, окт 25 2010, 12:43 ]
Заголовок сообщения:  Re: UDF для извлечения данных из служебной части сообщения

sapman написал(а):
жаль...
пользователей возможно и путаю, мне нужен тот, который работал в сап системе и своими действиями вызвал запуск прокси.
Хорошо, а того, под которым прокся законнектилась к XI можно как-то определить? Дело в том, что они в отправляющей сап системе и в ХИ совпадают, поэтому мне все равно, либо того, который был в сап, либо того, который в ХИ.... я так понял, в куске сообщения, что я привел, там как раз пользователь XI находится?

Автор:  chumpa [ Пн, окт 25 2010, 12:49 ]
Заголовок сообщения:  Re: UDF для извлечения данных из служебной части сообщения

Да, это локальный пользователь XI а не удалённый. Я и удивился как он может помочь, но раз они совпадают то на крайний случай.

Если нужен удалённый то надо, повторюсь, в сендер-канале в XI включить Principal Propagation и смотреть DC.
Попутно возможно этот PP придётся донастроить если им ни разу не пользовались.

Ну или -- в клиентском прокси заполнять самому.

Автор:  chumpa [ Пн, окт 25 2010, 12:54 ]
Заголовок сообщения:  Re: UDF для извлечения данных из служебной части сообщения

Возможно я немного пессимист но "определить в XI пользователя который своими действиями вызвал активацию прокси в системе ZZZ" без напильника не получится. "Другая" система которая через свой Local IE вызывает XI делает это под стандартным юзером в SM59. То есть нужно или руками SY-UNAME протаскивать либо настраивать PP.

Автор:  sapman [ Пн, окт 25 2010, 13:06 ]
Заголовок сообщения:  Re: UDF для извлечения данных из служебной части сообщения

Да, я немного напутал, дело в том, что у меня юзер который в sm59, настроен как current и соответственно какой в удаленной системе, такой и в XI коннектится (набор пользователей в XI и SAP системе совпадает). Соответственно мне надо получить имя пользователя в XI (<SAP:user> из RunTime).

Автор:  chumpa [ Пн, окт 25 2010, 13:44 ]
Заголовок сообщения:  Re: UDF для извлечения данных из служебной части сообщения

Мда...

Легальные документированные способы:
1. Через Adapter-Specific Message Attributes -- для Sender XI не катит
2. Через EJB -- для Sender XI не катит
других сходу не придумал. На http://help.sap.com/javadocs/pi/pi711sp03/index.html интерфейса к RunTime не увидел.

На http://forums.sdn.sap.com/thread.jspa?threadID=397111 люди предлагают использовать Plain HTTP Sender но там другая немного ситуация.

Быстрогрязные способы:
1. Зная MessageId и имея готовое соединение с БД средствами джавы в меппинге лезть в SAPSR3DB.BC_MSG (для джавы 7.1 и если бы сендером был не XI-адаптер) или в абаповском меппинге в SAPSR3.SXMSPMAST + где-то ещё (для XI-sender) найти по MessageId и PipelineId сообщение и из него выкусить
2. Найти BADI или новомодный Explicit enhancement, забыл как точно называется -- в общем найти в отладчике куда в IE приходит управление при вызове из прокси, найти первое удобное для вставки кода место и туда дописать

Автор:  chumpa [ Пн, окт 25 2010, 15:45 ]
Заголовок сообщения:  Re: UDF для извлечения данных из служебной части сообщения

Набросал пример, включил PP но чуда не вышло.
Может надо output-CONTROLLER как-то хитро заполнять, будет время -- подумаю.

Автор:  chumpa [ Вт, окт 26 2010, 08:01 ]
Заголовок сообщения:  Re: UDF для извлечения данных из служебной части сообщения

Думаю только АБАП-меппинг будет правильным решением задачи, скорее всего весь SAP:RunTime в нём легко находится в параметрах, и наоборот -- в джаве он принципиально отсутствует. Даже в джавашной схеме таких таблиц нету.

Автор:  chumpa [ Пт, мар 11 2011, 20:14 ]
Заголовок сообщения:  Re: UDF для извлечения данных из служебной части сообщения

Оживлю топик.

В синхронном запросе к куче сторонних БД (ну или веб-сервисов, неважно) возникло желание получать в ccBPM нормальный текст ошибки и запроса, который эту ошибку вызвал. В результате был написан меппинг, который находит цепочку сообщений и вытягивает SAP:Error и детали (sapman спрашивал про SAP:RunTime -- могу и такое легко). Вот что например он делает для отправки сообщения:

Code:
Произошла ошибка при выполнении запроса к базе данных

Текст запроса

<query>
<askRemains action="SQL_QUERY">
<access>select * from dual where zzz = 1</access>
</askRemains>
</query>
select * from dual where zzz = 1
Текст ошибки

<SAP:Error xmlns:SAP="http://sap.com/xi/XI/Message/30" xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/" SOAP:mustUnderstand="1">
<SAP:Category>XIAdapterFramework</SAP:Category>
<SAP:Code area="MESSAGE">GENERAL</SAP:Code>
<SAP:P1/>
<SAP:P2/>
<SAP:P3/>
<SAP:P4/>
<SAP:AdditionalText>com.sap.engine.interfaces.messaging.api.exception.MessagingException: Error processing request in sax parser: Error when executing statement for table/stored proc. 'askRemains' (structure 'query'): java.sql.SQLException: ORA-00904: "ZZZ": invalid identifier</SAP:AdditionalText>
<SAP:Stack/>
<SAP:Retry>M</SAP:Retry>
</SAP:Error>


Это не алерты. Алерты совсем по-другому работают.
Это больше похоже на меппинг из Fault Message Type и Request в Response (но такой функциональности в XI нет к сожалению, да и для многих типов ошибок и адаптеров FMT недоступен).

Автор:  molochko_mf [ Сб, мар 12 2011, 20:38 ]
Заголовок сообщения:  Re: UDF для извлечения данных из служебной части сообщения

Интересно, такая задача возникала буквально вчера, пока отложил.
Куда копать UDF с
chumpa написал:
Мда...
Быстрогрязные способы:
1. Зная MessageId и имея готовое соединение с БД средствами джавы в меппинге лезть в SAPSR3DB.BC_MSG (для джавы 7.1 и если бы сендером был не XI-адаптер) или в абаповском меппинге в SAPSR3.SXMSPMAST + где-то ещё (для XI-sender) найти по MessageId и PipelineId сообщение и из него выкусить
2. Найти BADI или новомодный Explicit enhancement, забыл как точно называется -- в общем найти в отладчике куда в IE приходит управление при вызове из прокси, найти первое удобное для вставки кода место и туда дописать

или Java Mapping?

Автор:  chumpa [ Вс, мар 13 2011, 12:49 ]
Заголовок сообщения:  Re: UDF для извлечения данных из служебной части сообщения

собственно UDF -- мимо кассы
только RFC lookup с Z-модулем или лучше всё-таки абап-меппинг в OM

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/