You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@activemq.apache.org by "Andrzej Więcław (JIRA)" <ji...@apache.org> on 2013/04/19 11:45:19 UTC
[jira] [Created] (AMQ-4476) ActiveMQ WebSphere 7 JMS Provider - MBD
- message consumed even though transaction marked for rollback
Andrzej Więcław created AMQ-4476:
------------------------------------
Summary: ActiveMQ WebSphere 7 JMS Provider - MBD - message consumed even though transaction marked for rollback
Key: AMQ-4476
URL: https://issues.apache.org/jira/browse/AMQ-4476
Project: ActiveMQ
Issue Type: Bug
Components: JMS client
Affects Versions: 5.8.0, 5.7.0, 5.6.0
Environment: Windows Server 2008 R2
Reporter: Andrzej Więcław
I have an EAR that is deployed to Websphere 7.
It includes EJB module containing a couple of MDBs that are listening on Message Listener Port, pointing to connection factory and queue exposed by custom ActiveMQ JMS Provider.
ActiveMQ JMS Provider configuration script (JACL):
{code}
import sys
jmsProviderUrl = "tcp://x.x.x.x:61616"
# Retrieve cell name
cell = AdminControl.getCell()
scope = "Cell=" + cell
jmsProviderName = "ActiveMQ"
node = sys.argv[0]
server = sys.argv[1]
# ----------------
# Add JMS Provider
# ----------------
attributes = [["description", "ActiveMQ JMS Provider"], \
["propertySet", [["resourceProperties", [ \
[["name", "java.naming.connectionFactoryNames"], ["type", "java.lang.String"], ["value", "ConnectionFactory,XAConnectionFactory"]], \
[["name", "java.naming.queue.MXITEMIN"], ["type", "java.lang.String"], ["value", "MX.ITEM.IN"]] \
] \
]] \
]]
AdminJMS.createJMSProviderAtScope(scope, jmsProviderName, \
"org.apache.activemq.jndi.ActiveMQWASInitialContextFactory", \
jmsProviderUrl, attributes)
# ----------------------
# Add Connection Factory
# ----------------------
attributes = [["description", "ActiveMQ Queue Connection Factory"], \
["type", "UNIFIED"], \
["connectionPool", [ \
["connectionTimeout", "1800"], \
["maxConnections", "6"], \
["minConnections", "0"], \
["reapTime", "180"], \
["unusedTimeout", "1800"], \
["agedTimeout", "1800"], \
["purgePolicy", "EntirePool"] \
] \
], \
["sessionPool", [ \
["connectionTimeout", "1800"], \
["maxConnections", "1"], \
["minConnections", "0"], \
["reapTime", "10"], \
["unusedTimeout", "1800"], \
["agedTimeout", "1800"], \
["purgePolicy", "EntirePool"] \
] \
]]
AdminJMS.createGenericJMSConnectionFactoryAtScope(scope, jmsProviderName, "ACTIVEMQCF", \
"if/maximo/activemq/cf", "XAConnectionFactory", \
attributes)
# ----------------------
# Add Queues
# ----------------------
# 1. MX.ASSET.IN
attributes = [["description", "ActiveMQ ASSET Queue"], ["type", "QUEUE"]]
AdminJMS.createGenericJMSDestinationAtScope(scope, jmsProviderName, "MAXIMO04IN", \
"if/maximo/activemq/q04cin", "MXASSETIN", \
attributes)
# ---------------------------------------
# Create IF-server Message Listener Ports
# ---------------------------------------
# PORTMAXIMO01IN
attributes = [["description", "ActiveMQ Item"]]
AdminServerManagement.configureListenerPortForMessageListenerService(node, server, "PORTMAXIMO01IN", \
"if/maximo/activemq/cf", \
"if/maximo/activemq/q01cin", \
1, 5, 1, attributes)
{code}
MDB code:
{code}
public class MQQueueListener implements MessageListener, MessageDrivenBean {
protected MessageDrivenContext beanCtx;
public void setMessageDrivenContext(MessageDrivenContext ctx)
throws EJBException {
// Set the bean context.
beanCtx = ctx;
}
public void ejbCreate() throws EJBException {
[...]
}
public void ejbRemove() throws EJBException {
[...]
}
public void onMessage(Message message) {
[...]
try {
[...]
} catch (Exception e) {
// Rollback message to external queue.
beanCtx.setRollbackOnly();
}
}
}
{code}
When something goes wrong with the message processing and Exception is thrown regardless if beanCtx.setRollbackOnly(); is executed or not message is not returned back to the queue - it simply disappears.
The same applies if Exception is re-thrown as RuntimeException instead of beanCtx.setRollbackOnly() call.
------------------
Expected behavior:
------------------
Message that could not be processed is returned to the ActiveMQ queue and available for reprocessing (according to WebSphere reprocessing policy)
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira