如何在 JPOS QServer 侦听器中 @autowired spring bean?

How to @autowired spring beans in JPOS QServer listener?

我们正在 运行ning spring 启动应用程序。在 Spring 启动后,我们尝试 运行 JPOS QServer。它启动了 Q2,我们可以从模拟器 clinet 接收 ISOmsgs,我们也可以响应。

为了启动 Q2,我们使用了 xml 配置,如下所示。

<server class="org.jpos.q2.iso.QServer" name="Server-A-Server" logger="Q2">

<attr name="port" type="java.lang.Integer">8118</attr>
<attr name="maxSessions" type="java.lang.Integer">100</attr>
<attr name="minSessions" type="java.lang.Integer">0</attr>

<!-- Format server name: "Project Name" + "-" + "Channel" -->
<channel name="Server-A-Channel" class="org.jpos.iso.channel.XMLChannel" logger="Q2"
         packager="org.jpos.iso.packager.XMLPackager">
</channel>

<request-listener class="fi.neocard.jpos.ISOMessageListener">
    <property name="timeout" value="10000"/>
</request-listener>

正如你从上面的 xml 看到的,它监听 ISOMessangerListener class,这自然与 spring 无关 class,而且我认为 spring 和 QServer在不同的 Servlet 上 运行ning。所以问题来了,我们这里没有任何 Spring 相关的 bean,我们不能 @Autowired 任何。但是我们所有的业务逻辑都已经写在spring里面了。

到目前为止我们尝试了什么

1) 保持应用程序上下文静态并在 ISOMessageListener 中需要时使用它(在接收到侦听器的消息后上下文为空失败)。

2) 做这样的事情。 SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);

并阅读了很多关于如何从 spring 之外获取上下文的文章。

到目前为止,我通过 jvisualvm 确认 Q2 和 Springboot 都 运行ning 作为一个应用程序。

希望至少能得到一些建议。

如果有人对我的工作方式感兴趣,我只是在 spring 已经启动时手动完成,而不是 运行 ISOServer 通过 Q2(xml 文件)然后获取已经存在的 ISORequestListener bean 并将其传递给服务器。

@Component
public class ISOserver implements ISORequestListener {

@Autowired
ISOserver isOserver;

@EventListener(ContextRefreshedEvent.class)
public void contextRefreshedEvent() throws Exception{
    Logger logger = new Logger();
    logger.addListener(new SimpleLogListener(System.out));
    ServerChannel channel = new XMLChannel(new XMLPackager());
    ((LogSource) channel).setLogger(logger, "channel");
    ISOServer isoServer = new ISOServer(8118, channel, null);
    isoServer.setLogger(logger, "server");
    isoServer.addISORequestListener(isOserver);
    new Thread(isoServer).start();
}

@Override
public boolean process(ISOSource isoSource, ISOMsg receivedISOmsg) {

    return false;
}
}