powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / WAS 7, не работает MDB
9 сообщений из 9, страница 1 из 1
WAS 7, не работает MDB
    #37885656
z0z0iberg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго всем.

WebSphere App Server v 7.0

Создаю очередь, создаю activation spec. Деплою MDB, попутно в настройках указывая activation spec, которая смотрит на очередь.
MDB успешно стартует, в логе появляются записи вида INSTANCE CREATED. Но, когда начинаю кидать в очередь сообщения, MDB никак на них не реагирует :(
В SystemOut.log никакого намёка на то, из-за чего это может происходить. Судя по состоянию, сообщения в очереди постоянно лочатся/анлочатся. Никакие другие MDB не используют эту очередь, в настройках очереди разрешены чтение/запись.

MDB имеет следующий вид (транзакционность CMP):
Код: java
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.
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.Message;
import javax.jms.MessageListener;

import org.slf4j.LoggerFactory;
import org.slf4j.Logger;

@MessageDriven(
		activationConfig = { @ActivationConfigProperty(
				propertyName = "destinationType", propertyValue = "javax.jms.Queue"
		) }, 
		mappedName = "jms/TestMDB-TestQueue")
public class TestMDB implements MessageListener {
	private static final Logger log = LoggerFactory.getLogger(TestMiner.class);

    public TestTestMDB() {
    	log.info("INSTANCE CREATED (" + this + ")");
    }
	
    public void onMessage(Message message) {
    	log.info("ON MESSAGE (" + this + ") = " + message);
    }

}


Мб кто сталкивался?
...
Рейтинг: 0 / 0
WAS 7, не работает MDB
    #37890582
z0z0iberg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
up
...
Рейтинг: 0 / 0
WAS 7, не работает MDB
    #37893274
z0z0iberg,

1. Что прописано в Activation Spec ? Фильтр на выборку присутствует?

2. Проверить какой фикс установлен на сервер приложений. По возможности обновить до актуального фикса.
Для выдачи версии используется команда versionInfo (<Корневая папка профиля>\bin\versionInfo.bat (или sh, смотря какая платформа))
Recommended fixes for WebSphere Application Server

3. Какая система сообщений используется? SIB или WebSphere MQ или что-то еще? Если WebSphere MQ, то какой версии и с каким фиксом?

4. mappedName = "jms/TestMDB-TestQueue" - нежелательно в коде приложения прописывать привязку (binding). Рекомендую этот параметр убрать и сделать привязку стандартно (т.е. либо во время Deploy, либо через файл META-INF\ibm-ejb-jar-bnd.xml)

5. По логгеру. В случае SLF4J вместо
log.info("ON MESSAGE (" + this + ") = " + message);
правильнее так:
log.info("ON MESSAGE {} = {}",this,message);

В руководстве по SLF4J описано почему именно так. Это одна из фич, которая уменьшает задержки, если вывод записи в лог подавляется.
...
Рейтинг: 0 / 0
WAS 7, не работает MDB
    #37893598
z0z0iberg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Евгений Хабаровz0z0iberg,

1. Что прописано в Activation Spec ? Фильтр на выборку присутствует?

2. Проверить какой фикс установлен на сервер приложений. По возможности обновить до актуального фикса.
Для выдачи версии используется команда versionInfo (<Корневая папка профиля>\bin\versionInfo.bat (или sh, смотря какая платформа))
Recommended fixes for WebSphere Application Server

3. Какая система сообщений используется? SIB или WebSphere MQ или что-то еще? Если WebSphere MQ, то какой версии и с каким фиксом?

4. mappedName = "jms/TestMDB-TestQueue" - нежелательно в коде приложения прописывать привязку (binding). Рекомендую этот параметр убрать и сделать привязку стандартно (т.е. либо во время Deploy, либо через файл META-INF\ibm-ejb-jar-bnd.xml)

5. По логгеру. В случае SLF4J вместо
log.info("ON MESSAGE (" + this + ") = " + message);
правильнее так:
log.info("ON MESSAGE {} = {}",this,message);

В руководстве по SLF4J описано почему именно так. Это одна из фич, которая уменьшает задержки, если вывод записи в лог подавляется.

Спасибо за ответ.

По пунктам:
1.
Administration:
Name: TestMDB AS
JNDI name: jms/TestMDB-TestQueueActivationSpec
Destination:
Destination type: Queue
Destination JNDI name: jms/TestMDB-TestQueue
Message selector: пусто, пробовал JMSType='ObjectMessage' - не помогло
Bus name: SCA.APPLICATION.TestCell.Bus
Acknowledge mode: Auto-acknowledge
Target: пусто
Target type: Bus member name
Target significance: Preferred
Target inbound transport chain: пусто
Provider endpoints: пусто
Additional:
Maximum batch size: 1
Maximum concurrent MDB invocations per endpoint: 10
Automatically stop endpoints on repeated message failure: disabled
Subscription Durability:
Subscription durability: nondurable
Subscription name: пусто
Client identifier: пусто
Durable subscription home: testcluster.000-SCA.APPLICATION.TestCell.Bus
Pass message payload by reference:
"Applications using this Activation Specification to receive messages: - do not modify the data Object obtained from a JMS Object Message. The data Object is treated as read only. Read the help before selecting this option.": отмечен влажком
Advanced:
Share durable subscriptions: in cluster
Share data source with CMP: отмечен флажком
Read ahead: default
Always activate MDBs in all servers: отмечен флажком
Retry interval: 30 sec
Security settings:
Authentication alias: пробовал none, пробовал дефолтный SCA_Auth_Alias, без разницы

2. фиксы вроде все стоят.

3. SIB, Default message provider

4. спорно, переносимость кода теряется

5. спасибо, учту
...
Рейтинг: 0 / 0
WAS 7, не работает MDB
    #37893996
z0z0iberg,

1. Bus Security на самом SIB включено или нет?
Пустой Message Selector - это нормально, я спрашивал про него на случай, если там стоит фильтр, т.к. сообщение может не выбираться из за фильтра.

2. Что все таки выдает versionInfo для сервера приложений?

4. В смысле теряется переносимость кода? Кто-то из J2EE-серверов не позволяет выполнять binding во время Deploy приложения?
И, судя по официальной документации, это свойство серверы приложений могут игнорировать, т.е. это свойство само не является портабельным. Annotation Type MessageDriven
Цитатаpublic abstract java.lang.String mappedName

A product specific name(e.g. global JNDI name of a queue) that this message-driven bean should be mapped to. Application servers are not required to support any particular form or type of mapped name, nor the ability to use mapped names. The mapped name is product-dependent and often installation-dependent. No use of a mapped name is portable.
Из минусов:

а) Приложение напрямую ссылается на ресурс из глобального каталога сервера. Я, как администратор сервера, могу называть ресурсы в глобальном дереве так, как считаю нужным (в соответствии с выбранной политикой именования). Поэтому прописанная в приложении ссылка на глобальное имя обычно добавляет проблем, а не решает их.

б) Имя очереди прописывается в Activation Spec-е на сервере приложений (В WAS, про другие J2EE-сервера не скажу), и собственно само приложение достаточно привязать к спеку, задавать имя очереди в самом приложении в этом случае избыточно.

Во вложении архив тестового приложения. Рекомендую установить и проверить будут ли читаться сообщения.
Сделана настройка чтобы "прицепиться" к Activation Spec с именем jms/TestMDB-TestQueueActivationSpec
Существующие приложения, использующее этот же Activation Spec нужно остановить.
Вот что у меня выдается в лог, после установки и помещения в очередь сообщения:
WAS_Log[7/26/12 14:35:09:769 MSD] 0000000d ApplicationMg A CWWSR0200I: Starting application: MDBTest
[7/26/12 14:35:09:769 MSD] 0000000d ApplicationMg A CWWSR0204I: Application: MDBTest Application build level: Unknown
[7/26/12 14:35:09:832 MSD] 0000000d EJBContainerI I CWWSR0037I: Starting EJB jar: MDBTest_EJB.jar
[7/26/12 14:35:09:848 MSD] 0000000d TestMDB I ru.ts.ehabarov.j2ee.TestMDB <init> Initialized
[7/26/12 14:35:09:957 MSD] 0000000d SibMessage I [:] CWSIV0777I: A connection to messaging engine WAS01Node01.WAS01Srv01-BUS01 for destination queue1 on bus BUS01 has been successfully created.
[7/26/12 14:35:09:957 MSD] 0000000d ActivationSpe I CWWJC0523I: The Message Endpoint for ActivationSpec jms/TestMDB-TestQueueActivationSpec (com.ibm.ws.sib.api.jmsra.impl.JmsJcaActivationSpecImpl) and MDB Application MDBTest#MDBTest_EJB.jar#TestMDB is activated.
[7/26/12 14:35:09:957 MSD] 0000000d EJBContainerI I CWWSR0057I: EJB jar started: MDBTest_EJB.jar
[7/26/12 14:35:09:957 MSD] 0000000d ApplicationMg A CWWSR0221I: Application started: MDBTest
[7/26/12 14:35:09:957 MSD] 0000000d CompositionUn A CWWSR0191I: Composition unit WebSphere:cuname=MDBTest in BLA WebSphere:blaname=MDBTest started.
[7/26/12 15:35:46:707 MSD] 0000040c TestMDB I ru.ts.ehabarov.j2ee.TestMDB <init> Initialized
[7/26/12 15:35:46:754 MSD] 0000040c TestMDB I ru.ts.ehabarov.j2ee.TestMDB onMessage onMessage()
[7/26/12 15:35:46:754 MSD] 0000040c TestMDB I ru.ts.ehabarov.j2ee.TestMDB onMessage Message type is null
[7/26/12 15:35:46:754 MSD] 0000040c TestMDB I ru.ts.ehabarov.j2ee.TestMDB onMessage Message ID is ID:aa340b0b7b6c5da5827e4f53110a134f0000000000000001

Версия сервера:
versionInfoWVER0010I: Copyright (c) IBM Corporation 2002, 2005, 2008; All rights reserved.
WVER0012I: VersionInfo reporter version 1.15.5.1, dated 6/15/11

--------------------------------------------------------------------------------
IBM WebSphere Application Server Product Installation Status Report
--------------------------------------------------------------------------------

Report at date and time July 26, 2012 3:41:46 PM MSD

Installation
--------------------------------------------------------------------------------
Product Directory C:\IBM\WebSphere\AppServer
Version Directory C:\IBM\WebSphere\AppServer\properties\version
DTD Directory C:\IBM\WebSphere\AppServer\properties\version\dtd
Log Directory C:\IBM\WebSphere\AppServer\logs
Backup Directory C:\IBM\WebSphere\AppServer\properties\version\nif\backup
TMP Directory C:\DOCUME~1\db2admin\LOCALS~1\Temp

Product List
--------------------------------------------------------------------------------
ND installed

Installed Product
--------------------------------------------------------------------------------
Name IBM WebSphere Application Server - ND
Version 7.0.0.19
ID ND
Build Level cf191132.09
Build Date 8/13/11
Architecture AMD (64 bit)

--------------------------------------------------------------------------------
End Installation Status Report
--------------------------------------------------------------------------------
...
Рейтинг: 0 / 0
WAS 7, не работает MDB
    #37895081
z0z0iberg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Евгений Хабаров,

IBM WebSphere Application Server - ND Version 7.0.0.24

Удалил все приложения, очередь, фабрику и спецификацию активации.
Посмотрел по трассировке, проскакивал постоянный откат транзакции после попытки получения сообщения, причём на уровне контейнера. До метода onMessage дело не доходило.
Создал всё по новой, но в названиях убрал символ '-' и MDB работает...
Истинная причина так и осталась покрыта мраком.

По поводу activation spec и аннтотаций, смотря какой сервер приложений. С точки зрения разработки мне для GlassFish и для WebSphere удобней всё описывать в аннотациях, поскольку я сразу вижу с какой очередью/фабрикой соединений идёт работа. Для того они и были введены в EJB 3.0. Переопределить параметры описанные в аннотациях можно всегда с помощью файла дескриптора, это указано в спецификации (если есть дескриптор, то аннотации игнорируются).

Теперь столкнулся с другой проблемой - MDB не откатывает транзакцию после RuntimeException.

Код: java
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.
@MessageDriven(
		activationConfig = { @ActivationConfigProperty(
				propertyName = "destinationType", propertyValue = "javax.jms.Queue"
		) } 
)
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class TestMDB implements MessageListener {
	private static final Logger log = LoggerFactory.getLogger(TestMDB.class);
	
    public TestMDB() {
    	log.info("[TestMDB] instance created - {}", this);
    }
	
    public void onMessage(Message message) {
    	log.info("[TestMDB] {} - onMessage()", this);
    	try {
    		if (message != null) {
    			log.info("[TestMDB] Message = {}", message);
    			ObjectMessage objMessage = (ObjectMessage) message;
    			TestRecord testRecord = (TestRecord) objMessage.getObject();
    			if(testRecord.getI() == 0) {
    				log.info("[TestMDB] rollback test");
    				throw new RuntimeException("rollback test");
    			}
    			log.info("[TestMDB] Message object = {}", testRecord.toString());
    		}
    	} catch (JMSException e) {
    		log.error("Error processing message",e);
    	}
    }

} 



Rollback test не проходит, сообщение не возвращается обратно в очередь.
В логе дважды появляются записи вида:
[7/27/12 11:39:46:980 MSK] 0000004d TestMDB I ru.test.TestMDB onMessage [TestMDB] rollback test
[7/27/12 11:39:46:986 MSK] 0000004d LocalExceptio E CNTR0020E: EJB threw an unexpected (non-declared) exception during invocation of method "onMessage" on bean "BeanId(TestEAR#TestMDB.jar#TestMDB, null)". Exception data: java.lang.RuntimeException: rollback test
at ru.test.TestMDB.onMessage(TestMDB.java:42)
at com.ibm.ejs.container.MessageEndpointHandler.invokeMdbMethod(MessageEndpointHandler.java:1093)
at com.ibm.ejs.container.MessageEndpointHandler.invoke(MessageEndpointHandler.java:778)
at $Proxy68.onMessage(Unknown Source)
at com.ibm.ws.sib.api.jmsra.impl.JmsJcaEndpointInvokerImpl.invokeEndpoint(JmsJcaEndpointInvokerImpl.java:233)
at com.ibm.ws.sib.ra.inbound.impl.SibRaDispatcher.dispatch(SibRaDispatcher.java:900)
at com.ibm.ws.sib.ra.inbound.impl.SibRaSingleProcessListener$SibRaWork.run(SibRaSingleProcessListener.java:552)
at com.ibm.ejs.j2c.work.WorkProxy.run(WorkProxy.java:399)
at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1604)

MDB дважды пытается обработать это сообщение и успокаивается. В настройках Activation Spec опция "Automatically stop endpoints on repeated message failure" отключена. По идее он должен постоянно откатывать транзакцию MDB, потому что метод onMessage не был выполнен до конца, попутно возвращая сообщение в очереди и затем выполнять re-delivery. Но этого не происходит и сообщение больше не появляется в очереди.
...
Рейтинг: 0 / 0
WAS 7, не работает MDB
    #37895452
z0z0iberg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Швыряние EJBException тоже не помогло.
...
Рейтинг: 0 / 0
WAS 7, не работает MDB
    #37895461
z0z0iberg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как оказалось, сообщение падало в SYSTEM.Exception.Destination.
...
Рейтинг: 0 / 0
WAS 7, не работает MDB
    #37895745
z0z0iberg,

1. Очень нехорошо, если MDB выкидывает Exception.
Если нужно откатить транзакцию, то это делается через MessageDrivenContext, а Exception в MDB - это сигнал к останову обработчика, т.к. говорит о том, что случилось нечто "непредсказуемое", т.е. непредусмотренное логикой обработки MDB.

2. С учетом того, что в Activation Spec останов MDB заблокирован, то количество повторных "прокатов" сообщения зависит от настроек Destination в SIB. Там есть параметр "Maximum failed deliveries per message". По умолчанию выполняется 5 попыток. Куда именно попадет такое сообщение зависит от другой настройки в разделе "Exception destination", по умолчанию "System".

Вот пример кода для выполнения Rollback
Код: java
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.
import javax.annotation.Resource;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.ejb.MessageDrivenContext;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Message-Driven Bean implementation class for: TestMDB
 *
 */
@TransactionManagement ( value = TransactionManagementType.CONTAINER )
@TransactionAttribute  ( value = TransactionAttributeType.REQUIRED )
@MessageDriven(
		activationConfig = { @ActivationConfigProperty(
				propertyName = "destinationType", propertyValue = "javax.jms.Queue"
		) })
public class TestMDB implements MessageListener {
  	@Resource
  	private MessageDrivenContext mdc;
	private Logger logger; 

    /**
     * Default constructor. 
     */
    public TestMDB() {
    	logger = LoggerFactory.getLogger(this.getClass().getName());
    	logger.info("Initialized");
    }
	
	/**
     * @see MessageListener#onMessage(Message)
     */
    public void onMessage(Message message) {
    	logger.info("onMessage()");
    	try
    	{
      	if (message != null)
      	{
      		logger.info("Message ID is {}",message.getJMSMessageID());
      		logger.info("Message redelivery status : {}",message.getJMSRedelivered());
      		logger.info("Message redelivery count : {}",message.getIntProperty("JMSXDeliveryCount"));
      		logger.info("Marked for Rollback Before : {}",mdc.getRollbackOnly());
      		mdc.setRollbackOnly();
      		logger.info("Marked for Rollback After  : {}",mdc.getRollbackOnly());
      	}
    	}
    	catch (JMSException e)
    	{
    		logger.error("Error processing message",e);
    	}
    }
}
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / WAS 7, не работает MDB
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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