Thanks Nigel
is there a way to achieve setting raname with annotations?
when and where would mappedName be used?
Martin ..
______________________________________________
Date: Tue, 26 Jun 2012 10:19:10 +0100
From: nigel.deakin_at_oracle.com
To: users_at_glassfish.java.net
Subject: Re: Trouble connecting MDB to external JMS destination
Hi Sean,
There's nothing in your MDB configuration to tell GlassFish to use
the IBM resource adapter.
The exception you're seeing is from ActiveJmsResourceAdapter - that
is because by default it's trying to use the built-in JMSRA resource
adapter to talk to GlassFish MQ, and you don't want that.
You need to configure the resource adapter in glassfish-ejb-jar.xml
(I don't think you can set this anywhere else)
<glassfish-ejb-jar>
<enterprise-beans>
<ejb>
<ejb-name>ejbname</ejb-name>
<mdb-resource-adapter>
<resource-adapter-mid>raname</resource-adapter-mid>
. . .
...where "raname" is the name of the resource adapter. This is the
name you'll have specified previously when you created the
connection factory and destination objects.
"ejbname" is the fully-qualified class name since you don't set
this using @MessageDriven(name="ejbname")
Don't set @MessageDriven(mappedName="...") - that's not used.
Nigel
On 25/06/2012 23:23, Comerford, Sean wrote:
Using GF 3.1 here.
I have a Websphere MQ connection pool and factory defined
on my GF instance using IBM's wmq.jmsra RAR.
I can publish using this simple servlet code below.
@Resource(mappedName = "jms/UTTopicFactory")
private TopicConnectionFactory
topicConnectionFactory;
@Resource(mappedName = "jms/UTTopic")
private Topic topic;
protected void processRequest(HttpServletRequest
request, HttpServletResponse response)
throws ServletException, IOException {
try {
String msgText =
request.getParameter("msgText");
sendToTopic(msgText);
} catch (Exception e) {
out.print(e.toString());
}
}
private void sendToTopic(String msgText) throws
Exception {
TopicConnection connection =
topicConnectionFactory.createTopicConnection();
TopicSession session =
connection.createTopicSession(false,
Session.AUTO_ACKNOWLEDGE);
MessageProducer messageProducer =
session.createProducer(topic);
TextMessage textMessage =
session.createTextMessage();
textMessage.setText(msgText);
messageProducer.send(textMessage,
DeliveryMode.PERSISTENT, TextMessage.DEFAULT_PRIORITY,
1000);
messageProducer.send(textMessage);
messageProducer.close();
session.close();
connection.close();
}
And I read from it using this simple servlet:
@Resource(mappedName = "jms/UTTopicFactory")
private TopicConnectionFactory
topicConnectionFactory;
@Resource(mappedName = "jms/UTTopic")
private Topic topic;
protected void
processRequest(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
out.write("Topic response = " +
readTopic());
} catch (Exception e) {
out.write("Error: " + e.getMessage());
e.printStackTrace();
} finally {
out.close();
}
}
private String readTopic() throws Exception {
String result = null;
TopicConnection connection =
topicConnectionFactory.createTopicConnection();
TopicSession session =
connection.createTopicSession(false,
Session.AUTO_ACKNOWLEDGE);
TopicSubscriber subscriber =
session.createDurableSubscriber(topic, "SEAN.TEST");
connection.start();
TextMessage textMessage = (TextMessage)
subscriber.receive(10000);
if (textMessage != null) {
System.out.println("Got " +
textMessage.getText());
result = "Retrieved message from topic:
" + textMessage.getText();
textMessage.acknowledge();
} else {
System.out.println("No messages in
topic");
result = "No messages in topic";
}
subscriber.close();
session.close();
connection.close();
return result;
}
My (possibly dumb) question is how do I create a MDB that
talks to the topic in the same way as the servlet above – by
just referencing the JNDI name. Tried this:
@MessageDriven(mappedName = "jms/UTTopic",
activationConfig = {
@ActivationConfigProperty(propertyName =
"acknowledgeMode", propertyValue =
"Auto-acknowledge"),
@ActivationConfigProperty(propertyName =
"destinationType", propertyValue = "javax.jms.Topic"),
@ActivationConfigProperty(propertyName =
"subscriptionDurability", propertyValue = "Durable"),
@ActivationConfigProperty(propertyName =
"clientId", propertyValue = "MyMDB"),
@ActivationConfigProperty(propertyName =
"subscriptionName", propertyValue = "SEAN.TEST")
})
public class MyMDB implements MessageListener {
public MyMDB() {
}
@Override
public void onMessage(Message message) {
}
}
But this won't deploy properly – yields:
SEVERE: Exception while loading the app : EJB
Container initialization error
com.sun.appserv.connectors.internal.api.ConnectorRuntimeException:
Could not find physical destination : null
at
com.sun.enterprise.connectors.jms.system.ActiveJmsResourceAdapter.getPhysicalDestinationFromConfiguration(ActiveJmsResourceAdapter.java:2068)
at
com.sun.enterprise.connectors.jms.system.ActiveJmsResourceAdapter.updateMDBRuntimeInfo(ActiveJmsResourceAdapter.java:1864)
at
com.sun.enterprise.connectors.inbound.ConnectorMessageBeanClient.setup(ConnectorMessageBeanClient.java:186)
at
com.sun.ejb.containers.MessageBeanContainer.<init>(MessageBeanContainer.java:205)
at
com.sun.ejb.containers.ContainerFactoryImpl.createContainer(ContainerFactoryImpl.java:121)
at
org.glassfish.ejb.startup.EjbApplication.loadContainers(EjbApplication.java:230)
at
org.glassfish.ejb.startup.EjbDeployer.load(EjbDeployer.java:290)
at
org.glassfish.ejb.startup.EjbDeployer.load(EjbDeployer.java:101)
at
org.glassfish.internal.data.ModuleInfo.load(ModuleInfo.java:186)
at
org.glassfish.internal.data.ApplicationInfo.load(ApplicationInfo.java:257)
at
com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:461)
at
com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:240)
at
org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:382)
at
com.sun.enterprise.v3.admin.CommandRunnerImpl$1.execute(CommandRunnerImpl.java:355)
at
com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:370)
at
com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1064)
at
com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1200(CommandRunnerImpl.java:96)
at
com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1244)
at
com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1232)
at
com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:459)
at
com.sun.enterprise.v3.admin.AdminAdapter.service(AdminAdapter.java:209)
at
com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:168)
at
com.sun.enterprise.v3.server.HK2Dispatcher.dispath(HK2Dispatcher.java:117)
at
com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:238)
at
com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:828)
at
com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:725)
at
com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1019)
at
com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
at
com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
at
com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
at
com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
at
com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
at
com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
at
com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
at
com.sun.grizzly.ContextTask.run(ContextTask.java:71)
at
com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
at
com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
at
java.lang.Thread.run(Thread.java:680)
Bear in mind the topic here is an EXTERNAL topic being
provided by the web sphere MQ resource adapter.
Any help?
---
Sean
Comerford
ESPN.com
Architecture & Platforms