Transactional onMessage without message driven beans
Hi.
Imagine a system that does not use message driven beans, but instead a non-EJB MessageListener that invokes some SessionBean method in its onMessage(), as described for example in "http://www.theserverside.com/resources/article.jsp?l=Bringing-Together-Application-Servers-and-JMS-Messaging".
Is it possible to execute the MessageListener.onMessage() and the SessionBean.someMethod() in the same transaction, in such a way that the message is not being removed from the queue if processing in the EJB fails? With JMS methods, given the JMS provider is JTA - capable?
Products would be WebSphere 4.0.1 an MQSeries.
Any hints would be appreciated,
thanks,
Lutz
Yes, If the Jms Provider is JTA capable then the OnMessage method can be made transactional.
Go thru XA package of jms specification.
-Ashish
Similar Messages
-
How to transaction in the message driven bean?
hello
i write a message driven bean,that monitor the weblogic message queue,when a "Order"
object is witten to the queue,the mdb get it and write it to a entity bean "Orderinfo".all
of above logic is within the "onMessage" method of the mdb.
i want to encapsulate the flow in a transaction,see my code snippet of the onMessage
method:
ObjectMessage objMsg = (ObjectMessage) msg;
OrderVO orderVO = (OrderVO) objMsg.getObject();
System.out.println(orderVO.booklist);
OrderinfoHome orderinfoHome = (OrderinfoHome) ctx.lookup(
"java:/comp/env/orderinfo");
Orderinfo orderinfo = orderinfoHome.create(orderVO.orderID);
orderinfo.setAddress(orderVO.address);
orderinfo.setCustname(orderVO.custName);
orderinfo.setEmail(orderVO.email);
orderinfo.setBooklist(orderVO.booklist);
orderinfo.setPrice(new BigDecimal(orderVO.price));
and deploy descriptor snippet(ejb-jar.xml):
<assembly-descriptor>
<container-transaction>
<method>
<ejb-name>orderMDB</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
</assembly-descriptor>
i think during this transaction,there are two action:geting the object from the
queue and saving it to entity bean.in order to test the transaction,i modify the
jndi name of entity bean in the code to a WRONG one.redeploy my program,and send
a message to the queue,the mdb is activated,then the exception is thrown because
of the wrong jndi name.after that,i check the message queue,find that it is empty.why?i
think if the second action of the transaction is fail,the transaction should roll
back,the message should be send BACK to the queue.
i also ty to use the "javax.transaction.UserTransaction" in the onMessage method,but
the follwing exception is thrown:
javax.transaction.NotSupportedException: Another transaction is associated with
this thread.................................
who can help me,if any wrong with me,and how to use the transaction with the message
driven bean?
thank you.
The transaction should rollback if the MDB throws an
exception. Try changing your MDB code to
call "setRollbackOnly()" on the EJB
context (instead of throwing an exception) to see
if that works. If calling "setRollbackOnly()" fixes
the problem - then please contact customer support
and report a bug.
zbcong wrote:
> hello
>
> i write a message driven bean,that monitor the weblogic message queue,when a "Order"
> object is witten to the queue,the mdb get it and write it to a entity bean "Orderinfo".all
> of above logic is within the "onMessage" method of the mdb.
> i want to encapsulate the flow in a transaction,see my code snippet of the onMessage
> method:
>
>
> ObjectMessage objMsg = (ObjectMessage) msg;
> OrderVO orderVO = (OrderVO) objMsg.getObject();
> System.out.println(orderVO.booklist);
> OrderinfoHome orderinfoHome = (OrderinfoHome) ctx.lookup(
> "java:/comp/env/orderinfo");
> Orderinfo orderinfo = orderinfoHome.create(orderVO.orderID);
> orderinfo.setAddress(orderVO.address);
> orderinfo.setCustname(orderVO.custName);
> orderinfo.setEmail(orderVO.email);
> orderinfo.setBooklist(orderVO.booklist);
> orderinfo.setPrice(new BigDecimal(orderVO.price));
>
>
> and deploy descriptor snippet(ejb-jar.xml):
>
>
> <assembly-descriptor>
> ............
> ...........
>
> <container-transaction>
> <method>
> <ejb-name>orderMDB</ejb-name>
> <method-name>*</method-name>
> </method>
> <trans-attribute>Required</trans-attribute>
> </container-transaction>
> </assembly-descriptor>
>
>
> i think during this transaction,there are two action:geting the object from the
> queue and saving it to entity bean.in order to test the transaction,i modify the
> jndi name of entity bean in the code to a WRONG one.redeploy my program,and send
> a message to the queue,the mdb is activated,then the exception is thrown because
> of the wrong jndi name.after that,i check the message queue,find that it is empty.why?i
> think if the second action of the transaction is fail,the transaction should roll
> back,the message should be send BACK to the queue.
>
> i also ty to use the "javax.transaction.UserTransaction" in the onMessage method,but
> the follwing exception is thrown:
>
> javax.transaction.NotSupportedException: Another transaction is associated with
> this thread.................................
>
> who can help me,if any wrong with me,and how to use the transaction with the message
> driven bean?
>
> thank you.
>
>
-
Can you set isolation levels of message-driven bean transactions?
The problem: I have 3 different message-driven beans which each get a different type of message, except for a field that is common to all. That field is used as the primary key of an entity object. The message-driven beans configured to use a container managed transaction. Each message-driven bean, in processing the message, first does a lookup by primary key to see if the object associated with the key exists, and if it does not, it requests the entity's home object to create it. After that, they do further processing. The problem is that sometimes all the beans simultaneously get a message, resulting in each bean checking for the entity object at about the same time, and if they fail to find it (because none of them has created it yet), each creates an object, all with the same primary key. This is not caught until the beans start to complete their onMessage method, which I believe results in the container committing the transaction. One of the transactions will be committed successfully, while the other two will fail, get rolled back, and then be retried with the same message. The second time through, the other beans will find the entity object (since it has been created and committed) and they will complete correctly. In the end, they right thing occurs, except that there is a troubling exception or 2 in the log telling about the constraint violation (with the primary key) and the rollback. If it was just me, that would be fine, but our customer does not like to see exceptions in the log; that indicates to him that something is wrong.
So, I am looking for someway to make sure that the actions of the message-driven beans are serialized. One suggestion from a colleague was to set the isolation level of the transactions being used by the container in processing the message-driven beans' onMessage method. However, the documentation does not mention any way to do this for a message-driven bean. Suggestions?
Is the use of a UserTransaction a better way to do this? If I acquire a UserTransaction within the onMessage method of a message-driven bean, can I set its isolation level? How would this work? When I get a UserTransaction, does each client get a different transaction, or do they all get the same one?(1) The WebLogic JMS "unit-of-order" feature is a heavily adopted feature that was specifically designed to handle similar use cases - see the JMS developer guide for extensive documentation. In your use case, if "key" is used to define UOO, then there's no limit on the number of keys that can be processed concurrently, but messages for any particular key will be processed single-threaded in the order in which they were first submitted.
Note that if you're using distributed destinations, the UOO feature is still fully supported - but the developer and/or administrator needs to decide whether to configure the destination to use "hash" or "path service" based routing (the JMS UOO edoc outlines the trade-offs).
(2) Another alternative is to use a single MDB with max-beans-free-pool that processes all three types (as the other poster suggested). I think this assumes all MDBs run on the same JVM.
(3) Another alternative is to use multiple queues, with a single MDB on each Q. Where some sort of hash algorithm is used to determine which Q is for the key. This approach is a "hand-coded" variant of the approach in (1) with "hash" based routing enabled...
(4) If all MDBs actually do run in the same JVM, a third alternative is to use code the application to use a common lock to protect each key, eg, something like:
// assume MyLock is simply a class with a "reference counter"
// assume some global "staticHM" hash map that is all MDBs can access
onMessage() {
MyLock lock = null;
key= msg.getKey();
synchronized(staticHM) {
lock = staticHM.get();
if (lock = null) {
lock = new lock();
staticHM.put(key, new lock());
lock.incRefCount();
try {
synchronized(lock) {
// only one onMessage will be able to lock a particular key at a time
do your work;
} finally {
synchronized(staticHT) {
if (lock.defRefCount() == 0) staticHM.remove(lock);
if (lock = null) staticHM.put(key);
If multiple threads get a message with the same key, then only one thread at a time will work on the key.
Hope this helps,
Tom -
Message Driven Bean and Distributed transaction
Hi ALL
I am developing an asynchronous application using MDB. My application flow is as follows:
1. From MDB onMessage i am calling a method MethodA that
a. calls a simple pojo1 where I am getting a Connection on XA enable datasource1 and executing Stored Procedure1 of DatabaseSchema1.
b. In that pojo without committing m closing the connection and coming back in MethodA.
c. Again from MethodA m calling a different pojo2 where I am getting a new Connection on XA enable datasource2 and executing Stored Procedure2 of
DatabaseSchema1. In this pojo also without committing m closing the connection and coming back in MethodA.
d. Again from MethodA m calling pojo1 where I am getting a new Connection on XA enable datasource1 and executing a different function of Stored Procedure1 of DatabaseSchema1.
Public class MDB{
Public void onMessage(��.)
Try{
Method1();
Catch(Exception x)
mdbcontext.setRollbackOnly();
Private void MethodA()
Call pojo1;
Call pojo2
Pojo1
Public void CallSP1()
Get connection from Datasource1 (shema1,user1, pwd1);
Call sp1();
//return without commit;
Pojo2
Public void CallSP2()
Get connection from Datasource2 (shema1,user2, pwd2);
Call sp2();
//return without commit;
SP1:
Insert table1
Savepoint 1
Insert into Table1
Rollback to 1
Insert a row
End SP1 (without commit)
SP2:
Insert table2
Savepoint 2
Update table2
Rollback to 2
Insert table2
End SP2 (without commit)
In ejb-jar.xml
Transaction type is Container
Transaction attribute is Required for all
Now problem is:
Case 1: success case when no exception is there at Java layer
SP1 works fine I mean there is only 2 inserts in Table 1
But In SP2 there are 3 inserts
Case 2: if an exception comes at Java layer
SP1 is fine
Rollback is not happening in SP2
In ejb-jar.xml transaction attributes is Required for all methods and transaction type is Container.
Backend is Oracle 10g and init.xa has already been run on that.
Will be very obliged if can have a single hint of the problem.
Both datasource are XA enable
Backend is Oracle 10g
Application server is WAS 6.0
Queue is WAS MQ 6.0
Thanks{color:#008000}Hi Friends,
Thought of updating the answers for my questions in case somebody else would find it helpful.
{color}
{color:#999999}{color:#00ccff}I'm trying to make message driven bean and use the OnListener method.
But since I'm doing this for the first time I have very limited knowledge.
The following are my doubts :
1. Should I have a main function while using the MDB?{color}
{color:#008000} There is no need for any main function.{color}
{color:#00ccff}2. Is it mandatory to have JNDI setup done?
{color} {color}{color:#008000} There is no need for any JNDI setup done. But you need to configure the details on the
Websphere by creating valid entries inside Resources namely -
Queue Connection Factory, Queues and Listener Ports under the server.
Thanks,
Arun Prithviraj{color} -
Message Driven Bean and transaction handling
We are using container managed transactions with MDB's running on OC4J version 10.1.2. We have two database serveres, both running Oracle 10g.
The MDB consume messages from the AQ-database through JMS (connected to a JDBC datasource registered as "jdbc/OracleAQDS").
The MDB onMessage() code update the second database, using a JDBC datasource registered as "jdbc/OracleDBDS".
We need atomic behaviour - if the MDB enforce a roll-back we want the updates aginst the second database to be rolled-back as well.
(1) Should we use XA-datasources since AQ and DB runs on two different servers or do the OC4J container "magically" provide two-phase-commit for us?
(2) If the MDB does a roll-back we would like to add an error record to a database table. Can we configure a third datasource and prevent if from beeing part of the container managed MDB roll-back?
(3) When the MDB force a roll-back, is there some way for us to override the retry-delay in our Java code? If we catch certain errors during processing in onMessage we know that it is not necessary to retry for at least one hour (while less severe errors should be retried in just seconds).{color:#008000}Hi Friends,
Thought of updating the answers for my questions in case somebody else would find it helpful.
{color}
{color:#999999}{color:#00ccff}I'm trying to make message driven bean and use the OnListener method.
But since I'm doing this for the first time I have very limited knowledge.
The following are my doubts :
1. Should I have a main function while using the MDB?{color}
{color:#008000} There is no need for any main function.{color}
{color:#00ccff}2. Is it mandatory to have JNDI setup done?
{color} {color}{color:#008000} There is no need for any JNDI setup done. But you need to configure the details on the
Websphere by creating valid entries inside Resources namely -
Queue Connection Factory, Queues and Listener Ports under the server.
Thanks,
Arun Prithviraj{color} -
Deployment of Message Driven Bean fails
Hi guys,
i use MQSeries as JMS Provider.
The Application (ear) has the following structure :
MDBApp.ear
contains
mqseries1.jar ,mqseries2.jar, mqseries3.jar , .. ( In the previous Version of NetWeaver is used a deployable Server library and referenced it from the jms-factories.xml )
mdb.jar (contains the Message Driven Bean)
Note :
the jms-resources.xml has the following content :
<?xml version="1.0" encoding="UTF-8"?>
<jms-resources xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="jms-resources.xsd">
<connection-factory>
<name>TestFactory</name>
<object-factory-type>
<object-factory-name>com.ibm.mq.jms.MQXAQueueConnectionFactoryFactory</object-factory-name>
<class-name>com.ibm.mq.jms.MQXAQueueConnectionFactory</class-name>
<property>
<config-property-name>HOST</config-property-name>
<config-property-value>anIPAdress</config-property-value>
</property>
<property>
<config-property-name>QMGR</config-property-name>
<config-property-value>aQueueManagerID</config-property-value>
</property>
<property>
<config-property-name>PORT</config-property-name>
<config-property-value>aPort</config-property-value>
</property>
<property>
<config-property-name>TRAN</config-property-name>
<config-property-value>1</config-property-value>
</property>
</object-factory-type>
</connection-factory>
<destination>
<name>RA.IBMSOLLIST.ASSOLLIST.001</name>
<type>javax.jms.Queue</type>
<external-destination-type>
<link-connection-factory>TestFactory</link-connection-factory>
</external-destination-type>
</destination>
</jms-resources>
The Message Driven Bean code :
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType",
propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "destination",
propertyValue = "RA.IBMSOLLIST.ASSOLLIST.001"),
@ActivationConfigProperty(propertyName =
"connectionFactoryName", propertyValue = "TestFactory")
public class VMRaTestMessageDBean implements MessageListener {
/* (non-Javadoc)
@see javax.jms.MessageListener#onMessage(javax.jms.Message)
public void onMessage(Message arg0) {
// TODO Auto-generated method stub
The SDM gets following warning/error :
Description:
1. Exception has been returned while the 'vmtubes.de/ratestmdb~ear' was starting. Warning/Exception :
[ERROR CODE DPL.DS.6193] Error while ; nested exception is:
com.sap.engine.services.deploy.exceptions.ServerDeploymentException: [ERROR CODE DPL.DS.5030] Clusterwide exception: server ID 2198950:com.sap.engine.services.deploy.container.DeploymentException: Cannot activate endpoint for message-driven bean vmtubes.de/ratestmdbear*annotation|vmtubes.deratestmdb~ejb.jar*annotation|VMRaTestMessageDBean
at com.sap.engine.services.ejb3.container.ContainerInterfaceImpl$Actions.perform(ContainerInterfaceImpl.java:893)
at com.sap.engine.services.ejb3.container.ContainerInterfaceImpl.prepareStart(ContainerInterfaceImpl.java:425)
at com.sap.engine.services.deploy.server.application.StartTransaction.prepareCommon(StartTransaction.java:219)
at com.sap.engine.services.deploy.server.application.StartTransaction.prepare(StartTransaction.java:179)
at com.sap.engine.services.deploy.server.application.ApplicationTransaction.makeAllPhasesOnOneServer(ApplicationTransaction.java:420)
at com.sap.engine.services.deploy.server.application.ApplicationTransaction.makeAllPhases(ApplicationTransaction.java:445)
at com.sap.engine.services.deploy.server.application.ParallelAdapter.super_MakeAllPhases(ParallelAdapter.java:337)
at com.sap.engine.services.deploy.server.application.StartTransaction.makeAllPhasesImpl(StartTransaction.java:550)
at com.sap.engine.services.deploy.server.application.ParallelAdapter.runInTheSameThread(ParallelAdapter.java:251)
at com.sap.engine.services.deploy.server.application.ParallelAdapter.makeAllPhasesAndWait(ParallelAdapter.java:392)
at com.sap.engine.services.deploy.server.DeployServiceImpl.startApplicationAndWait(DeployServiceImpl.java:3389)
at com.sap.engine.services.deploy.server.DeployServiceImpl.startApplicationAndWait(DeployServiceImpl.java:3375)
at com.sap.engine.services.deploy.server.DeployServiceImpl.startApplicationAndWait(DeployServiceImpl.java:3278)
at com.sap.engine.services.deploy.server.DeployServiceImpl.startApplicationAndWait(DeployServiceImpl.java:3251)
at com.sap.engine.services.dc.lcm.impl.J2EELCMProcessor.doStart(J2EELCMProcessor.java:99)
at com.sap.engine.services.dc.lcm.impl.LifeCycleManagerImpl.start(LifeCycleManagerImpl.java:62)
at com.sap.engine.services.dc.cm.deploy.impl.LifeCycleManagerStartVisitor.visit(LifeCycleManagerStartVisitor.java:34)
at com.sap.engine.services.dc.cm.deploy.impl.DeploymentItemImpl.accept(DeploymentItemImpl.java:83)
at com.sap.engine.services.dc.cm.deploy.impl.DefaultDeployPostProcessor.postProcessLCMDeplItem(DefaultDeployPostProcessor.java:80)
at com.sap.engine.services.dc.cm.deploy.impl.DefaultDeployPostProcessor.postProcess(DefaultDeployPostProcessor.java:56)
at com.sap.engine.services.dc.cm.deploy.impl.DeployerImpl.doPostProcessing(DeployerImpl.java:741)
at com.sap.engine.services.dc.cm.deploy.impl.DeployerImpl.performDeploy(DeployerImpl.java:732)
at com.sap.engine.services.dc.cm.deploy.impl.DeployerImpl.doDeploy(DeployerImpl.java:576)
at com.sap.engine.services.dc.cm.deploy.impl.DeployerImpl.deploy(DeployerImpl.java:270)
at com.sap.engine.services.dc.cm.deploy.impl.DeployerImpl.deploy(DeployerImpl.java:192)
at com.sap.engine.services.dc.cm.deploy.impl.DeployerImplp4_Skel.dispatch(DeployerImplp4_Skel.java:875)
at com.sap.engine.services.rmi_p4.DispatchImpl._runInternal(DispatchImpl.java:351)
at com.sap.engine.services.rmi_p4.server.ServerDispatchImpl.run(ServerDispatchImpl.java:70)
at com.sap.engine.services.rmi_p4.P4Message.process(P4Message.java:62)
at com.sap.engine.services.rmi_p4.P4Message.execute(P4Message.java:37)
at com.sap.engine.services.cross.fca.FCAConnectorImpl.executeRequest(FCAConnectorImpl.java:872)
at com.sap.engine.services.rmi_p4.P4Message.process(P4Message.java:53)
at com.sap.engine.services.cross.fca.MessageReader.run(MessageReader.java:58)
at com.sap.engine.core.thread.execution.Executable.run(Executable.java:108)
at com.sap.engine.core.thread.execution.CentralExecutor$SingleThread.run(CentralExecutor.java:304)
Caused by: com.sap.engine.services.ejb3.container.ActionException: Cannot activate endpoint for message-driven bean vmtubes.de/ratestmdbear*annotation|vmtubes.deratestmdb~ejb.jar*annotation|VMRaTestMessageDBean
at com.sap.engine.services.ejb3.runtime.impl.Actions_MDBEndpointActivation.perform(Actions_MDBEndpointActivation.java:94)
at com.sap.engine.services.ejb3.container.CompositeAction.perform(CompositeAction.java:81)
at com.sap.engine.services.ejb3.container.ApplicationStarter.perform(ApplicationStarter.java:59)
at com.sap.engine.services.ejb3.container.ContainerInterfaceImpl$Actions.perform(ContainerInterfaceImpl.java:887)
... 34 more
Caused by: javax.resource.NotSupportedException: javax.resource.spi.UnavailableException: The destination RA.IBMSOLLIST.ASSOLLIST.001 cannot be looked up. Last attempt performed : jms_vendor_queues_global/RA.IBMSOLLIST.ASSOLLIST.001
at com.sap.jms.resourceadapter.ResourceAdapterImpl.endpointActivation(ResourceAdapterImpl.java:113)
at com.sap.engine.services.connector.jca15.EndpointActivationImpl.activateEndpoint(EndpointActivationImpl.java:451)
at com.sap.engine.services.connector.jca15.EndpointActivationImpl.findResourceAdapterByName(EndpointActivationImpl.java:154)
at com.sap.engine.services.connector.jca15.EndpointActivationImpl.findAdapter(EndpointActivationImpl.java:85)
at com.sap.engine.services.connector.jca15.EndpointActivationImpl.activateEndpoint(EndpointActivationImpl.java:58)
at com.sap.engine.services.ejb3.runtime.impl.Actions_MDBEndpointActivation.perform(Actions_MDBEndpointActivation.java:84)
... 37 more
Caused by: javax.resource.spi.UnavailableException: The destination RA.IBMSOLLIST.ASSOLLIST.001 cannot be looked up. Last attempt performed : jms_vendor_queues_global/RA.IBMSOLLIST.ASSOLLIST.001
at com.sap.jms.resourceadapter.RaActivation.setupDestination(RaActivation.java:345)
at com.sap.jms.resourceadapter.RaActivation.activate(RaActivation.java:121)
at com.sap.jms.resourceadapter.ResourceAdapterImpl.endpointActivation(ResourceAdapterImpl.java:101)
... 42 more
Caused by: com.sap.engine.services.jndi.persistent.exceptions.NameNotFoundException: Object not found in lookup of RA.IBMSOLLIST.ASSOLLIST.001.
at com.sap.engine.services.jndi.implserver.ServerContextImpl.lookup(ServerContextImpl.java:584)
at com.sap.engine.services.jndi.implclient.ClientContext.lookup(ClientContext.java:343)
at com.sap.engine.services.jndi.implclient.ClientContext.lookup(ClientContext.java:637)
at javax.naming.InitialContext.lookup(InitialContext.java:351)
at javax.naming.InitialContext.lookup(InitialContext.java:351)
at com.sap.jms.resourceadapter.RaActivation.setupDestination(RaActivation.java:343)
... 44 more
I use NetWeaver CE 7.1 SP05 .
LockeHi Vladimir,
i can't find the string "JMS Connector Container Application: vmtubes.de/ratestmdb~ear destination name: RA.IBMSOLLIST.ASSOLLIST.001" in the traces.
These are all the logentries while the deployment (read the entries from top to buttom):
Starting activation of JMS resource adapter endpoint factory. ActivationSpec is : applicationName=vmtubes.de/ratestmdb~ear,connectionFactoryName : Testfactory,mAcknowledgeMode : null,maxPoolSize : 50,mClientId : null,mDestinationName : RA.IBMSOLLIST.ASSOLLIST.001,mDestinationType : javax.jms.Queue,minPoolSize : 0,mMessageSelector : null,mSubscriptionDurability : null,mSubscriptionName : null,mReconnectAttempts : 10,mSleepBetweenAttempts : 1000,mParallelConsumers : 1
Performing JNDI lookup for obtaining connectionFactory : jms_vendor_factory_local/vmtubes.de/ratestmdb~ear/Testfactory
First attempt for lookup failed. That could happen for 6.40 applpication without application name. We will continute with the fallback chain. The JNDI lookup is : jms_vendor_factory_local/vmtubes.de/ratestmdb~ear/Testfactory
Performing JNDI lookup for obtaining connectionFactory : jms_vendor_factory_global/Testfactory
Attempt for lookup without application name failed. An attempt will be performed to use the default connectionFactory instead of the one supplied during deployment. The JNDI name is : jms_vendor_factory_global/Testfactory
Performing JNDI lookup for obtaining connectionFactory : jmsfactory/default/XAQueueConnectionFactory
JMS connection created:
================================== Connection ==================================
ID 9444418335539219
Type (Generic)Connection
Mode STOPPED
isClosed NO
client = null
server = com.sap.jms.server.remote.JMSRemoteServerImpl5ec877
packetFactory = com.sap.jms.protocol.PacketFactoryImpl12e8d47
thread pool = null
isClosed = false
runFlag = true
isRunning = true
ConnectionMetaData -
JMSVersion 1.1
PorviderVersion Version 1.0
SupportedJMSXProperties JMSXGroupID, JMSXGroupSeq
================================================================================
com.sap.jms.client.connection.RemoteQueueConnection13d601c isUsed = false
Attempt for lookup without application name failed. An attempt will be performed to use the default connectionFactory instead of the one supplied during deployment. The JNDI name is : jms_vendor_factory_global/Testfactory
Attempt for lookup of destination failed. That could happen for 6.40 applications without application name.An attempt will be performed without the application name. The JNDI name is : jms_vendor_queues_local/vmtubes.de/ratestmdb~ear/RA.IBMSOLLIST.ASSOLLIST.001
java.lang.ClassCastException: class javax.naming.Reference:null incompatible with interface javax.jms.Destination:library:jmscom.sap.engine.boot.loader.ResourceMultiParentClassLoader389922alive
at com.sap.jms.resourceadapter.RaActivation.setupDestination(RaActivation.java:320)
at com.sap.jms.resourceadapter.RaActivation.activate(RaActivation.java:121)
at com.sap.jms.resourceadapter.ResourceAdapterImpl.endpointActivation(ResourceAdapterImpl.java:101)
at com.sap.engine.services.connector.jca15.EndpointActivationImpl.activateEndpoint(EndpointActivationImpl.java:451)
at com.sap.engine.services.connector.jca15.EndpointActivationImpl.findResourceAdapterByName(EndpointActivationImpl.java:154)
at com.sap.engine.services.connector.jca15.EndpointActivationImpl.findAdapter(EndpointActivationImpl.java:85)
at com.sap.engine.services.connector.jca15.EndpointActivationImpl.activateEndpoint(EndpointActivationImpl.java:58)
at com.sap.engine.services.ejb3.runtime.impl.Actions_MDBEndpointActivation.perform(Actions_MDBEndpointActivation.java:84)
at com.sap.engine.services.ejb3.container.CompositeAction.perform(CompositeAction.java:81)
at com.sap.engine.services.ejb3.container.ApplicationStarter.perform(ApplicationStarter.java:59)
at com.sap.engine.services.ejb3.container.ContainerInterfaceImpl$Actions.perform(ContainerInterfaceImpl.java:887)
at com.sap.engine.services.ejb3.container.ContainerInterfaceImpl.prepareStart(ContainerInterfaceImpl.java:425)
at com.sap.engine.services.deploy.server.application.StartTransaction.prepareCommon(StartTransaction.java:219)
at com.sap.engine.services.deploy.server.application.StartTransaction.prepare(StartTransaction.java:179)
at com.sap.engine.services.deploy.server.application.ApplicationTransaction.makeAllPhasesOnOneServer(ApplicationTransaction.java:420)
at com.sap.engine.services.deploy.server.application.ApplicationTransaction.makeAllPhases(ApplicationTransaction.java:445)
at com.sap.engine.services.deploy.server.application.ParallelAdapter.super_MakeAllPhases(ParallelAdapter.java:337)
at com.sap.engine.services.deploy.server.application.StartTransaction.makeAllPhasesImpl(StartTransaction.java:550)
at com.sap.engine.services.deploy.server.application.ParallelAdapter.runInTheSameThread(ParallelAdapter.java:251)
at com.sap.engine.services.deploy.server.application.ParallelAdapter.makeAllPhasesAndWait(ParallelAdapter.java:392)
at com.sap.engine.services.deploy.server.DeployServiceImpl.startApplicationAndWait(DeployServiceImpl.java:3389)
at com.sap.engine.services.deploy.server.DeployServiceImpl.startApplicationAndWait(DeployServiceImpl.java:3375)
at com.sap.engine.services.deploy.server.DeployServiceImpl.startApplicationAndWait(DeployServiceImpl.java:3278)
at com.sap.engine.services.deploy.server.DeployServiceImpl.startApplicationAndWait(DeployServiceImpl.java:3251)
at com.sap.engine.services.dc.lcm.impl.J2EELCMProcessor.doStart(J2EELCMProcessor.java:99)
at com.sap.engine.services.dc.lcm.impl.LifeCycleManagerImpl.start(LifeCycleManagerImpl.java:62)
at com.sap.engine.services.dc.cm.deploy.impl.LifeCycleManagerStartVisitor.visit(LifeCycleManagerStartVisitor.java:34)
at com.sap.engine.services.dc.cm.deploy.impl.DeploymentItemImpl.accept(DeploymentItemImpl.java:83)
at com.sap.engine.services.dc.cm.deploy.impl.DefaultDeployPostProcessor.postProcessLCMDeplItem(DefaultDeployPostProcessor.java:80)
at com.sap.engine.services.dc.cm.deploy.impl.DefaultDeployPostProcessor.postProcess(DefaultDeployPostProcessor.java:56)
at com.sap.engine.services.dc.cm.deploy.impl.DeployerImpl.doPostProcessing(DeployerImpl.java:741)
at com.sap.engine.services.dc.cm.deploy.impl.DeployerImpl.performDeploy(DeployerImpl.java:732)
at com.sap.engine.services.dc.cm.deploy.impl.DeployerImpl.doDeploy(DeployerImpl.java:576)
at com.sap.engine.services.dc.cm.deploy.impl.DeployerImpl.deploy(DeployerImpl.java:270)
at com.sap.engine.services.dc.cm.deploy.impl.DeployerImpl.deploy(DeployerImpl.java:192)
at com.sap.engine.services.dc.cm.deploy.impl.DeployerImplp4_Skel.dispatch(DeployerImplp4_Skel.java:875)
at com.sap.engine.services.rmi_p4.DispatchImpl._runInternal(DispatchImpl.java:351)
at com.sap.engine.services.rmi_p4.server.ServerDispatchImpl.run(ServerDispatchImpl.java:70)
at com.sap.engine.services.rmi_p4.P4Message.process(P4Message.java:62)
at com.sap.engine.services.rmi_p4.P4Message.execute(P4Message.java:37)
at com.sap.engine.services.cross.fca.FCAConnectorImpl.executeRequest(FCAConnectorImpl.java:872)
at com.sap.engine.services.rmi_p4.P4Message.process(P4Message.java:53)
at com.sap.engine.services.cross.fca.MessageReader.run(MessageReader.java:58)
at com.sap.engine.core.thread.execution.Executable.run(Executable.java:108)
at com.sap.engine.core.thread.execution.CentralExecutor$SingleThread.run(CentralExecutor.java:304)
Connection, destination and serverSession pool have been initialized correctly. Delivery of JMS messages will be started.Connection = ================================== Connection ==================================
ID 9444418335539219
Type (Generic)Connection
Mode STOPPED
isClosed NO
ExceptionListener com.sap.jms.resourceadapter.RaActivation1fe79
client = com.sap.jms.server.remote.JMSRemoteClientImpl857822
server = RMI_P4: Local Dynamic Stub for impl -> com.sap.jms.server.remote.JMSRemoteServerImpl18f254f
P4 Remote Object Info : com.sap.engine.services.rmi_p4.server.P4ServerObjectInfo100
|- broker id : -752547698
|- server id : 2198950
|- client Id : -1
|- local Id : 2198950
|- is redirectable : false
|- redir Ident :
|- factory Name : null
|- objId : null
|- server loader name : null
|- connected : false
|- supportOptimization : true
|- protocol : 76 31 v1
Remote Interfaces :
Interface : [0] = com.sap.jms.server.remote.JMSRemoteServer
Interface : [1] = com.sap.engine.services.rmi_p4.interfaces.P4Notification
=========================================
Connection profiles :
connection profile : [0] = None:195.233.66.25:50004
=========================================
packetFactory = com.sap.jms.protocol.PacketFactoryImple9cc66
thread pool = com.sap.engine.core.service630.context.core.thread.ThreadSystemImpl1b57cfa
isClosed = false
runFlag = true
isRunning = true
ConnectionMetaData -
JMSVersion 1.1
PorviderVersion Version 1.0
SupportedJMSXProperties JMSXGroupID, JMSXGroupSeq
================================================================================
com.sap.jms.client.connection.RemoteQueueConnection16a7da2 isUsed = true, destination = queue:///RA.IBMSOLLIST.ASSOLLIST.001, pool = com.sap.jms.resourceadapter.RaServerSessionPool5e2ae5, activation spec = applicationName=vmtubes.de/ratestmdb~ear,connectionFactoryName : Testfactory,mAcknowledgeMode : null,maxPoolSize : 50,mClientId : null,mDestinationName : RA.IBMSOLLIST.ASSOLLIST.001,mDestinationType : javax.jms.Queue,minPoolSize : 0,mMessageSelector : null,mSubscriptionDurability : null,mSubscriptionName : null,mReconnectAttempts : 10,mSleepBetweenAttempts : 1000,mParallelConsumers : 1
JMS session created:
=================================== Session ====================================
ID: 17
Type: (Generic)Session
ConnectionID: 9444418335539219
AcknowledgeMode: Transacted session!
================================================================================
ActivationSpec could not be deployed/started due to internal problem, clean up will be performed, the activation spec was applicationName=vmtubes.de/ratestmdb~ear,connectionFactoryName : Testfactory,mAcknowledgeMode : null,maxPoolSize : 50,mClientId : null,mDestinationName : RA.IBMSOLLIST.ASSOLLIST.001,mDestinationType : javax.jms.Queue,minPoolSize : 0,mMessageSelector : null,mSubscriptionDurability : null,mSubscriptionName : null,mReconnectAttempts : 10,mSleepBetweenAttempts : 1000,mParallelConsumers : 1
javax.resource.spi.UnavailableException: javax.jms.InvalidDestinationException: Illegal destination!
at com.sap.jms.resourceadapter.RaActivation.activate(RaActivation.java:136)
at com.sap.jms.resourceadapter.ResourceAdapterImpl.endpointActivation(ResourceAdapterImpl.java:101)
at com.sap.engine.services.connector.jca15.EndpointActivationImpl.activateEndpoint(EndpointActivationImpl.java:451)
at com.sap.engine.services.connector.jca15.EndpointActivationImpl.findResourceAdapterByName(EndpointActivationImpl.java:154)
at com.sap.engine.services.connector.jca15.EndpointActivationImpl.findAdapter(EndpointActivationImpl.java:85)
at com.sap.engine.services.connector.jca15.EndpointActivationImpl.activateEndpoint(EndpointActivationImpl.java:58)
at com.sap.engine.services.ejb3.runtime.impl.Actions_MDBEndpointActivation.perform(Actions_MDBEndpointActivation.java:84)
at com.sap.engine.services.ejb3.container.CompositeAction.perform(CompositeAction.java:81)
at com.sap.engine.services.ejb3.container.ApplicationStarter.perform(ApplicationStarter.java:59)
at com.sap.engine.services.ejb3.container.ContainerInterfaceImpl$Actions.perform(ContainerInterfaceImpl.java:887)
at com.sap.engine.services.ejb3.container.ContainerInterfaceImpl.prepareStart(ContainerInterfaceImpl.java:425)
at com.sap.engine.services.deploy.server.application.StartTransaction.prepareCommon(StartTransaction.java:219)
at com.sap.engine.services.deploy.server.application.StartTransaction.prepare(StartTransaction.java:179)
at com.sap.engine.services.deploy.server.application.ApplicationTransaction.makeAllPhasesOnOneServer(ApplicationTransaction.java:420)
at com.sap.engine.services.deploy.server.application.ApplicationTransaction.makeAllPhases(ApplicationTransaction.java:445)
at com.sap.engine.services.deploy.server.application.ParallelAdapter.super_MakeAllPhases(ParallelAdapter.java:337)
at com.sap.engine.services.deploy.server.application.StartTransaction.makeAllPhasesImpl(StartTransaction.java:550)
at com.sap.engine.services.deploy.server.application.ParallelAdapter.runInTheSameThread(ParallelAdapter.java:251)
at com.sap.engine.services.deploy.server.application.ParallelAdapter.makeAllPhasesAndWait(ParallelAdapter.java:392)
at com.sap.engine.services.deploy.server.DeployServiceImpl.startApplicationAndWait(DeployServiceImpl.java:3389)
at com.sap.engine.services.deploy.server.DeployServiceImpl.startApplicationAndWait(DeployServiceImpl.java:3375)
at com.sap.engine.services.deploy.server.DeployServiceImpl.startApplicationAndWait(DeployServiceImpl.java:3278)
at com.sap.engine.services.deploy.server.DeployServiceImpl.startApplicationAndWait(DeployServiceImpl.java:3251)
at com.sap.engine.services.dc.lcm.impl.J2EELCMProcessor.doStart(J2EELCMProcessor.java:99)
at com.sap.engine.services.dc.lcm.impl.LifeCycleManagerImpl.start(LifeCycleManagerImpl.java:62)
at com.sap.engine.services.dc.cm.deploy.impl.LifeCycleManagerStartVisitor.visit(LifeCycleManagerStartVisitor.java:34)
at com.sap.engine.services.dc.cm.deploy.impl.DeploymentItemImpl.accept(DeploymentItemImpl.java:83)
at com.sap.engine.services.dc.cm.deploy.impl.DefaultDeployPostProcessor.postProcessLCMDeplItem(DefaultDeployPostProcessor.java:80)
at com.sap.engine.services.dc.cm.deploy.impl.DefaultDeployPostProcessor.postProcess(DefaultDeployPostProcessor.java:56)
at com.sap.engine.services.dc.cm.deploy.impl.DeployerImpl.doPostProcessing(DeployerImpl.java:741)
at com.sap.engine.services.dc.cm.deploy.impl.DeployerImpl.performDeploy(DeployerImpl.java:732)
at com.sap.engine.services.dc.cm.deploy.impl.DeployerImpl.doDeploy(DeployerImpl.java:576)
at com.sap.engine.services.dc.cm.deploy.impl.DeployerImpl.deploy(DeployerImpl.java:270)
at com.sap.engine.services.dc.cm.deploy.impl.DeployerImpl.deploy(DeployerImpl.java:192)
at com.sap.engine.services.dc.cm.deploy.impl.DeployerImplp4_Skel.dispatch(DeployerImplp4_Skel.java:875)
at com.sap.engine.services.rmi_p4.DispatchImpl._runInternal(DispatchImpl.java:351)
at com.sap.engine.services.rmi_p4.server.ServerDispatchImpl.run(ServerDispatchImpl.java:70)
at com.sap.engine.services.rmi_p4.P4Message.process(P4Message.java:62)
at com.sap.engine.services.rmi_p4.P4Message.execute(P4Message.java:37)
at com.sap.engine.services.cross.fca.FCAConnectorImpl.executeRequest(FCAConnectorImpl.java:872)
at com.sap.engine.services.rmi_p4.P4Message.process(P4Message.java:53)
at com.sap.engine.services.cross.fca.MessageReader.run(MessageReader.java:58)
at com.sap.engine.core.thread.execution.Executable.run(Executable.java:108)
at com.sap.engine.core.thread.execution.CentralExecutor$SingleThread.run(CentralExecutor.java:304)
Caused by: javax.jms.InvalidDestinationException: Illegal destination!
at com.sap.jms.client.session.Session.createConsumer(Session.java:1807)
at com.sap.jms.client.session.Session.createConsumer(Session.java:1795)
at com.sap.jms.client.connection.ConnectionConsumer.<init>(ConnectionConsumer.java:124)
at com.sap.jms.client.connection.Connection.createConnectionConsumer(Connection.java:167)
at com.sap.jms.resourceadapter.RaActivation.setUpConnectionConsumer(RaActivation.java:165)
at com.sap.jms.resourceadapter.RaActivation.activate(RaActivation.java:128)
... 43 more
An attempt to stop message delivery will be performed. Activation request was applicationName=vmtubes.de/ratestmdb~ear,connectionFactoryName : Testfactory,mAcknowledgeMode : null,maxPoolSize : 50,mClientId : null,mDestinationName : RA.IBMSOLLIST.ASSOLLIST.001,mDestinationType : javax.jms.Queue,minPoolSize : 0,mMessageSelector : null,mSubscriptionDurability : null,mSubscriptionName : null,mReconnectAttempts : 10,mSleepBetweenAttempts : 1000,mParallelConsumers : 1
JMS session closed:
=================================== Session ====================================
ID: 17
Type: (Generic)Session
ConnectionID: 9444418335539219
AcknowledgeMode: Transacted session!
================================================================================
Connection context doesn't exists ! id =
Removing unreferenced connection ID =
Connection context doesn't exists ! id =
Connection closed:
================================== Connection ==================================
ID 9444418335539219
Type (Generic)Connection
Mode STOPPED
isClosed YES
client = com.sap.jms.server.remote.JMSRemoteClientImpl857822
server = RMI_P4: Local Dynamic Stub for impl -> com.sap.jms.server.remote.JMSRemoteServerImpl18f254f
P4 Remote Object Info : com.sap.engine.services.rmi_p4.server.P4ServerObjectInfo100
|- broker id : -752547698
|- server id : 2198950
|- client Id : -1
|- local Id : 2198950
|- is redirectable : false
|- redir Ident :
|- factory Name : null
|- objId : null
|- server loader name : null
|- connected : false
|- supportOptimization : true
|- protocol : 76 31 v1
Remote Interfaces :
Interface : [0] = com.sap.jms.server.remote.JMSRemoteServer
Interface : [1] = com.sap.engine.services.rmi_p4.interfaces.P4Notification
=========================================
Connection profiles :
connection profile : [0] = None:195.233.66.25:50004
=========================================
packetFactory = com.sap.jms.protocol.PacketFactoryImple9cc66
thread pool = com.sap.engine.core.service630.context.core.thread.ThreadSystemImpl1b57cfa
isClosed = true
runFlag = false
isRunning = true
ConnectionMetaData -
JMSVersion 1.1
PorviderVersion Version 1.0
SupportedJMSXProperties JMSXGroupID, JMSXGroupSeq
================================================================================
com.sap.jms.client.connection.RemoteQueueConnection16a7da2 isUsed = true
Here the Telnet output :
>lookup jms_vendor_queues_local/vmtubes.de/ratestmdb~ear/RA.IBMSOLLIST.ASSOLLIST.001
Trying to connect...
Connected.
[Shell -> LOOKUP] Location : /jms_vendor_queues_local/vmtubes.de/ratestmdb~ear
/RA.IBMSOLLIST.ASSOLLIST.001
[Shell -> LOOKUP] Contains : Reference Class Name: com.ibm.mq.jms.MQQueue
Type: VER
Content: 1
Type: EXP
Content: -2
Type: PRI
Content: -2
Type: PER
Content: -2
Type: CCS
Content: 1208
Type: TC
Content: 0
Type: ENC
Content: 273
Type: FIQ
Content: 1
Type: QU
Content: RA.IBMSOLLIST.ASSOLLIST.001
Type: QMGR
Content:
[Shell -> LOOKUP] Class name : javax.naming.Reference
>llr -all -f com/ibm/mq/jms/MQQueue.class
jar:file:/C:/usr/sap/J2E/J00/j2ee/cluster/bin/ext/MQSLibrary/com.ibm.mq.jms.jar!
/com/ibm/mq/jms/MQQueue.class
jar:file:/C:/usr/sap/J2E/J00/j2ee/cluster/apps/vmtubes.de/mq%7Ebase%7Eserver%7El
ib/app_libraries_container/com.ibm.mq.jms.jar!/com/ibm/mq/jms/MQQueue.class
Locke -
Message Driven Bean: problem with @RunAs annotation
I am having a problem using the @RunAs annotation in a message driven bean.
I would like the code in my onMessage() method to be executed with a specific role/user, so I want to use the @RunAs annotation to achieve this.
I am running weblogic 10.0.
I have created the following in weblogic console:
- Group "TestGroup"
- User "TestUser", member of "TestGroup"
- Global Role "TestRole", role condition: "Group : TestGroup"
The MDB:
package be.cegeka.test.mdb;
import javax.annotation.Resource;
import javax.annotation.security.RunAs;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.ejb.MessageDrivenContext;
import javax.jms.Message;
import javax.jms.MessageListener;
@MessageDriven(
mappedName = "testQueue",
name = "TestMDB",
activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
@RunAs("TestRole")
public class TestMDB implements MessageListener {
@Resource
private MessageDrivenContext mdContext;
* {@inheritDoc}}
public void onMessage(Message msg) {
System.out.println("Handling message for user "
+ mdContext.getCallerPrincipal().getName());
}[u]The ejb-jar.xml file:
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd"
version="3.0">
<assembly-descriptor>
<security-role>
<description>
Test Role.
</description>
<role-name>TestRole</role-name>
</security-role>
</assembly-descriptor>
</ejb-jar>
The weblogic-ejb-jar.xml file:
<weblogic-ejb-jar xmlns="http://www.bea.com/ns/weblogic/10.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.bea.com/ns/weblogic/10.0 http://www.bea.com/ns/weblogic/10.0/weblogic-ejb-jar.xsd">
<security-role-assignment>
<role-name>TestRole</role-name>
<principal-name>TestUser</principal-name>
</security-role-assignment>
</weblogic-ejb-jar>I would have thought that the onMessage of the MDB would print "Handling message for user TestUser", but instead it prints "Handling message for user <anonymous>".
It seems as though the @RunAs annotation has no effect. Although I specified the role TestRole (mapped to the user TestUser), the code still seems to be executed by user anonymous.
Am I missing something?
Any help would be much appreciated! I've been looking at this poblem for quite a while now.Both beans (the MDB on WLS 10 and the session bean on WLS 8.1) use container managed transactions.
For the MDB I do not explicitly set the transaction attributes, so it should default to container managed transactions.
For the stateless session bean I have specified the following in the ejb-jar.xml file:
<ejb-jar>
<display-name>Weblogic8Service</display-name>
<enterprise-beans>
<session>
<ejb-name>Weblogic8Service</ejb-name>
<home>be.cegeka.rszv.test.session.Weblogic8ServiceRemoteHome</home>
<remote>be.cegeka.rszv.test.session.Weblogic8ServiceRemote</remote>
<ejb-class>be.cegeka.rszv.test.session.Weblogic8ServiceBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
</enterprise-beans>
<assembly-descriptor>
<container-transaction>
<method>
<ejb-name>Weblogic8Service</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
</assembly-descriptor>
</ejb-jar>So as far as I understand it the transaction starts at the MDB (upon receival of a message). The transaction for the remote call to the stateless session bean (in the onMessage() of the MDB) is included in the transaction of the MDB and gets committed when the onMessage() method finishes and the transaction of the MDB itself gets committed.
Correct me if I'm wrong here. -
Message Driven Bean - Configuration problem
Hi
I have created the connection factory as jms/ConnectionFactory and physical destination as PhysicalQueue and queue as jms/Queue as per
http://java.sun.com/j2ee/1.4/docs/tutorial/doc/MDB5.html#wp79772
http://java.sun.com/j2ee/1.4/docs/tutorial/doc/MDB6.html
But I am getting the following exception
[#|2005-03-10T13:36:52.970+0530|SEVERE|sun-appserver-pe8.0.0_01|javax.enterprise.system.core.classloading|_ThreadID=11;|LDR5004: UnExpected error occured while creating ejb container
javax.naming.NamingException: Message Destination Reference java:comp/env/jms/Queue has not been linked to a Message Destination
at com.sun.enterprise.naming.NamingManagerImpl.bindObjects(NamingManagerImpl.java:450)
at com.sun.ejb.containers.BaseContainer.setupEnvironment(BaseContainer.java:1759)
at com.sun.ejb.containers.BaseContainer.<init>(BaseContainer.java:376)
at com.sun.ejb.containers.MessageBeanContainer.<init>(MessageBeanContainer.java:118)
at com.sun.ejb.containers.ContainerFactoryImpl.createContainer(ContainerFactoryImpl.java:196)
at com.sun.enterprise.server.AbstractLoader.loadEjbs(AbstractLoader.java:477)
at com.sun.enterprise.server.ApplicationLoader.load(ApplicationLoader.java:125)
at com.sun.enterprise.server.TomcatApplicationLoader.load(TomcatApplicationLoader.java:96)
at com.sun.enterprise.server.ApplicationManager.applicationDeployed(ApplicationManager.java:205)
at com.sun.enterprise.server.ApplicationManager.applicationDeployed(ApplicationManager.java:156)
at com.sun.enterprise.server.ApplicationManager.applicationDeployed(ApplicationManager.java:480)
at com.sun.enterprise.admin.event.AdminEventMulticaster.invokeApplicationDeployEventListener(AdminEventMulticaster.java:448)
at com.sun.enterprise.admin.event.AdminEventMulticaster.handleApplicationDeployEvent(AdminEventMulticaster.java:432)
at com.sun.enterprise.admin.event.AdminEventMulticaster.processEvent(AdminEventMulticaster.java:299)
at com.sun.enterprise.admin.event.AdminEventMulticaster.multicastEvent(AdminEventMulticaster.java:107)
at com.sun.enterprise.admin.server.core.mbean.config.ManagedServerInstance.multicastEvent(ManagedServerInstance.java:3880)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at com.sun.enterprise.admin.server.core.jmx.Introspector.invokeMethodOn(Introspector.java:181)
at com.sun.enterprise.admin.server.core.mbean.config.AdminBase.invoke(AdminBase.java:86)
at com.sun.enterprise.admin.server.core.mbean.config.ConfigMBeanBase.invoke(ConfigMBeanBase.java:680)
at com.sun.jmx.mbeanserver.DynamicMetaDataImpl.invoke(DynamicMetaDataImpl.java:221)
at com.sun.jmx.mbeanserver.MetaDataImpl.invoke(MetaDataImpl.java:228)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:
My ejb-jar.xml is as below
<?xml version='1.0' encoding='UTF-8'?>
<ejb-jar
xmlns="http://java.sun.com/xml/ns/j2ee"
version="2.1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd"
>
<display-name>RegJAR</display-name>
<enterprise-beans>
<message-driven>
<ejb-name>RegistrationMDBean</ejb-name>
<ejb-class>com.registration.ejb.RegistrationMDBean</ejb-class>
<messaging-type>javax.jms.MessageListener</messaging-type>
<transaction-type>Container</transaction-type>
<message-destination-type>javax.jms.Queue</message-destination-type>
<message-destination-link>PhysicalQueue</message-destination-link>
<message-destination-ref>
<message-destination-ref-name>jms/Queue</message-destination-ref-name>
<message-destination-type>javax.jms.Queue</message-destination-type>
<message-destination-usage>Consumes</message-destination-usage>
<message-destination-link>PhysicalQueue</message-destination-link>
</message-destination-ref>
</message-driven>
</enterprise-beans>
<assembly-descriptor>
<container-transaction>
<method>
<ejb-name>RegistrationMDBean</ejb-name>
<method-name>onMessage</method-name>
<method-params>
<method-param>javax.jms.Message</method-param>
</method-params>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
</assembly-descriptor>
</ejb-jar>
Thanks
SuneeshIn stead of selecting the message destination I have selected the Message Dest Ref tab .But when I selected the message destination tab of JAR file I am getting the following error
[#|2005-03-10T15:51:22.263+0530|INFO|sun-appserver-pe8.0.0_01|javax.enterprise.system.tools.admin|_ThreadID=12;|ADM1041:Sent the event to instance:[ApplicationDeployEvent -- enable MDBEg]|#]
[#|2005-03-10T15:51:22.283+0530|SEVERE|sun-appserver-pe8.0.0_01|javax.enterprise.system.container.ejb.mdb|_ThreadID=12;|MDB00017: [RegistrationMDBean]: Exception in creating message-driven bean container: [com.sun.enterprise.connectors.ConnectorRuntimeException: JMS resource not created : ]|#]
[#|2005-03-10T15:51:22.283+0530|SEVERE|sun-appserver-pe8.0.0_01|javax.enterprise.system.container.ejb.mdb|_ThreadID=12;|com.sun.enterprise.connectors.ConnectorRuntimeException
com.sun.enterprise.connectors.ConnectorRuntimeException: JMS resource not created :
at com.sun.enterprise.connectors.system.ActiveJmsResourceAdapter.getPhysicalDestinationFromConfiguration(ActiveJmsResourceAdapter.java:296)
at com.sun.enterprise.connectors.system.ActiveJmsResourceAdapter.updateMDBRuntimeInfo(ActiveJmsResourceAdapter.java:232)
at com.sun.enterprise.connectors.inflow.ConnectorMessageBeanClient.setup(ConnectorMessageBeanClient.java:139)
at com.sun.ejb.containers.MessageBeanContainer.<init>(MessageBeanContainer.java:189)
at com.sun.ejb.containers.ContainerFactoryImpl.createContainer(ContainerFactoryImpl.java:196)
at com.sun.enterprise.server.AbstractLoader.loadEjbs(AbstractLoader.java:477)
at com.sun.enterprise.server.ApplicationLoader.load(ApplicationLoader.java:125)
at com.sun.enterprise.server.TomcatApplicationLoader.load(TomcatApplicationLoader.java:96)
at com.sun.enterprise.server.ApplicationManager.applicationDeployed(ApplicationManager.java:205)
at com.sun.enterprise.server.ApplicationManager.applicationDeployed(ApplicationManager.java:156)
at com.sun.enterprise.server.ApplicationManager.applicationEnabled(ApplicationManager.java:590)
at com.sun.enterprise.admin.event.AdminEventMulticaster.invokeApplicationDeployEventListener(AdminEventMulticaster.java:454)
at com.sun.enterprise.admin.event.AdminEventMulticaster.handleApplicationDeployEvent(AdminEventMulticaster.java:432)
at com.sun.enterprise.admin.event.AdminEventMulticaster.processEvent(AdminEventMulticaster.java:299)
at com.sun.enterprise.admin.event.AdminEventMulticaster.multicastEvent(AdminEventMulticaster.java:107)
at com.sun.enterprise.admin.server.core.mbean.config.ManagedServerInstance.multicastEvent(ManagedServerInstance.java:3880)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at com.sun.enterprise.admin.server.core.jmx.Introspector.invokeMethodOn(Introspector.java:181)
at com.sun.enterprise.admin.server.core.mbean.config.AdminBase.invoke(AdminBase.java:86)
at com.sun.enterprise.admin.server.core.mbean.config.ConfigMBeanBase.invoke(ConfigMBeanBase.java:68
Thanks
Suneesh -
Message Driven bean: message always removed from queue
We use MDB to dequeue messages from database queue (AQ) and want to handle errors: if the transaction rolls back, message should have retry_count updated and after defined retries should move to exception queue.
The problem is, that with all combinations of transactions settings, the message is removed from queue before onMessage is called. If I use Container managed transactions with Mandatory transaction attribute, call to setRollbackOnly fails with message "java.lang.IllegalStateException: Cannot call setRollbackOnly() current thread is NOT associated with a transaction."
How can I write a MDB, which can commit or rollback message depending on whether exception is or is not thrown? I use JDev 10.1.3.
Thanks,
Viliam
Here are my files:
ejb-jar.xml:
<?xml version = '1.0' encoding = 'windows-1250'?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
<ejb-jar>
<enterprise-beans>
<message-driven>
<description>Message Driven Bean</description>
<display-name>SendSMSBean</display-name>
<ejb-name>SendSMSBean</ejb-name>
<ejb-class>sk.transacty.cc.ejb.SendSMSBeanBean</ejb-class>
<transaction-type>Container</transaction-type>
<acknowledge-mode>Auto-acknowledge</acknowledge-mode>
<message-driven-destination>
<destination-type>javax.jms.Queue</destination-type>
</message-driven-destination>
<resource-ref>
<res-ref-name>jdbc/CCDataSource</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</message-driven>
</enterprise-beans>
<assembly-descriptor>
<container-transaction>
<method>
<ejb-name>SendSMSBean</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>Mandatory</trans-attribute>
</container-transaction>
</assembly-descriptor>
</ejb-jar>orion-ejb-jar.xml:
<?xml version = '1.0' encoding = 'windows-1250'?>
<!DOCTYPE orion-ejb-jar PUBLIC "-//Evermind//DTD Enterprise JavaBeans 1.1 runtime//EN" "http://xmlns.oracle.com/ias/dtds/orion-ejb-jar.dtd">
<orion-ejb-jar>
<enterprise-beans>
<message-driven-deployment max-instances="1" name="SendSMSBean" connection-factory-location="java:comp/resource/jmsAQ/QueueConnectionFactories/aqQue" destination-location="java:comp/resource/jmsAQ/Queues/msg_queue" listener-threads="1" min-instances="0"/>
</enterprise-beans>
<assembly-descriptor>
<default-method-access>
<security-role-mapping impliesAll="true" name="<default-ejb-caller-role>"/>
</default-method-access>
</assembly-descriptor>
</orion-ejb-jar>As far as I know XMLType JMS messages are not supported when using OJMS. They might be for OC4J 10.1.3, but I thought it's an AQ limitation rather than an OC4J one.. To be sure you might just log a TAR on Metalink.
hth,
Bastiaan -
Message-driven bean problem (re-delivering of JMS msg)
Sorry for crossposting this (already posted in JMS forum), but perhaps someone here (who doesn't read JMS forum) knows the answer to this problem - it's basically a JMS problem, but closely related to EJB:
I browsed through all available docs but found no answer to this question: How can I force the re-delivery of a JMS message to happen in a few minutes instead of immediately?
I use JMS in an EJB container (SonicQ in Borland Enterprise Server 5.0.1) and messages are consumed by a message-driven bean. The problem arises when the bean sets the transaction in which the onMessage() function is called to rollback-only: Then, the message is redelivered immediately again causing an infinte processing loop and 100% CPU load on the machine until the message is finally consumed.
Is it possible to set a timeout for such a "temporarily rejected" message so that it is retries in a few minutes? Would that be a programming issue, or a configuration issue of the container and/or JMS?Hi Chranq,
What you are talkin about is a container configuration thing as far as I can figure out. I may be that your JMS implementation doesn't support it.
/Stig -
Message Driven Bean reading multiple times from a jms queue
Hi,
I am facing a strange problem with my message driven bean. Its configured to read message from a jms queue. But sometimes it read the same message multiple times from the jms queue.
We are using weblogic server 8.1 sp5.
Please find below our descriptor files
ejb-jar.xml
<ejb-jar>
<display-name>ClarifyCRM_Process_Manager_13.1</display-name>
<enterprise-beans>
<session>
<display-name>ProcessManager</display-name>
<ejb-name>ProcessManager</ejb-name>
<home>com.clarify.procmgr.ejb.ProcessManagerHome</home>
<remote>com.clarify.procmgr.ejb.ProcessManagerRemote</remote>
<ejb-class>com.clarify.procmgr.ejb.ProcessManagerEJB</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
<message-driven>
<display-name>ProcessManagerListener</display-name>
<ejb-name>ProcessManagerListener</ejb-name>
<ejb-class>com.clarify.procmgr.ejb.ProcessManagerMDB</ejb-class>
<transaction-type>Bean</transaction-type>
<acknowledge-mode>Auto-acknowledge</acknowledge-mode>
<message-driven-destination>
<destination-type>javax.jms.Queue</destination-type>
</message-driven-destination>
</message-driven>
</enterprise-beans>
<assembly-descriptor>
<container-transaction>
<method>
<ejb-name>ProcessManager</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
</assembly-descriptor>
</ejb-jar>
weblogic-ejb-jar.xml
<weblogic-ejb-jar>
<weblogic-enterprise-bean>
<ejb-name>ProcessManager</ejb-name>
<stateless-session-descriptor>
<pool>
<max-beans-in-free-pool>100</max-beans-in-free-pool>
<initial-beans-in-free-pool>10</initial-beans-in-free-pool>
</pool>
</stateless-session-descriptor>
<enable-call-by-reference>False</enable-call-by-reference>
<jndi-name>ProcessManagerHome</jndi-name>
<dispatch-policy>PMExecuteQueue</dispatch-policy>
<remote-client-timeout>0</remote-client-timeout>
</weblogic-enterprise-bean>
<weblogic-enterprise-bean>
<ejb-name>ProcessManagerListener</ejb-name>
<message-driven-descriptor>
<pool>
<max-beans-in-free-pool>100</max-beans-in-free-pool>
<initial-beans-in-free-pool>10</initial-beans-in-free-pool>
</pool>
<destination-jndi-name>clarify.procmgr.jms.queue.Execution</destination-jndi-name>
<connection-factory-jndi-name>clarify.procmgr.jms.factories.ExecConnection</connection-factory-jndi-name>
</message-driven-descriptor>
<enable-call-by-reference>True</enable-call-by-reference>
<dispatch-policy>PMListenerExecuteQueue</dispatch-policy>
<remote-client-timeout>0</remote-client-timeout>
</weblogic-enterprise-bean>
</weblogic-ejb-jar> The MDB is sometimes reading multiple times from clarify.procmgr.jms.queue.Execution
Also i would like to add here that the connection factory we are using clarify.procmgr.jms.factories.ExecConnection is having the following properties
ServerAffinity Enabled=true
XA connection factory enabled=false.
Please help me out here!!Maybe, your MDB "sometimes" throws an Exception in onMessage.
Check if this happens when you set <max-beans-in-free-pool>1</max-beans-in-free-pool>. -
Message driven bean: resource not created
Hi,
I'm having trouble deploying a simple test app that I've created (in App Server Platform Edition 8.0). It contains a servlet, that posts messages to a queue, and which appears to work fine. There is also a message-driven bean that receives these messages, but it will not deploy as is. I would be grateful for any assistance in working out why. Apologies if I'm missing something obvious, but the technology is quite new to me.
I get the following error in the server log -
[#|2004-07-14T14:03:49.640+0100|SEVERE|sun-appserver-pe8.0|javax.enterprise.system.container.ejb|_ThreadID=12;|EJB5090: Exception in creating EJB container [com.sun.enterprise.connectors.ConnectorRuntimeException: JMS resource not created : joeMDB]|#]
[#|2004-07-14T14:03:49.656+0100|SEVERE|sun-appserver-pe8.0|javax.enterprise.system.container.ejb|_ThreadID=12;|appId=mdbtest moduleName=ejb-jar-ic_jar ejbName=joeMDB|#]
[#|2004-07-14T14:03:49.656+0100|SEVERE|sun-appserver-pe8.0|javax.enterprise.system.core.classloading|_ThreadID=12;|LDR5004: UnExpected error occured while creating ejb container
com.sun.enterprise.connectors.ConnectorRuntimeException: JMS resource not created : joeMDB
at com.sun.enterprise.connectors.system.ActiveJmsResourceAdapter.getPhysicalDestinationFromConfiguration(ActiveJmsResourceAdapter.java:296)
at com.sun.enterprise.connectors.system.ActiveJmsResourceAdapter.updateMDBRuntimeInfo(ActiveJmsResourceAdapter.java:232)
at com.sun.enterprise.connectors.inflow.ConnectorMessageBeanClient.setup(ConnectorMessageBeanClient.java:139)
at com.sun.ejb.containers.MessageBeanContainer.<init>(MessageBeanContainer.java:189)
- which I can't find referenced in any other forum post. The relevant deployment descriptors are as follows -
ejb-jar.xml -
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar xmlns="http://java.sun.com/xml/ns/j2ee" version="2.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd">
<display-name>mdbJar</display-name>
<enterprise-beans>
<message-driven>
<ejb-name>joeMDB</ejb-name>
<ejb-class>joeMDB</ejb-class>
<messaging-type>javax.jms.MessageListener</messaging-type>
<transaction-type>Container</transaction-type>
<message-destination-type>javax.jms.Queue</message-destination-type>
<message-destination-link>jms/JoeDestQueue</message-destination-link>
<message-destination-ref>
<message-destination-ref-name>jmsJoeDestQueue</message-destination-ref-name>
<message-destination-type>javax.jms.Queue</message-destination-type>
<message-destination-usage>Consumes</message-destination-usage>
<message-destination-link>jms/JoeDestQueue</message-destination-link>
</message-destination-ref>
</message-driven>
</enterprise-beans>
<assembly-descriptor>
<container-transaction>
<method>
<ejb-name>joeMDB</ejb-name>
<method-name>onMessage</method-name>
<method-params>
<method-param>javax.jms.Message</method-param>
</method-params>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
<message-destination>
<message-destination-name>jms/JoeDestQueue</message-destination-name>
</message-destination>
</assembly-descriptor>
</ejb-jar>
sun-ejb-jar.xml -
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sun-ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 8.0 EJB 2.1//EN" "http://www.sun.com/software/appserver/dtds/sun-ejb-jar_2_1-0.dtd">
<sun-ejb-jar xmlns="http://java.sun.com/xml/ns/j2ee">
<enterprise-beans>
<unique-id>0</unique-id>
<ejb>
<ejb-name>joeMDB</ejb-name>
<jndi-name>joeMDB</jndi-name>
<pass-by-reference>false</pass-by-reference>
<mdb-connection-factory>
<jndi-name>jms/joeFactory</jndi-name>
</mdb-connection-factory>
<jms-max-messages-load>1</jms-max-messages-load>
<is-read-only-bean>false</is-read-only-bean>
<refresh-period-in-seconds>-1</refresh-period-in-seconds>
<cmt-timeout-in-seconds>0</cmt-timeout-in-seconds>
<gen-classes/>
<bean-pool>
<steady-pool-size>-1</steady-pool-size>
<resize-quantity>-1</resize-quantity>
<max-pool-size>-1</max-pool-size>
<pool-idle-timeout-in-seconds>-1</pool-idle-timeout-in-seconds>
<max-wait-time-in-millis>-1</max-wait-time-in-millis>
</bean-pool>
</ejb>
<message-destination>
<message-destination-name>jms/JoeDestQueue</message-destination-name>
<jndi-name>jms/JoeDestQueue</jndi-name>
</message-destination>
</enterprise-beans>
</sun-ejb-jar>
Thanks,
JoeHi, Joe,
The message says that
JMS resource not created : joeMDB
The command to add the missing Queue:
asadmin create-jms-resource user admin restype javax.jms.Queue JoeDestQueue
Please note:
in your sun-ejb-jar.xml, the real JNDI name for the Queue is JoeDestQueue.
Double check the namings for the Queue in both ejb-jar.xml and sun-ejb-jar.xml.
You only need two names for one Queue: one is for JNDI, one is for reference.
_Dianne -
Message-driven bean CMT can not be supported
Hi,
I�m trying to use IBM MQSeries 5.3 with S1AS7. The AS and MQ run under W2K SP3. At first I had no problem with deploying and running samples. I used C:\Sun\AppServer7\samples\ejb\mdb\simple\
I was able to put a test message into MQSeries queue and I saw it was processed by the MDB
Then I decided to change <transaction-type> from �Bean� to �Container� and I added <assembly-descriptor> where I set <trans-attribute> as �Required�.
Here is my new ejb-jar.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN' 'http://java.sun.com/dtd/ejb-jar_2_0.dtd'>
<!-- Copyright 2002 Sun Microsystems, Inc. All rights reserved. -->
<ejb-jar>
<display-name>SimpleMessageJAR</display-name>
<enterprise-beans>
<message-driven>
<display-name>SimpleMessageEJB</display-name>
<ejb-name>SimpleMessageEJB</ejb-name>
<ejb-class>samples.ejb.mdb.simple.ejb.SimpleMessageBean</ejb-class>
<transaction-type>Container</transaction-type>
<message-driven-destination>
<destination-type>javax.jms.Queue</destination-type>
</message-driven-destination>
</message-driven>
</enterprise-beans>
<assembly-descriptor>
<container-transaction>
<method>
<ejb-name>SimpleMessageEJB</ejb-name>
<method-name>onMessage</method-name>
<method-params>
<method-param>javax.jms.Message</method-param>
</method-params>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
</assembly-descriptor>
</ejb-jar>
In this case I have the following server.log
[15/Dec/2002:15:29:00] FINE ( 1700): Requesting Server Session at: 1039955340843
[15/Dec/2002:15:29:00] FINE ( 1700): Got Server Session at: 1039955340859(1039955340843)
[15/Dec/2002:15:29:00] INFO ( 1700): CORE3282: stdout: In SimpleMessageBean.SimpleMessageBean()
[15/Dec/2002:15:29:00] FINEST ( 1700): Thread[MQQueueAgent (MYASQUEUE),5,RMI Runtime]: got session: com.sun.enterprise.jms.SessionWrapperBase@3c9616 from com.iplanet.ias.ejb.containers.IASServerSessionImpl@3508c0
[15/Dec/2002:15:29:00] INFO ( 1700): CORE3282: stdout: In SimpleMessageBean.setMessageDrivenContext()
[15/Dec/2002:15:29:00] INFO ( 1700): CORE3282: stdout: In SimpleMessageBean.ejbCreate()
[15/Dec/2002:15:29:00] FINEST ( 1700): start(): calling notify... com.iplanet.ias.ejb.containers.IASServerSessionImpl@3508c0
[15/Dec/2002:15:29:00] FINEST ( 1700): run(): after wait ... com.iplanet.ias.ejb.containers.IASServerSessionImpl@3508c0
[15/Dec/2002:15:29:00] FINEST ( 1700): Thread[Thread-28,5,RMI Runtime]: run(): calling Session.run() ... com.iplanet.ias.ejb.containers.IASServerSessionImpl@3508c0
[15/Dec/2002:15:29:00] FINEST ( 1700): Thread[Thread-28,5,RMI Runtime]: message-driven bean container onMessage :
JMS Message class: jms_text
JMSType: null
JMSDeliveryMode: 1
JMSExpiration: 0
JMSPriority: 0
JMSMessageID: ID:414d5120514d5f636c6f7564202020200628fc3d2000020f
JMSTimestamp: 1039955340820
JMSCorrelationID:null
JMSDestination: null
JMSReplyTo: null
JMSRedelivered: false
JMS_IBM_PutDate:20021215
JMSXAppID:C:\WINNT\system32\mmc.exe
JMS_IBM_Format:MQSTR
JMS_IBM_PutApplType:11
JMS_IBM_MsgType:8
JMSXUserID:alex
JMS_IBM_PutTime:12290082
JMSXDeliveryCount:1
111111111111111111
[15/Dec/2002:15:29:00] FINEST ( 1700): beforeMessageDelivery() not called
[15/Dec/2002:15:29:00] INFO ( 1700): MDB00040: [mdb-simple:SimpleMessageEJB]: Message-driven bean CMT can not be supported.
[15/Dec/2002:15:29:00] SEVERE ( 1700): MDB0008: Session.run() throws Exception [Message-driven bean CMT can not be supported.]
[15/Dec/2002:15:29:00] SEVERE ( 1700): MDB0009: Session.run() throws Exception
java.lang.RuntimeException: Message-driven bean CMT can not be supported.
at com.sun.enterprise.jms.SessionWrapperBase.run(SessionWrapperBase.java:200)
at com.iplanet.ias.ejb.containers.IASServerSessionImpl.run(IASServerSessionImpl.java:191)
at java.lang.Thread.run(Thread.java:536)
[15/Dec/2002:15:29:00] FINEST ( 1700): Thread[Thread-28,5,RMI Runtime]: in run(): return object com.iplanet.ias.ejb.containers.IASServerSessionImpl@3508c0 to pool ...
[15/Dec/2002:15:29:00] FINEST ( 1700): run(): before wait ... com.iplanet.ias.ejb.containers.IASServerSessionImpl@3508c0
If I use internal AS JMS I don�t have any trouble. Everything works fine.
Why it is possible to use MDB CMT with internal AS JMS provider?
What should I do to create MDB CMT with IBM MQSeries?
Alexei GladkovHi Alexei,
Sun ONE Application Server 7 does not support CMT MDBs with 3rd party JMS providers. (As you note, BMT MDBs work with MQSeries and Sun ONE App Server).
With the advent of the next J2EE CA spec version (1.5) and J2EE 1.4, a standard means of hooking JMS providers into app servers and MDBs will be made available. Shortly after J2EE 1.4 is released, you'll see this support in Sun ONE App Server.
From the J2EE 1.4 spec: "The Connector API now supports integration with asynchronous messaging systems, including the ability to plug in JMS providers."
Thanks,
Chris -
My problem in Weblogic and Message Driven Bean for Topic
Hello to all
I used this page (http://www.ecomputercoach.com/index.php/component/content/article/90-weblogic-jms-queue-setup.html?showall=1)
for setup JMS Server, Queue, Connection Factory on Weblogic Server
and I created a Message Driven Bean ,I used those Queue , and all things was OK
But I wanted to setup a Topic and use it in this manner
I created a Topic like previous steps for setup Queue
(http://www.ecomputercoach.com/index.php/component/content/article/90-weblogic-jms-queue-setup.html?showall=1)
Except in Step 3 ,I selected Topic instead of Queue
then I created a Message Driven Bean in JDeveloper , my Message Driven Bean is like this:
@MessageDriven(mappedName = "jndi.testTopic")
<p>
public class aliJMS1_MessageDrivenEJBBean implements MessageListener {
public void onMessage(Message message) {
if(message instanceof TextMessage ){
TextMessage txtM=(TextMessage) message;
try{
System.out.println(txtM.getText());
}catch(Exception ex){
ex.printStackTrace();
</p>
When I deploy the Application , Weblogic shows me this error:
+<Aug 30, 2011 11:32:28 AM PDT> <Warning> <EJB> <BEA-010061> <The Message-Driven EJB: aliJMS1_MessageDrivenEJBBean is unable to connect to th+
e JMS destination: jndi.testTopic. The Error was:
+[EJB:011011]The Message-Driven EJB attempted to connect to the JMS destination with the JNDI name: jndi.testTopic. However, the object with+
the JNDI name: jndi.testTopic is not a JMS destination, or the destination found was of the wrong type (Topic or Queue).>
And when I send message to the topic The Message Dirven Bean dosen't work
But when I create an ordinary Java application like this (it uses that Tpoic) :
import java.io.*;
import java.util.*;
import javax.transaction.*;
import javax.naming.*;
import javax.jms.*;
public class TopicReceive implements MessageListener
public final static String JNDI_FACTORY =
"weblogic.jndi.WLInitialContextFactory";
public final static String JMS_FACTORY =
"jndi.testConnectionFactory";
public final static String TOPIC = "jndi.testTopic";
private TopicConnectionFactory tconFactory;
private TopicConnection tcon;
private TopicSession tsession;
private TopicSubscriber tsubscriber;
private Topic topic;
private boolean quit = false;
public void onMessage(Message msg) {
try {
String msgText;
if (msg instanceof TextMessage) {
msgText = ((TextMessage)msg).getText();
} else {
msgText = msg.toString();
System.out.println("JMS Message Received: " + msgText);
if (msgText.equalsIgnoreCase("quit")) {
synchronized (this) {
quit = true;
this.notifyAll();
} catch (JMSException jmse) {
jmse.printStackTrace();
public void init(Context ctx, String topicName) throws NamingException,
JMSException {
tconFactory = (TopicConnectionFactory)ctx.lookup(JMS_FACTORY);
tcon = tconFactory.createTopicConnection();
tsession = tcon.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
topic = (Topic)ctx.lookup(topicName);
tsubscriber = tsession.createSubscriber(topic);
tsubscriber.setMessageListener(this);
tcon.start();
public void close() throws JMSException {
tsubscriber.close();
tsession.close();
tcon.close();
public static void main(String[] args) throws Exception {
InitialContext ic = getInitialContext("t3://127.0.0.1:7001");
TopicReceive tr = new TopicReceive();
tr.init(ic, TOPIC);
System.out.println("JMS Ready To Receive Messages (To quit, send a \"quit\" message).");
synchronized (tr) {
while (!tr.quit) {
try {
tr.wait();
} catch (InterruptedException ie) {
tr.close();
private static InitialContext getInitialContext(String url) throws NamingException {
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
env.put(Context.PROVIDER_URL, url);
env.put("weblogic.jndi.createIntermediateContexts", "true");
return new InitialContext(env);
It's OK and shows messages When I send message to the Topic
Now I want know why the Message Driven Bean doesn't work for those Topic
I want create a Message Driven Bean for Topic in the same way I created for Queue
I don't know what is problem , please advice me
ThanksCould you try adding a activationconfig to the message-driven bean, for example,
@MessageDriven(mappedName = "jndi.testTopic", activationConfig = {
@ActivationConfigProperty(propertyName = "destinationName", propertyValue = "jndi.testTopic"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic")
public class aliJMS1_MessageDrivenEJBBean implements MessageListener {
public void onMessage(Message message) {
if(message instanceof TextMessage ){
TextMessage txtM=(TextMessage) message;
try{
System.out.println(txtM.getText());
}catch(Exception ex){
ex.printStackTrace();
} -
Message Driven Beans: how to receive and send in a single session?
Hello
How to receive and send JMS messages in a message driven bean using a single session?
Thanks.Are you referring to writing code within the onMessage method itself to receive JMS messages?
If so, that is not a pattern that is recommended, especially not in the case of a blocking JMS
receieve. If you must write an explicit JMS receive within an EJB component it's best to use
a "check the queue" approach where you give a very small timeout for the receive. That way
if the message is there it will be returned but if not the call will not block.
You'll also need to take the transactional settings of the onMessage method into account.
If your are sending a message and then waiting for a response, those two actions can
not be done within the same global transaction. For that, you'll need to either use
BMT and perform each in its own transaction or just not use global transactions at all,
in which case each send and receive operation will be atomic.
--ken
Maybe you are looking for
-
Trying to send a multipart email
When I run this piece of code I get the following error. msgBody is a html tagged text variable. Any suggestions? Message emailMsg = new MimeMessage(session); emailMsg.setFrom(new InternetAddress(from)); InternetAddress[] address = {new InternetAddre
-
Web Dynpro Layout - Shows The page cannot be displayed
Hi I am getting "The page cannot be displayed" in the Layout Tab of Web Dynpro - View Component. Can someone help me to fix this issue. Regards Venkat
-
How to deploye .war files in SOA_Server1 ?
Hi, I was created Auto Generated Task form for Human Task in 11G.After that how to deploye .WAR files manually in "Infra -Soa(Soa_srerver1)" .Plz help me now
-
One office mac lost connection to TC, was working fine for quite some time. TC is not available for TM BU and AP utility does not see the device. But TC is & has been working fine for other wired macs and wireless MBP's. Read the threads and can't fi
-
Hello all, I searched the archives (and Forte technotes) and couldn't find anything about this. We have an application that is intermittently giving this problem: USER ERROR: The partition OTSWindows_cl0_Client terminated due to an exception. See the