我正在尝试使用AMQP
1.0连接到ActiveMQ代理,但是我想在我的应用程序代码中使用JMS。我对使用JMS感兴趣,主要是因为我希望开发人员能够使用他们已经熟悉的API。
我有在本地主机上运行的ActiveMQ 5.14.0和以下代码:
public static void main(String[] args) throws JMSException, InterruptedException {
Connection connection = null;
try {
// Producer
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("amqp://localhost:5672");
connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
Topic topic = session.createTopic("customerTopic");
// Publish
MessageProducer producer = session.createProducer(topic);
for ( int i = 0; i < 10; i++) {
Message msg = session.createTextMessage("Task : " + i);
producer.send(msg);
}
session.close();
} finally {
if (connection != null) {
connection.close();
}
}
}
代码总是以相同的方式失败,并且在stacktrace中具有以下根本原因:
Caused by: org.apache.activemq.transport.InactivityIOException: Channel was inactive for too (>30000) long: tcp://127.0.0.1:5672
这发生在connection.start()
方法调用上。
如果我对ActiveMQ tcp端点运行相同的代码,则它将按预期执行。
我的pom文件依赖关系如下(并且我怀疑这是问题的根源,因为我发现很难遵循依赖关系的文档)
<dependencies>
<dependency>
<groupId>org.apache.qpid</groupId>
<artifactId>qpid-amqp-1-0-client-jms</artifactId>
<version>0.32</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-amqp</artifactId>
<version>5.14.0</version>
</dependency>
</dependencies>
我的直接问题是“为什么不起作用?”。
我的补充(基于观点)问题是“尝试使用AMQP 1.0之上的JMS抽象值得吗,还是我应该放弃学习提供商特定的API?”
最好与jndi合作
public static void main(String[] args) throws JMSException, InterruptedException, NamingException {
Connection connection = null;
try {
Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.qpid.jms.jndi.JmsInitialContextFactory");
props.setProperty("connectionfactory.myFactoryLookup",
"amqp://localhost:5672");
props.put("topic." + "MyTOPIC", "customerTopic");
InitialContext ic = new InitialContext(props);
ConnectionFactory cf1 = (ConnectionFactory) ic.lookup("myFactoryLookup");
Topic topic = (Topic) ic.lookup("MyTOPIC");
connection = cf1.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer producer = session.createProducer(topic);
connection.start();
for (int i = 0; i < 10; i++) {
Message msg = session.createTextMessage("Task : " + i);
producer.send(msg);
}
session.close();
} finally {
if (connection != null) {
connection.close();
}
}
}
更换
<dependency>
<groupId>org.apache.qpid</groupId>
<artifactId>qpid-amqp-1-0-client-jms</artifactId>
<version>0.32</version>
</dependency>
通过
<dependency>
<groupId>org.apache.qpid</groupId>
<artifactId>qpid-jms-client</artifactId>
<version>0.9.0</version>
</dependency>
在经纪人方面,您需要添加:
<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?transport.transformer=jms"/>
参考http://activemq.apache.org/amqp.html
问题内容: 我不明白“无法访问的代码”是什么意思? 在我的代码的最后一行中,它表示无法访问的代码。 } 问题答案: 这里的循环: 解析为,因为从未修改过的值。因此,(在您的情况下)之后出现的任何代码均被视为 无法访问 。
问题内容: 有时,当您调试时,会有无法访问的代码片段。无论如何,有没有抑制警告? 问题答案: 在任何编译器上执行此操作的唯一方法是。 如果您使用的是Eclipse,请尝试。
问题内容: 我在Eclipse中尝试了以下方法: :警告“死代码” :编译错误“无法访问的代码” 我想知道这种差异是否存在真正的“原因”。我已经找到了… …但是为什么不允许相同的调试目的? 问题答案: 在上可达代码JLS部分解释了理由。本质上,Java通常不应该像C常规那样使用条件编译,但是在某些情况下(例如调试,尤其是向后二进制兼容性),需要允许编译器完全剥离代码,因此特定的结构为此被允许。
我在Eclipse中尝试了以下操作: :警告“死码” while(false){}:编译错误“无法访问代码” 我想知道这种差异是否有真正的“原因”。我已经找到这个。。。 无法访问的代码编译器错误 ...但是为什么不允许用于相同的调试目的呢?
问题内容: 我似乎找不到解决此问题的方法。我正在做的是声明一个整数,它告诉我代码不可访问。 问题答案: 一旦使用方法,您将返回到首先调用该方法的方法。返回后放置的任何语句都是没有意义的,因为那是在不严重违反程序计数器的情况下无法到达的代码(在Java中可能是不可能的)。
问题 你有一些C函数已经被编译到共享库或DLL中。你希望可以使用纯Python代码调用这些函数, 而不用编写额外的C代码或使用第三方扩展工具。 解决方案 对于需要调用C代码的一些小的问题,通常使用Python标准库中的 ctypes 模块就足够了。 要使用 ctypes ,你首先要确保你要访问的C代码已经被编译到和Python解释器兼容 (同样的架构、字大小、编译器等)的某个共享库中了。 为了进行