我一直关注this tutorial以了解JMS& Glassfish的作品。而不是使用Netbeans,我一直在使用Eclipse(Juno)并通过命令行成功运行应用程序(Producer,Synchconsumer,AsynchConsumer等):生成器appclient -client nameOFJarFile typeOfMessage numberOfMessages
和appclient -client nameOFJarFile typeOfMessage
消费者。
我试图让这一切在Eclipse中工作,这样我就可以逐步完成代码,看看事情是如何更好地工作的(因为我希望为我将要构建的JMS应用程序执行此操作),但我无法让这些教程文件“正确”显示并在Eclipse中运行。
通过正确显示,我的意思是:我已将simple
父项目导入Eclipse并导航并打开.java文件。我设置IDE的方式,每个保留字/变量/其他一切都应该以不同的颜色显示:
它显示的方式只显示保留字和字符串,告诉我出错了,但我不确定是什么:
我在Eclipse中运行Glassfish服务器,但是当我单击“运行”按钮并转到“运行方式”时,没有选项可以在Glassfish服务器上运行该文件。相反,默认选项是将父项目 simple
作为Maven构建运行:
如何将这些应用程序配置为“正确”显示并在Eclipse IDE的控制台中运行,就像我键入了appclient -client synchconsumer.jar queue
一样?
答案 0 :(得分:1)
所以你有几个问题。一个大的和一个小的。
首先是大人物。教程示例是一个appclient。所以你能做的就是创造一个独立的立场。首先创建一个新的Maven项目。您需要附加javaee-api
依赖项
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
</dependency>
从那里开始,您需要更多的依赖项才能将glassfish和jms用于独立应用程序。
<dependency>
<groupId>org.glassfish.main.appclient</groupId>
<artifactId>gf-client</artifactId>
<version>4.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.mq</groupId>
<artifactId>imqjmsra</artifactId>
<version>5.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.mq</groupId>
<artifactId>imqbroker</artifactId>
<version>5.0</version>
</dependency>
这些依赖项有很多子依赖项,因此下载可能需要一段时间。不过,为了将来的发展,你会感到高兴。依赖关系也适用于EJB查找。而不是将JNDI名称传递给lookup()
,如下所示,只需传递会话bean的完全限定类名。
所以现在小问题。本教程中的程序旨在从命令行运行。你可以做一些简单的调整。只需复制程序(我将使用Producer类启动你)并进行一些更改。
删除@Resource
注释。相反,您将使用javax.naming.InitialContext
来查找目录。最终代码将如下所示(假设您已经创建了从命令行运行程序所需的管理对象,正如您所说的那样)
我刚刚对NUM_MSGS
和desType
进行了硬编码。
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSContext;
import javax.jms.JMSRuntimeException;
import javax.jms.Queue;
import javax.jms.Topic;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class Producer {
private static ConnectionFactory connectionFactory;
private static Queue queue;
private static Topic topic;
public static void main(String[] args) throws NamingException {
final int NUM_MSGS = 10;
InitialContext ic = new InitialContext();
connectionFactory = (ConnectionFactory)ic.lookup("java:comp/DefaultJMSConnectionFactory");
queue = (Queue)ic.lookup("jms/MyQueue");
topic = (Topic)ic.lookup("jms/MyTopic");
String destType = "queue";
System.out.println("Destination type is " + destType);
if (!(destType.equals("queue") || destType.equals("topic"))) {
System.err.println("Argument must be \"queue\" or " + "\"topic\"");
System.exit(1);
}
Destination dest = null;
try {
if (destType.equals("queue")) {
dest = (Destination) queue;
} else {
dest = (Destination) topic;
}
} catch (JMSRuntimeException e) {
System.err.println("Error setting destination: " + e.toString());
System.exit(1);
}
try (JMSContext context = connectionFactory.createContext();) {
int count = 0;
for (int i = 0; i < NUM_MSGS; i++) {
String message = "This is message " + (i + 1)
+ " from producer";
// Comment out the following line to send many messages
System.out.println("Sending message: " + message);
context.createProducer().send(dest, message);
count += 1;
}
System.out.println("Text messages sent: " + count);
context.createProducer().send(dest, context.createMessage());
// Uncomment the following line if you are sending many messages
// to two synchronous consumers
// context.createProducer().send(dest, context.createMessage());
} catch (JMSRuntimeException e) {
System.err.println("Exception occurred: " + e.toString());
System.exit(1);
}
System.exit(0);
}
}
Credited Links(帮助我解决你遇到的同样问题)
https://glassfish.java.net/javaee5/ejb/EJB_FAQ.html#StandaloneRemoteEJB
With which maven dependencies can i create a standalone JMS client for Glassfish?
好运!