Ami*_*iri 3 java spring rabbitmq spring-amqp
我正在尝试设置一个简单的Spring AMQP方案,但是收到以下错误:
Could not resolve method parameter at index 0 in method:
public void handleMessage(HelloMessage),
with 1 error(s): [Error in object 'msg': codes []; arguments [];
default message [@Payload param is required]]
Run Code Online (Sandbox Code Playgroud)
我不明白错误消息,我的印象是我可以使用任何POJO发送和接收消息,根据此处的文档.
这是一个非常简单的设置:
主要
public class Program {
private static ConfigurableApplicationContext applicationContext;
public static void main(String[] args) {
try {
startApp();
System.out.println("Running...");
System.in.read();
applicationContext.close();
System.out.println("Shutting down...");
}
catch (Throwable e) {
e.printStackTrace();
}
}
private static void startApp() {
applicationContext = new ClassPathXmlApplicationContext("/application-context.xml");
applicationContext.refresh();
MessageSender messageSender = applicationContext.getBean(MessageSender.class);
messageSender.sendMessage("hello", 1);
}
Run Code Online (Sandbox Code Playgroud)
应用程序的context.xml
<context:component-scan base-package="org.abiri.amqpTest" />
<rabbit:connection-factory id="connectionFactory"
host="localhost" port="5672"
username="guest" password="guest"/>
<rabbit:template id="amqpTemplate" connection-factory="connectionFactory"/>
<rabbit:admin connection-factory="connectionFactory"/>
<rabbit:queue name="hello"/>
<bean id="rabbitListenerContainerFactory"
class="org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="concurrentConsumers" value="3"/>
<property name="maxConcurrentConsumers" value="10"/>
</bean>
<rabbit:annotation-driven container-factory="rabbitListenerContainerFactory"/>
<rabbit:listener-container connection-factory="connectionFactory" />
Run Code Online (Sandbox Code Playgroud)
messageSender,和
@Service
public class MessageSender {
@Autowired
private AmqpTemplate amqpTemplate;
// Accessors...
public void sendMessage(String message, Integer sillyNumber) {
amqpTemplate.convertAndSend("hello",
new HelloMessage(message, sillyNumber));
}
}
Run Code Online (Sandbox Code Playgroud)
消息监听
@Component
public class MessageListener {
@RabbitListener(queues = "hello")
public void handleMessage(HelloMessage msg) {
out.println(format("Received message: %s with silly number: %d",
msg.getMessage(), msg.getSillyNumber()));
}
}
Run Code Online (Sandbox Code Playgroud)
HelloMessage
public class HelloMessage {
private String message;
private Integer sillyNumber;
// Empty constructor, full constructor and accessors
}
Run Code Online (Sandbox Code Playgroud)
我能够验证消息确实已发送并且在队列中:
RabbitMQ默认通过自制软件安装.
你的问题很简单!
要通过RabbitMQ默认发送任何Java对象,SimpleMessageConverter
您必须将您的类标记为Serializable
:
public class HelloMessage implements Serializable {
....
}
Run Code Online (Sandbox Code Playgroud)
当然,listener
应用程序应该在其CLASSPATH中具有相同的类,以具有deserialize
byte[]
从payload
(AMQP消息体)到适当HelloMessage
对象的能力.
归档时间: |
|
查看次数: |
3406 次 |
最近记录: |