MessageDrivenBean EJB2 vs. JBoss5

brauner1990

Bekanntes Mitglied
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

Bekanntes Mitglied
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.



Code:
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 { 
.....
.....
}

Code:
<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

Bekanntes Mitglied
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

Top Contributor
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

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

Bekanntes Mitglied
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:

Java:
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

Bekanntes Mitglied
Nach umschreiben der MDB bekomme ich nun folgende Ex

  • Code:
    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]
  • Java:
    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

Top Contributor
Ü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....
 

brauner1990

Bekanntes Mitglied
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
Code:
jboss.j2ee:*
auf
Code:
http://localhost:8080/jmx-console/

und wenn ich das via Tutorial - Variante 2: Zur Laufzeit mache, bekomme ich folgende "fehlerhafte" ausgabe
Code:
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?
 

brauner1990

Bekanntes Mitglied
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

Bekanntes Mitglied
Also ich bekomme die EX
Code:
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
 

Ähnliche Java Themen


Oben