# MessageDrivenBean EJB2 vs. JBoss5



## brauner1990 (24. Jul 2012)

Moin Leute,

---Projektumriss---

also ich darf ja ein Projekt cleanen, also ein früher genutztes Framework rausschmeißen zur besseren Wartbarkeit. Gleichzeitig soll ich von JBoss4 auf Jboss5 Upgraden. Im darauffolgenden Schritt (bei leerlauf) wird es auch noch auf EJB3 gehoben.

---Mein Fehler---

Auf dem Jboss4 läuft die MDB sauber und ohne Probleme, auf JBoss5 lässt sie sich nicht deployen ...

Hattet ihr schon solche Fehler, bzw. kennt ihr Lösungen?


Das WWW hilft mir nicht wirklich weiter...

Mfg


----------



## F.S.WhiTeY (24. Jul 2012)

Moin,

vieleicht mag der Jboss ja einfach die EJB 2.0 Conformitäten nicht. Mach dir doch mal den Spaß und schreibt die MDB auf EJB 3.0 um. Mit Annotationen und den dazugehörigen bounds in den Config-Dateien.




```
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;

import javax.jms.JMSException;
import javax.jms.Message;

import javax.jms.MessageListener;

@MessageDriven(activationConfig = {
        @ActivationConfigProperty(propertyName = “destinationType”, propertyValue = “javax.jms.Queue”),
        @ActivationConfigProperty(propertyName = “destination”, propertyValue = “queue/NAME”) })

public class Wieauchimmer implements MessageListener { 
.....
.....
}
```


```
<deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:jboss:bean-deployer bean-deployer_1_0.xsd" xmlns="urn:jboss:bean-deployer">
<bean name="jboss.mq.destination:service=Queue,name=NAME" class="org.jboss.mq.kernel.Queue">
<property name="destinationManagerPojo">
<inject bean="jboss.mq:service=DestinationManager"/>
</property>
<property name="initialContextProperties">
<inject bean="InitialContextProperties"/>
</property>
<property name="destinationName">
NAME
</property>
</bean>
<bean name="jboss.mq.destination:service=Topic,name=NAME" class="org.jboss.mq.kernel.Topic">
<property name="destinationManagerPojo">
<inject bean="jboss.mq:service=DestinationManager"/>
</property>
<property name="initialContextProperties">
<inject bean="InitialContextProperties"/>
</property>
<property name="destinationName">
NAME
</property>
</bean>
</deployment>
```


----------



## brauner1990 (25. Jul 2012)

First of all - Danke @F.S.WhiTeY

Also die Idee hatte ich auch schon, war auch bereits gestern soweit gekommen, nun muss ich nur noch die Bean "switchen". Ich schrieb gestern eine EJB3 MDB und die funktionierte auch im "EJB2-Projekt". Ich muss nun noch gucken das ich die Inhalte einfach konvertiert bekomme und die Bean über die entsprechenden JNDI-Einträge verfügen lassen.


----------



## FArt (25. Jul 2012)

brauner1990 hat gesagt.:


> Moin Leute,
> 
> ---Projektumriss---
> 
> ...


 
Ohne Fehlermeldung und Deploymentdeskriptor lässt sich nur raten.
Hinweis: JMS wurde von JBoss 4 auf JBoss 5 von JBossMQ auf JBoss Messaging umgestellt. Zumindes die Queue-Definitionen sehen jetzt anders aus.


----------



## brauner1990 (25. Jul 2012)

FArt hat gesagt.:


> Ohne Fehlermeldung und Deploymentdeskriptor lässt sich nur raten.
> Hinweis: JMS wurde von JBoss 4 auf JBoss 5 von JBossMQ auf JBoss Messaging umgestellt. Zumindes die Queue-Definitionen sehen jetzt anders aus.



Ich habe folgende Dateien die ich für Deploymentdeskriptor nutze (soweit ich die Struktur verstehe [Projekt wurde so übernommen])

beans.xml
[XML]
<beangroup>
	<bean name="jboss.mq.destination:service=Queue,name=QueueJobStarterEJB3Bean" class="org.jboss.mq.kernel.Queue">
		<property name="destinationManagerPojo">
			<inject bean="jboss.mq:service=DestinationManager" />
		</property>
		<property name="initialContextProperties">
			<inject bean="InitialContextProperties" />
		</property>
		<property name="destinationName">
			QueueJobStarterEJB3Bean
		</property>
	</bean>
</beangroup>
[/XML]

ejb-jar.xml
[XML]
<ejb-jar>
	<description>noneDescription</description>
	<display-name>noneName</display-name>
	<enterprise-beans>
		<!-- Message Driven Beans -->
		<message-driven>
			<description></description>
			<ejb-name>QueueJobStarterEJB3Bean</ejb-name>
			<ejb-class>de.acardo.test.QueueJobStarterEJB3Bean</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>
		</message-driven>
	</enterprise-beans>
	<assembly-descriptor>
		<container-transaction>
			<method>
				<ejb-name>QueueJobStarterEJB3Bean</ejb-name>
				<method-name>*</method-name>
			</method>
			<trans-attribute>NotSupported</trans-attribute>
		</container-transaction>
	</assembly-descriptor>
</ejb-jar>
[/XML]

jboss.xml
[XML]
<enterprise-beans>
	<message-driven>
		<ejb-name>QueueJobStarterEJB3Bean</ejb-name>
		<destination-jndi-name>queue/QueueJobStarterEJB3Bean</destination-jndi-name>
	</message-driven>
</enterprise-beans>
[/XML]


Dies sind die betreffenden Auszüge aus den XMLs

Die Klasse sieht wie folgt aus:


```
package de.acardo.test;

import javax.ejb.ActivationConfigProperty;
import javax.ejb.EJBException;
import javax.ejb.MessageDriven;
import javax.ejb.MessageDrivenBean;
import javax.ejb.MessageDrivenContext;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;
import javax.jms.TextMessage;

import org.apache.log4j.Logger;
import org.jboss.ejb3.annotation.Depends;

/*
 * Diverse Bindungen fuer den interna Bereich
 */

@MessageDriven(activationConfig = {
		@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
		@ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/QueueJobStarterEJB3Bean"),
		@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
		@ActivationConfigProperty(propertyName = "", propertyValue = "") }, name = "QueueJobStarterEJB3Bean", description = "Dies ist die erneute Implementation der gleichen Bean in EJB3", mappedName = "queue/QueueJobStarterEJB3Bean")
@Depends("boss.mq.destination:service=Queue,name=QueueJobStarterEJB3Bean")
public class QueueJobStarterEJB3Bean implements MessageListener,
		MessageDrivenBean {

	/**
	 * 
	 */
	private static final long serialVersionUID = 5956028741586188799L;

	private MessageDrivenContext messageContext = null;

	private Logger log;

	public void onMessage(Message message) {
		System.out.println("Starte on message");
		try {
			if (message instanceof ObjectMessage) {
				//interna -- sry aber ist ja nicht von relevanc
			} else {
				this.log.warn("WRONG MESSAGEFORMAT:\n" + message);
			}
		} catch (Exception ex) {
			this.log.error(SystemProperties.getStackTrace(ex, 0));
		}
	}

	/**
	 * 
	 */
	public void ejbCreate() {
		this.log = Logger.getLogger(QueueJobStarterEJB3Bean.class);
	}

	/**
	 * 
	 */
	public void ejbRemove() throws EJBException {
		this.log = null;
		this.setMessageContext(null);
	}

	/**
	 * @param messageContext
	 *            the messageContext to set
	 */
	private void setMessageContext(MessageDrivenContext messageContext) {
		this.messageContext = messageContext;
	}

	/**
	 * gewuenst durch die Spec
	 */
	public QueueJobStarterEJB3Bean() {
		// TODO Auto-generated constructor stub
	}

	public void setMessageDrivenContext(MessageDrivenContext _messageContext)
			throws EJBException {
		this.setMessageContext(_messageContext);

	}
}
```

Auf Jboss4 läuft die ohne Murren, aber wenn ich die nach EJB3 und Jboss5 mirgieren will, wo sind dann die ansatzpunkte, irgendwie steh ich heute vor dem wald und seh die bäume nicht SRY


----------



## brauner1990 (25. Jul 2012)

Nach umschreiben der MDB bekomme ich nun folgende Ex



```
2:41:10,062 ERROR [JmsActivation] Unable to reconnect org.jboss.resource.adapter.jms.inflow.JmsActivationSpec@66b46b(ra=org.jboss.resource.adapter.jm
s.JmsResourceAdapter@1344339 destination=queue/QueueJobStarterEJB3Bean destinationType=javax.jms.Queue selector=* tx=true durable=false reconnect=10 p
rovider=DefaultJMSProvider user=null maxMessages=1 minSession=1 maxSession=15 keepAlive=30000 useDLQ=true DLQHandler=org.jboss.resource.adapter.jms.in
flow.dlq.GenericDLQHandler DLQJndiName=queue/DLQ DLQUser=null DLQMaxResent=10)
javax.naming.NameNotFoundException: QueueJobStarterEJB3Bean not bound
	at org.jnp.server.NamingServer.getBinding(NamingServer.java:771)
	at org.jnp.server.NamingServer.getBinding(NamingServer.java:779)
	at org.jnp.server.NamingServer.getObject(NamingServer.java:785)
	at org.jnp.server.NamingServer.lookup(NamingServer.java:443)
	at org.jnp.server.NamingServer.lookup(NamingServer.java:399)
	at sun.reflect.GeneratedMethodAccessor280.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
	at sun.rmi.transport.Transport$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.rmi.transport.Transport.serviceCall(Unknown Source)
	at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
	at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknown Source)
	at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source)
	at sun.rmi.server.UnicastRef.invoke(Unknown Source)
	at org.jnp.server.NamingServer_Stub.lookup(Unknown Source)
	at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:722)
	at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:682)
	at javax.naming.InitialContext.lookup(Unknown Source)
	at org.jboss.util.naming.Util.lookup(Util.java:222)
	at org.jboss.resource.adapter.jms.inflow.JmsActivation.setupDestination(JmsActivation.java:464)
	at org.jboss.resource.adapter.jms.inflow.JmsActivation.setup(JmsActivation.java:352)
	at org.jboss.resource.adapter.jms.inflow.JmsActivation.handleFailure(JmsActivation.java:292)
	at org.jboss.resource.adapter.jms.inflow.JmsActivation$SetupActivation.run(JmsActivation.java:733)
	at org.jboss.resource.work.WorkWrapper.execute(WorkWrapper.java:213)
	at org.jboss.util.threadpool.BasicTaskWrapper.run(BasicTaskWrapper.java:260)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
```

beans.xml[XML]
<bean name="jboss.mq.destination:service=Queue,name=QueueJobStarterEJB3Bean" class="org.jboss.mq.kernel.Queue">
	<property name="destinationManagerPojo">
		<inject bean="jboss.mq:service=DestinationManager" />
	</property>
	<property name="initialContextProperties">
		<inject bean="InitialContextProperties" />
	</property>
	<property name="destinationName">
		QueueJobStarterEJB3Bean
	</property>
</bean>
[/XML]
jboss.xml[XML]
<?xml version="1.0" encoding="UTF-8"?>
<jboss xmlns="http://www.jboss.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee  
                           http://www.jboss.org/j2ee/schema/jboss_5_0.xsd"
	version="3.0">
	<enterprise-beans>
		<message-driven>
			<ejb-name>QueueJobStarterEJB3Bean</ejb-name>
			<destination-jndi-name>local/QueueJobStarterEJB3Bean</destination-jndi-name>
			<!-- This will flag jboss to create the queue for you if it doesn’t already 
				exist. -->
			<create-destination>true</create-destination>
		</message-driven>
	</enterprise-beans>
</jboss>[/XML]
ejb-jar.xml[XML]
<container-transaction>
	<method>
		<ejb-name>QueueJobStarterEJB3Bean</ejb-name>
		<method-name>*</method-name>
	</method>
	<trans-attribute>NotSupported</trans-attribute>
</container-transaction>
[/XML]


```
import javax.annotation.Resource;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.Init;
import javax.ejb.MessageDriven;
import javax.ejb.MessageDrivenContext;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;
import org.apache.log4j.Logger;
import org.jboss.ejb3.annotation.Depends;

/**
 * Importe für Interne Verabeitung
 */

/**
 * 
 * @author mbrauner
 * 
 */
@MessageDriven(name = "QueueJobStarterEJB3Bean", activationConfig = {
		@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
		@ActivationConfigProperty(propertyName = "destination", propertyValue = "local/QueueJobStarterEJB3Bean"),
		@ActivationConfigProperty(propertyName = "ConnectionFactoryJndiName", propertyValue = "jms/XAQueueConnectionFactory"),
		@ActivationConfigProperty(propertyName = "DestinationName", propertyValue = "jms/QueueJobStarterEJB3Bean"),
		@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge") }, description = "Dies ist die erneute Implementation der gleichen Bean in EJB3", mappedName = "local/QueueJobStarterEJB3Bean")
public class QueueJobStarterEJB3Bean implements MessageListener {

	private static final Logger log = Logger
			.getLogger(QueueJobStarterEJB3Bean.class);
	@Resource
	private MessageDrivenContext context;

	/*
	 * muesste ja den String printen in die Serverconsole wenn die Bean initialisiert wird... und nur zu debugging zwecken eingebaut
	 */
	@Init
	public void nonsenseInit() {
		System.out				.println("muhahahah\nmuhahahah\nmuhahahah\nmuhahahah\nmuhahahah\nmuhahahah\nmuhahahah\nmuhahahah\nmuhahahah\nmuhahahah\nmuhahahah\nmuhahahah\nmuhahahah\nmuhahahah\nmuhahahah\nmuhahahah\nmuhahahah\nmuhahahah\nmuhahahah\nmuhahahah\nmuhahahah\nmuhahahah\nmuhahahah\nmuhahahah\nmuhahahah\nmuhahahah\nmuhahahah\nmuhahahah\nmuhahahah\nmuhahahah\nmuhahahah\nmuhahahah\nmuhahahah\n");
	}

	public void onMessage(Message message) {
		System.out.println("Starte on message");
		try {
			if (message instanceof ObjectMessage) {
				/**
				 * Interne Verabeitung
				 */
			} else {
				QueueJobStarterEJB3Bean.log.warn("WRONG MESSAGEFORMAT:\n"
						+ message);
			}
		} catch (Exception ex) {
			QueueJobStarterEJB3Bean.log.error(SystemProperties.getStackTrace(
					ex, 0));
		}
	}

	/**
	 * gewuenst durch die Spec
	 */
	public QueueJobStarterEJB3Bean() {
		// TODO Auto-generated constructor stub
	}
}
```


----------



## FArt (25. Jul 2012)

Überprüfe mittels der JMX-Console und dem JNDIView, ob dein EJB deployt ist und unter welchem JNDI Namen es angesprochen werden kann.

Ansonsten wird diese Injection nicht mehr funktionieren: jboss.mq:service=DestinationManager, denn das ist (wie man sehen kann) JBossMQ, genau wie jboss.mq.destination:service=Queue,name=QueueJobStarterEJB3Bean

Was ist erstere für eine Datei? Die EJB Deploymentdeskriptoren kenne ich ja....


----------



## FArt (25. Jul 2012)

Tipp:
Google mal "migrate jbossmq jboss messaging"


----------



## brauner1990 (25. Jul 2012)

Ausgabe hat gesagt.:
			
		

> binding=message-driven-bean,jndiName=local/QueueJobStarterEJB3Bean@1995548,plugin=invoker,service=EJB
> jndiName=local/QueueJobStarterEJB3Bean@1995548,plugin=pool,service=EJB
> jndiName=local/QueueJobStarterEJB3Bean@1995548,service=EJB



Dies ist die Anzeige-Ausgabe der JMX-Console via Filter 
	
	
	
	





```
jboss.j2ee:*
```
 auf 
	
	
	
	





```
http://localhost:8080/jmx-console/
```

und wenn ich das via Tutorial - Variante 2: Zur Laufzeit  mache, bekomme ich folgende "fehlerhafte" ausgabe 

```
java.lang.RuntimeException: Trying to install an already registered mbean: jboss.messaging.destination:service=Queue,name=QueueJobStarterEJB3Bean
```
also muss er die ja wirklich gebunden haben, nur wieso kann ich nicht drauf zugreifen?


----------



## FArt (25. Jul 2012)

Im JNDIView siehst du, was im JNDI gebunden ist, in welchem Scope und unter welchem Namen.


----------



## brauner1990 (25. Jul 2012)

Mittlerweile ist auch diese gebunden, ich weiß nicht wo ich wie gestellt habe, sry an alle die dies lesen, aber nun meint er irgend einen komischen fehler, den poste ich aber erst morgen früh wenn ich ihn bekomme ...


----------



## brauner1990 (26. Jul 2012)

Also ich bekomme die EX 
	
	
	
	





```
ERROR [main][org.jboss.jms.client.JBossConnectionFactory] - <Failed to download and/or install client side AOP stack>
```
 aber die werde ich in den Griff bekommen


----------

