powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Message Broker
25 сообщений из 28, страница 1 из 2
Message Broker
    #36601525
Tyo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще вот такой вопрос по Мессидж Брокеру от новичка: У меня на входе есть хмл-сообщение, в котором множество одноименных узлов. Мне нужно сделать из этого сообщения несколько последовательных собщений, по одному сообщению на каждый узел. Каким нодом Мессидж Брокера воспользоваться?
Наверняка можно реализовать это вручную через Compute или JavaCompute. Но нет ли чего-то уже готового, чтобы можно было "одним движением руки"?

Заранее спасибо.
...
Рейтинг: 0 / 0
Message Broker
    #36601675
BRK01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так просто не получится, хотя, можете воспользоваться дополнительным продуктом WebSphere Transformation Extender.

Могу посоветовать воспользоваться Compute Node. Для выборки из одноименных элементов следует использовать конструкции SELECT.
Для того, чтобы сообщение не терялось при первом же propagate, следует в цикле писать PROPAGATE DELETE NONE.
...
Рейтинг: 0 / 0
Message Broker
    #36601676
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в 6.2 не было, доки я все прочитал

в 7 не знаю
...
Рейтинг: 0 / 0
Message Broker
    #36601685
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BRK01Так просто не получится, хотя, можете воспользоваться дополнительным продуктом WebSphere Transformation Extender.

Могу посоветовать воспользоваться Compute Node. Для выборки из одноименных элементов следует использовать конструкции SELECT.
Для того, чтобы сообщение не терялось при первом же propagate, следует в цикле писать PROPAGATE DELETE NONE.

да не, там вот так, вот цикл while это выборка однотиных элементов, это я развлекался

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
	CREATE PROCEDURE CopyMessageToDatabase() BEGIN
		DECLARE msg REFERENCE TO InputRoot.XMLNSC.message;
		DECLARE size INTEGER;
		DECLARE x INTEGER;

		DECLARE SQLState1 CHARACTER;
		DECLARE SQLErrorText1 CHARACTER;
		DECLARE SQLCode1 INTEGER;
		DECLARE SQLNativeError1 INTEGER;

		SET OutputRoot = InputRoot;
		SET size = CARDINALITY(InputRoot.XMLNSC.message."person"[]);

		SET x =  1 ;
		WHILE x <= size
			DO
			INSERT INTO Database.PEOPLE.PEOPLE(ID, NAME, MIDDLE_NAME, FAMILY_NAME, PHONE_NUMBER, ADDRESS)
			VALUES(
			msg.person[x].id,
			msg.person[x].name,
			msg.person[x].middle_name,
			msg.person[x].family_name,
			msg.person[x].phone_number,
			msg.person[x].address
			);

			SET SQLCode1 = SQLCODE;
			SET SQLState1 = SQLSTATE;
			SET SQLNativeError1 = SQLNATIVEERROR;
			SET SQLErrorText1 = SQLERRORTEXT;

			IF - 803  = SQLNativeError1 THEN -- I like DB2 error codes
				-- Update existing row in the table
				UPDATE Database.PEOPLE.PEOPLE AS T
				SET
				NAME = msg.person[x].name,
				MIDDLE_NAME = msg.person[x].middle_name,
				FAMILY_NAME = msg.person[x].family_name,
				PHONE_NUMBER = msg.person[x].phone_number,
				ADDRESS = msg.person[x].address
				WHERE
				T.ID = msg.person[x].id
				;
			END IF;

			SET SQLCode1 = SQLCODE;
			SET SQLState1 = SQLSTATE;
			SET SQLNativeError1 = SQLNATIVEERROR;
			SET SQLErrorText1 = SQLERRORTEXT;

			IF  0  <> SQLNativeError1 THEN
				SET SQLState1 = SQLSTATE;
				SET SQLErrorText1 = SQLERRORTEXT;
				SET SQLNativeError1 = SQLNATIVEERROR;
				LOG EVENT MESSAGE  2950  VALUES('The SQL State' , SQLState1 , SQLCode1 , SQLNativeError1 , SQLErrorText1);
				THROW USER EXCEPTION MESSAGE  2950  VALUES('The SQL State' , SQLState1 , SQLCode1 , SQLNativeError1 , SQLErrorText1);
			END IF;

			SET x = x +  1 ;
		END WHILE;
	END;

...
Рейтинг: 0 / 0
Message Broker
    #36601693
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
толко тут каждый узел xml сообщения вставляется в базу
...
Рейтинг: 0 / 0
Message Broker
    #36602063
Tyo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новый Годтолко тут каждый узел xml сообщения вставляется в базу

Всем спасибо, Особенно Новому Году :).
Раз легкого пути нет, сделаю на Джава Компьют, потому шта ESQL пока не заню, а надо быстро (как всегда).
...
Рейтинг: 0 / 0
Message Broker
    #36602129
Tyo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот кстати в связи с ДжаваКомпьютом возник еще вопрос: в какой файл при работе Message Borker'а пишется результат из system.out.println()?
...
Рейтинг: 0 / 0
Message Broker
    #36602264
BRK01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Tyo,

100%-но не подскажу. Там нужно ловить эти сообщения в Java Console. Для этого нужны дополнительные действия в зависимости от операционки.
Лучше используйте класс MbService для записи соообщений в стандартный лог. http://publib.boulder.ibm.com/infocenter/wmbhelp/v6r1m0/topic/com.ibm.etools.mft.plugin.doc/com/ibm/broker/plugin/MbService.html
...
Рейтинг: 0 / 0
Message Broker
    #36602471
Tyo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот спасибо. А то я уже извратился, вызываю батник через процесс, передаю ему текст через параметр, и батником пишу в свой собственный лог. Правой рукой левое ухо.
...
Рейтинг: 0 / 0
Message Broker
    #36602488
Tyo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗЫ. Правильно я понимаю, что стандартный лог -- это в винде то что видно через
МойКомпьютер -> Просмотр событий -> Приложение?
...
Рейтинг: 0 / 0
Message Broker
    #36602758
Фотография Vincent Vega
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tyo,

На AIX вот сюда пишет:
/var/mqsi/components/WBRK/6eb0cad6-2601-0000-0080-f748ae29e09c/
WBRK - имя брокера
6eb0cad6-2601-0000-0080-f748ae29e09c - группа исполнения
внутри 2 файла: stdout и stderr
...
Рейтинг: 0 / 0
Message Broker
    #36603084
Tyo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vincent VegaTyo,

На AIX вот сюда пишет:
/var/mqsi/components/WBRK/6eb0cad6-2601-0000-0080-f748ae29e09c/
WBRK - имя брокера
6eb0cad6-2601-0000-0080-f748ae29e09c - группа исполнения
внутри 2 файла: stdout и stderr

Не уверен в полезности этого знания для меня, у меня тривиальная винда ХР.
...
Рейтинг: 0 / 0
Message Broker
    #36603265
Tyo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот следующая беда, уж извините за назойливость.
Из JavaCompute пытаюсь достучаться до БД Оракл:

1. Через mqsi настроил Configurable Service "SIMPLERROUTEDB" и задал оракловый логин/пароль для securityIdentity "mySecurityIdentity". Результат вот такой:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
JDBCProviders
  SIMPLERROUTEDB
    connectionUrlFormat='jdbc:oracle:thin:[user]/[password]@[serverName]:[portNumber]:[connectionUrlFormatAttr1]'
    connectionUrlFormatAttr1='MARGE'
    connectionUrlFormatAttr2=''
    connectionUrlFormatAttr3=''
    connectionUrlFormatAttr4=''
    connectionUrlFormatAttr5=''
    databaseName='default_Database_Name'
    databaseType='default_Database_Type'
    databaseVersion='default_Database_Version'
    description='Simplified Database Routing Sample Database'
    environmentParms='default_none'
    jarsURL='C:\oracle\ora92\jdbc\lib'
    portNumber='1521'
    securityIdentity='mySecurityIdentity'
    serverName='10.73.24.203'
    type4DatasourceClassName='oracle.jdbc.xa.client.OracleXADataSource'
    type4DriverClassName='oracle.jdbc.OracleDriver'

2. Пытаюсь связаться с БД, и в выделенной строке получаю object=null. Правильно я понимаю, что она почему-то не находит это ConfigurableService по имени?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
try {
 logMe("TRY");
 Object object = getUserDefinedAttribute("SIMPLERROUTEDB"); // <<<=== Error Here
 if (object==null) logMe("ERROR! NULL OBJECT");  
 String jdbcConnection = object.toString();
 Connection connection = 
     getJDBCType4Connection(jdbcConnection,JDBC_TransactionType.MB_TRANSACTION_AUTO);
  Statement statement = connection.createStatement();....

Подскажите плз, что не так?
ЗЫ. Сами ConfigurableService и SecurityIdentity, судя по всему, настроены верно. Для проверки я сделал узлы DatabaseRetrieve и DatabaseRoute c простенькой логикой, указал им Data Source Name = SIMPLERROUTEDB -- все работает.
...
Рейтинг: 0 / 0
Message Broker
    #36603418
Tyo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все, виноват, сам разобрался.
Слишком буквально воспринял код Винсента Веги на этом же форуме, где он коннектится с использованием user-defined attributes. :)
...
Рейтинг: 0 / 0
Message Broker
    #36604105
Фотография Vincent Vega
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TyoVincent VegaTyo,

На AIX вот сюда пишет:
/var/mqsi/components/WBRK/6eb0cad6-2601-0000-0080-f748ae29e09c/
WBRK - имя брокера
6eb0cad6-2601-0000-0080-f748ae29e09c - группа исполнения
внутри 2 файла: stdout и stderr

Не уверен в полезности этого знания для меня, у меня тривиальная винда ХР.

Не важно, папка с именем брокера на ней тоже должны быть.
Вот например как путь выглядит на винде:
C:\Documents and Settings\All Users\Application Data\IBM\MQSI\components\MB7BROKER\03895104-2601-0000-0080-da25f7b09f96
...
Рейтинг: 0 / 0
Message Broker
    #36605232
Tyo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо.
Тем временем я не стою на месте ( :) ), и по ходу дела возник следующий вопрос:
Как заставить узел FileInput коректно взаимодействовать с файлом, который пишется опрашиваемую в директорию медленно (например, с удаленного ресурса)? То есть ситуация следующая: часть файла уже записалась в директорию опроса, в этот момент у узла FileInput кончился таймаут поллинга, он очнулся, схватил пол-файла и поместил его в очередь. Ессно, ничего хорошего.
Есть ли у FileInput какое-то штатные средства предварительно проверять -- дошла ли запись файла до конца? Или надо что-то придумывать самому?
...
Рейтинг: 0 / 0
Message Broker
    #36605397
BRK01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Данная нода проверяет файлы на лок, если файл занят другим процессом - файл игнорируется. Но есть разные "но", н разных операционках и разные приложения ставят лок по-разному. Советую проверить ;-)

Подробнее тут
...
Рейтинг: 0 / 0
Message Broker
    #36605465
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а чтобы не париться в блокировкой файла, в филе инпут ноде проще поставить маску файла,

а тот кто этот файл кладет в директорию, пусть его сначала положит с каким-нибудь безумным именем, а затем переименует так, чтобы этот файл соответствовал маске
...
Рейтинг: 0 / 0
Message Broker
    #36605865
Tyo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новый Года чтобы не париться в блокировкой файла, в филе инпут ноде проще поставить маску файла,

а тот кто этот файл кладет в директорию, пусть его сначала положит с каким-нибудь безумным именем, а затем переименует так, чтобы этот файл соответствовал маске

Так и сделаю. Придумать безумное имя для нас -- пара пустяков.
...
Рейтинг: 0 / 0
Message Broker
    #36610302
Tyo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще один вопрос возник. Если я в ноде JavaCompute делаю апдейт в БД, то как и когда происходит коммит? Согласно документации, писать коммит руками в Java-коде узла JavaCompute нельзя. Это понятно. Тогда я по наивности сделал вот так, надеясь, что коммит произойдет автоматически при закрытии соединения:

Код: plaintext
1.
2.
3.
4.
5.
6.
Connection connection = 
  getJDBCType4Connection(jdbcConnection,JDBC_TransactionType.MB_TRANSACTION_AUTO);
Statement statement =connection.createStatement();
query = "update CLIENT set CL_LAST_POLL=sysdate where CL_ID="+client.getId();
statement.execute(query);
statement.close();
connection.close();

Однако тут другая засада: мой workflow построен так, что нод JavaCompute работает циклически, получая по таймауту сообщения от нода TimeoutNotification. Так вот приведенный код срабатывает нормально только один раз, а уже при втором входе на строчке получения connection'а выдает:

Код: plaintext
java.sql.SQLException: Локальный указатель более не действителен

А если никаких действий по коммиту не предпринимать, то такое впечатление что транзакция длится вечно (пока не остановить workflow). По крайней мере, измененная запись продолжает оставаться залоченной.

Как бы с этим справиться?
Заранее спасибо.
...
Рейтинг: 0 / 0
Message Broker
    #36610412
BRK01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На сколько я помню, соединение тоже закрывать нельзя. Соединение закрывает брокер при завершении обработки потока. И соединение выдает вам опять же брокер, готовое соединение.
Коммит происходит скорее всего при завершении обработки потока, чтобы была возможность откатить на любом участке потока.
...
Рейтинг: 0 / 0
Message Broker
    #36610772
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а можно как-нибудь посмотреть, что за процесс (имя ексешника) держить транзакцию

т.е. кто там координатор, т.е выполняет протокол двухфазной фиксации, message broker или queue manager?

если queue manager, то наверно получится всех обмануть и сделать коммит.
если message broker то не знаю
...
Рейтинг: 0 / 0
Message Broker
    #36610881
Tyo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот эта строчка -- она не говорит прямо, что в транзакции дб автокоммит?

Код: plaintext
1.
Connection connection = 
  getJDBCType4Connection(jdbcConnection,JDBC_TransactionType.MB_TRANSACTION_AUTO);

Правда, опять-таки непонятно, какой момент она считает окончанием транзакции.
Явно не
Код: plaintext
statement.execute(query)
(иначе бы доступ к записи не блокировался)
...
Рейтинг: 0 / 0
Message Broker
    #36610913
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кароче читаем

http://publib.boulder.ibm.com/infocenter/wmbhelp/v6r1m0/index.jsp?topic=/com.ibm.etools.mft.doc/ac30494_.htm


Код: plaintext
1.
If the broker is running on a distributed system, you can configure the databases and the connections to be coordinated with other resource activity.  Global coordination on distributed systems is provided by WebSphere® MQ,  and can include interactions with local or remote databases, including remote databases that are defined on z/OS systems. If you establish a JDBC type 4 connection to a database from a broker that is running on z/OS, coordination is not provided. For information about setting up connections and coordination, see Enabling JDBC connections to the databases.


вот еще

http://publib.boulder.ibm.com/infocenter/wmbhelp/v6r1m0/index.jsp?topic=/com.ibm.etools.mft.doc/ah61330_.htm


раз там такая бодяга, то вот такой псевдокод:


1 MQCONN, точнее его java аналог, без всяких там фактори, жестко конкретно к queue manager, с опцией какой-то чтобы был thread safe
2 MQCMIT
3 MQBEGIN


сойдёт за коммит
...
Рейтинг: 0 / 0
Message Broker
    #36610961
Tyo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новый Года можно как-нибудь посмотреть, что за процесс (имя ексешника) держить транзакцию

Оракл говорит, что "JDBC Thin client". Подозреваю, что речь идет о брокере.
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Message Broker
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]