eclipse中的JavaEE项目文件夹结构?
我是JavaEE编程新手。我正在尝试使用JavaEE在Eclipse中编写JMS发送器。我已经创建了一个新的JavaEE项目,现在我的疑问是什么是文件夹结构以及在哪里编写JMS发送者Java文件eclipse中的JavaEE项目文件夹结构?,java,eclipse,jakarta-ee,jboss,jms,Java,Eclipse,Jakarta Ee,Jboss,Jms,我是JavaEE编程新手。我正在尝试使用JavaEE在Eclipse中编写JMS发送器。我已经创建了一个新的JavaEE项目,现在我的疑问是什么是文件夹结构以及在哪里编写JMS发送者Java文件 我使用JBoss作为代理。我的要求是,我必须使用这个JMS发送方应用程序将消息推送到JMS队列。首先,您需要编写一个MDB(消息驱动bean)来使用JMS消息。为了清楚起见,我将给出一个小例子 @MessageDriven(activationConfig = { @ActivationConf
我使用JBoss作为代理。我的要求是,我必须使用这个JMS发送方应用程序将消息推送到JMS队列。首先,您需要编写一个MDB(消息驱动bean)来使用JMS消息。为了清楚起见,我将给出一个小例子
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/offlinemsg"),
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge") })
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public class MessageHandlerMDB implements MessageListener {
private static final Logger log = Logger.getLogger(MessageHandlerMDB.class);
@Override
public void onMessage(Message message) {
log.info("Message received in MessageHandlerMDB");
}
}
在部署应用程序时,服务器将根据注释识别消息驱动bean,并为您创建一个队列。然后,您可以像往常一样通过ConnectionFactory将消息发送到此队列。如果您通过Jboss中的同一应用程序发送消息,那么您可以编写以下代码:
private void sendObjectToQueue(Serializable object) {
Session session = null;
MessageProducer sender = null;
Connection connect = null;
if (logger.isDebugEnabled()) {
logger.debug("Entered sendObjectToQueue(" + object.getClass());
}
try {
Context context = new InitialContext();
ConnectionFactory factory = (ConnectionFactory) context
.lookup("ConnectionFactory");
Queue queue = (Queue) context.lookup("queue/offlinemsg");
connect = factory.createConnection();
session = connect.createSession(false,
Session.AUTO_ACKNOWLEDGE);
sender = session.createProducer(queue);
ObjectMessage message = session.createObjectMessage();
message.setObject(object);
sender.send(message);
sender.close();
connect.close();
if (logger.isDebugEnabled()) {
logger.debug("The " + object.getClass() + " object was sent to jms queue");
}
} catch (JMSException e) {
logger.error("Sending object to queue failed", e);
} catch (Exception e) {
logger.error("Sending object to queue failed", e);
} finally {
if (sender != null) {
try {
sender.close();
if (logger.isDebugEnabled()) {
logger.debug("Closed jms session");
}
} catch (JMSException e) {
logger.error("Closing jms session failed", e);
}
}
if (connect != null) {
try {
connect.close();
if (logger.isDebugEnabled()) {
logger.debug("Closed jms session");
}
} catch (Exception e) {
logger.error("Closing jms session failed", e);
}
}
if (session != null) {
try {
session.close();
if (logger.isDebugEnabled()) {
logger.debug("Closed jms session");
}
} catch (Exception e) {
logger.error("Closing jms session failed", e);
}
}
}
}
如果您需要进一步澄清,请告诉我。希望这有帮助
已编辑*
如果您是从普通java类调用,则需要以下代码(注意,这是JBoss特有的)
请注意,您应该将连接创建和会话创建重用为最佳实践…@Dinu:非常感谢您澄清我的疑问。创建EJB项目后,我得到了两个项目。一个是EJB,另一个是EJBClinet。我可以在EJBClinet项目中编写这段代码吗?嗨,Rajesh,我已经编辑了我的文章,展示了如何从普通java客户端调用。您可以在EJB客户机项目中包含代码的最后一部分,也可以在服务器上部署EJB项目中的第一个代码片段部分。
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
env.put(Context.PROVIDER_URL, "jnp://localhost:1099");
env.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
Context ctx = new InitialContext(env);
ConnectionFactory cf = (ConnectionFactory)ctx.lookup("/ConnectionFactory");
Queue queue = (Queue)ic.lookup("/queues/MyQueue");
Connection connection = cf.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer producer = session.createProducer(queue);
connection.start();
TextMessage message = session.createTextMessage("Test");
producer.send(message);